mirror of
https://github.com/torvalds/linux.git
synced 2026-04-18 06:44:00 -04:00
kernfs: pass struct ns_common instead of const void * for namespace tags
kernfs has historically used const void * to pass around namespace tags used for directory-level namespace filtering. The only current user of this is sysfs network namespace tagging where struct net pointers are cast to void *. Replace all const void * namespace parameters with const struct ns_common * throughout the kernfs, sysfs, and kobject namespace layers. This includes the kobj_ns_type_operations callbacks, kobject_namespace(), and all sysfs/kernfs APIs that accept or return namespace tags. Passing struct ns_common is needed because various codepaths require access to the underlying namespace. A struct ns_common can always be converted back to the concrete namespace type (e.g., struct net) via container_of() or to_ns_common() in the reverse direction. This is a preparatory change for switching to ns_id-based directory iteration to prevent a KASLR pointer leak through the current use of raw namespace pointers as hash seeds and comparison keys. Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
@@ -127,7 +127,7 @@ static const struct kobj_type class_ktype = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
int class_create_file_ns(const struct class *cls, const struct class_attribute *attr,
|
int class_create_file_ns(const struct class *cls, const struct class_attribute *attr,
|
||||||
const void *ns)
|
const struct ns_common *ns)
|
||||||
{
|
{
|
||||||
struct subsys_private *sp = class_to_subsys(cls);
|
struct subsys_private *sp = class_to_subsys(cls);
|
||||||
int error;
|
int error;
|
||||||
@@ -143,7 +143,7 @@ int class_create_file_ns(const struct class *cls, const struct class_attribute *
|
|||||||
EXPORT_SYMBOL_GPL(class_create_file_ns);
|
EXPORT_SYMBOL_GPL(class_create_file_ns);
|
||||||
|
|
||||||
void class_remove_file_ns(const struct class *cls, const struct class_attribute *attr,
|
void class_remove_file_ns(const struct class *cls, const struct class_attribute *attr,
|
||||||
const void *ns)
|
const struct ns_common *ns)
|
||||||
{
|
{
|
||||||
struct subsys_private *sp = class_to_subsys(cls);
|
struct subsys_private *sp = class_to_subsys(cls);
|
||||||
|
|
||||||
|
|||||||
@@ -2570,15 +2570,14 @@ static void device_release(struct kobject *kobj)
|
|||||||
kfree(p);
|
kfree(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const void *device_namespace(const struct kobject *kobj)
|
static const struct ns_common *device_namespace(const struct kobject *kobj)
|
||||||
{
|
{
|
||||||
const struct device *dev = kobj_to_dev(kobj);
|
const struct device *dev = kobj_to_dev(kobj);
|
||||||
const void *ns = NULL;
|
|
||||||
|
|
||||||
if (dev->class && dev->class->namespace)
|
if (dev->class && dev->class->namespace)
|
||||||
ns = dev->class->namespace(dev);
|
return dev->class->namespace(dev);
|
||||||
|
|
||||||
return ns;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void device_get_ownership(const struct kobject *kobj, kuid_t *uid, kgid_t *gid)
|
static void device_get_ownership(const struct kobject *kobj, kuid_t *uid, kgid_t *gid)
|
||||||
|
|||||||
@@ -509,12 +509,13 @@ static int ib_device_uevent(const struct device *device,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const void *net_namespace(const struct device *d)
|
static const struct ns_common *net_namespace(const struct device *d)
|
||||||
{
|
{
|
||||||
const struct ib_core_device *coredev =
|
const struct ib_core_device *coredev =
|
||||||
container_of(d, struct ib_core_device, dev);
|
container_of(d, struct ib_core_device, dev);
|
||||||
|
struct net *net = read_pnet(&coredev->rdma_net);
|
||||||
|
|
||||||
return read_pnet(&coredev->rdma_net);
|
return net ? to_ns_common(net) : NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct class ib_class = {
|
static struct class ib_class = {
|
||||||
|
|||||||
@@ -43,6 +43,7 @@
|
|||||||
#include <linux/jiffies.h>
|
#include <linux/jiffies.h>
|
||||||
#include <linux/lockdep.h>
|
#include <linux/lockdep.h>
|
||||||
#include <linux/inet.h>
|
#include <linux/inet.h>
|
||||||
|
#include <net/net_namespace.h>
|
||||||
#include <rdma/ib_cache.h>
|
#include <rdma/ib_cache.h>
|
||||||
|
|
||||||
#include <linux/atomic.h>
|
#include <linux/atomic.h>
|
||||||
@@ -1048,7 +1049,7 @@ static void srp_remove_target(struct srp_target_port *target)
|
|||||||
scsi_remove_host(target->scsi_host);
|
scsi_remove_host(target->scsi_host);
|
||||||
srp_stop_rport_timers(target->rport);
|
srp_stop_rport_timers(target->rport);
|
||||||
srp_disconnect_target(target);
|
srp_disconnect_target(target);
|
||||||
kobj_ns_drop(KOBJ_NS_TYPE_NET, target->net);
|
kobj_ns_drop(KOBJ_NS_TYPE_NET, to_ns_common(target->net));
|
||||||
for (i = 0; i < target->ch_count; i++) {
|
for (i = 0; i < target->ch_count; i++) {
|
||||||
ch = &target->ch[i];
|
ch = &target->ch[i];
|
||||||
srp_free_ch_ib(target, ch);
|
srp_free_ch_ib(target, ch);
|
||||||
@@ -3713,7 +3714,7 @@ static ssize_t add_target_store(struct device *dev,
|
|||||||
|
|
||||||
target = host_to_target(target_host);
|
target = host_to_target(target_host);
|
||||||
|
|
||||||
target->net = kobj_ns_grab_current(KOBJ_NS_TYPE_NET);
|
target->net = to_net_ns(kobj_ns_grab_current(KOBJ_NS_TYPE_NET));
|
||||||
target->io_class = SRP_REV16A_IB_IO_CLASS;
|
target->io_class = SRP_REV16A_IB_IO_CLASS;
|
||||||
target->scsi_host = target_host;
|
target->scsi_host = target_host;
|
||||||
target->srp_host = host;
|
target->srp_host = host;
|
||||||
@@ -3905,7 +3906,7 @@ put:
|
|||||||
* earlier in this function.
|
* earlier in this function.
|
||||||
*/
|
*/
|
||||||
if (target->state != SRP_TARGET_REMOVED)
|
if (target->state != SRP_TARGET_REMOVED)
|
||||||
kobj_ns_drop(KOBJ_NS_TYPE_NET, target->net);
|
kobj_ns_drop(KOBJ_NS_TYPE_NET, to_ns_common(target->net));
|
||||||
scsi_host_put(target->scsi_host);
|
scsi_host_put(target->scsi_host);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -808,7 +808,7 @@ int __net_init bond_create_sysfs(struct bond_net *bn)
|
|||||||
sysfs_attr_init(&bn->class_attr_bonding_masters.attr);
|
sysfs_attr_init(&bn->class_attr_bonding_masters.attr);
|
||||||
|
|
||||||
ret = netdev_class_create_file_ns(&bn->class_attr_bonding_masters,
|
ret = netdev_class_create_file_ns(&bn->class_attr_bonding_masters,
|
||||||
bn->net);
|
to_ns_common(bn->net));
|
||||||
/* Permit multiple loads of the module by ignoring failures to
|
/* Permit multiple loads of the module by ignoring failures to
|
||||||
* create the bonding_masters sysfs file. Bonding devices
|
* create the bonding_masters sysfs file. Bonding devices
|
||||||
* created by second or subsequent loads of the module will
|
* created by second or subsequent loads of the module will
|
||||||
@@ -835,7 +835,7 @@ int __net_init bond_create_sysfs(struct bond_net *bn)
|
|||||||
/* Remove /sys/class/net/bonding_masters. */
|
/* Remove /sys/class/net/bonding_masters. */
|
||||||
void __net_exit bond_destroy_sysfs(struct bond_net *bn)
|
void __net_exit bond_destroy_sysfs(struct bond_net *bn)
|
||||||
{
|
{
|
||||||
netdev_class_remove_file_ns(&bn->class_attr_bonding_masters, bn->net);
|
netdev_class_remove_file_ns(&bn->class_attr_bonding_masters, to_ns_common(bn->net));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize sysfs for each bond. This sets up and registers
|
/* Initialize sysfs for each bond. This sets up and registers
|
||||||
|
|||||||
@@ -30,10 +30,11 @@
|
|||||||
static dev_t ipvtap_major;
|
static dev_t ipvtap_major;
|
||||||
static struct cdev ipvtap_cdev;
|
static struct cdev ipvtap_cdev;
|
||||||
|
|
||||||
static const void *ipvtap_net_namespace(const struct device *d)
|
static const struct ns_common *ipvtap_net_namespace(const struct device *d)
|
||||||
{
|
{
|
||||||
const struct net_device *dev = to_net_dev(d->parent);
|
const struct net_device *dev = to_net_dev(d->parent);
|
||||||
return dev_net(dev);
|
|
||||||
|
return to_ns_common(dev_net(dev));
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct class ipvtap_class = {
|
static struct class ipvtap_class = {
|
||||||
|
|||||||
@@ -35,10 +35,11 @@ struct macvtap_dev {
|
|||||||
*/
|
*/
|
||||||
static dev_t macvtap_major;
|
static dev_t macvtap_major;
|
||||||
|
|
||||||
static const void *macvtap_net_namespace(const struct device *d)
|
static const struct ns_common *macvtap_net_namespace(const struct device *d)
|
||||||
{
|
{
|
||||||
const struct net_device *dev = to_net_dev(d->parent);
|
const struct net_device *dev = to_net_dev(d->parent);
|
||||||
return dev_net(dev);
|
|
||||||
|
return to_ns_common(dev_net(dev));
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct class macvtap_class = {
|
static struct class macvtap_class = {
|
||||||
|
|||||||
@@ -313,7 +313,8 @@ struct kernfs_node *kernfs_get_parent(struct kernfs_node *kn)
|
|||||||
*
|
*
|
||||||
* Return: 31-bit hash of ns + name (so it fits in an off_t)
|
* Return: 31-bit hash of ns + name (so it fits in an off_t)
|
||||||
*/
|
*/
|
||||||
static unsigned int kernfs_name_hash(const char *name, const void *ns)
|
static unsigned int kernfs_name_hash(const char *name,
|
||||||
|
const struct ns_common *ns)
|
||||||
{
|
{
|
||||||
unsigned long hash = init_name_hash(ns);
|
unsigned long hash = init_name_hash(ns);
|
||||||
unsigned int len = strlen(name);
|
unsigned int len = strlen(name);
|
||||||
@@ -330,7 +331,7 @@ static unsigned int kernfs_name_hash(const char *name, const void *ns)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int kernfs_name_compare(unsigned int hash, const char *name,
|
static int kernfs_name_compare(unsigned int hash, const char *name,
|
||||||
const void *ns, const struct kernfs_node *kn)
|
const struct ns_common *ns, const struct kernfs_node *kn)
|
||||||
{
|
{
|
||||||
if (hash < kn->hash)
|
if (hash < kn->hash)
|
||||||
return -1;
|
return -1;
|
||||||
@@ -856,7 +857,7 @@ out_unlock:
|
|||||||
*/
|
*/
|
||||||
static struct kernfs_node *kernfs_find_ns(struct kernfs_node *parent,
|
static struct kernfs_node *kernfs_find_ns(struct kernfs_node *parent,
|
||||||
const unsigned char *name,
|
const unsigned char *name,
|
||||||
const void *ns)
|
const struct ns_common *ns)
|
||||||
{
|
{
|
||||||
struct rb_node *node = parent->dir.children.rb_node;
|
struct rb_node *node = parent->dir.children.rb_node;
|
||||||
bool has_ns = kernfs_ns_enabled(parent);
|
bool has_ns = kernfs_ns_enabled(parent);
|
||||||
@@ -889,7 +890,7 @@ static struct kernfs_node *kernfs_find_ns(struct kernfs_node *parent,
|
|||||||
|
|
||||||
static struct kernfs_node *kernfs_walk_ns(struct kernfs_node *parent,
|
static struct kernfs_node *kernfs_walk_ns(struct kernfs_node *parent,
|
||||||
const unsigned char *path,
|
const unsigned char *path,
|
||||||
const void *ns)
|
const struct ns_common *ns)
|
||||||
{
|
{
|
||||||
ssize_t len;
|
ssize_t len;
|
||||||
char *p, *name;
|
char *p, *name;
|
||||||
@@ -930,7 +931,8 @@ static struct kernfs_node *kernfs_walk_ns(struct kernfs_node *parent,
|
|||||||
* Return: pointer to the found kernfs_node on success, %NULL on failure.
|
* Return: pointer to the found kernfs_node on success, %NULL on failure.
|
||||||
*/
|
*/
|
||||||
struct kernfs_node *kernfs_find_and_get_ns(struct kernfs_node *parent,
|
struct kernfs_node *kernfs_find_and_get_ns(struct kernfs_node *parent,
|
||||||
const char *name, const void *ns)
|
const char *name,
|
||||||
|
const struct ns_common *ns)
|
||||||
{
|
{
|
||||||
struct kernfs_node *kn;
|
struct kernfs_node *kn;
|
||||||
struct kernfs_root *root = kernfs_root(parent);
|
struct kernfs_root *root = kernfs_root(parent);
|
||||||
@@ -956,7 +958,8 @@ EXPORT_SYMBOL_GPL(kernfs_find_and_get_ns);
|
|||||||
* Return: pointer to the found kernfs_node on success, %NULL on failure.
|
* Return: pointer to the found kernfs_node on success, %NULL on failure.
|
||||||
*/
|
*/
|
||||||
struct kernfs_node *kernfs_walk_and_get_ns(struct kernfs_node *parent,
|
struct kernfs_node *kernfs_walk_and_get_ns(struct kernfs_node *parent,
|
||||||
const char *path, const void *ns)
|
const char *path,
|
||||||
|
const struct ns_common *ns)
|
||||||
{
|
{
|
||||||
struct kernfs_node *kn;
|
struct kernfs_node *kn;
|
||||||
struct kernfs_root *root = kernfs_root(parent);
|
struct kernfs_root *root = kernfs_root(parent);
|
||||||
@@ -1079,7 +1082,8 @@ struct kernfs_node *kernfs_root_to_node(struct kernfs_root *root)
|
|||||||
struct kernfs_node *kernfs_create_dir_ns(struct kernfs_node *parent,
|
struct kernfs_node *kernfs_create_dir_ns(struct kernfs_node *parent,
|
||||||
const char *name, umode_t mode,
|
const char *name, umode_t mode,
|
||||||
kuid_t uid, kgid_t gid,
|
kuid_t uid, kgid_t gid,
|
||||||
void *priv, const void *ns)
|
void *priv,
|
||||||
|
const struct ns_common *ns)
|
||||||
{
|
{
|
||||||
struct kernfs_node *kn;
|
struct kernfs_node *kn;
|
||||||
int rc;
|
int rc;
|
||||||
@@ -1221,7 +1225,7 @@ static struct dentry *kernfs_iop_lookup(struct inode *dir,
|
|||||||
struct kernfs_node *kn;
|
struct kernfs_node *kn;
|
||||||
struct kernfs_root *root;
|
struct kernfs_root *root;
|
||||||
struct inode *inode = NULL;
|
struct inode *inode = NULL;
|
||||||
const void *ns = NULL;
|
const struct ns_common *ns = NULL;
|
||||||
|
|
||||||
root = kernfs_root(parent);
|
root = kernfs_root(parent);
|
||||||
down_read(&root->kernfs_rwsem);
|
down_read(&root->kernfs_rwsem);
|
||||||
@@ -1702,7 +1706,7 @@ bool kernfs_remove_self(struct kernfs_node *kn)
|
|||||||
* Return: %0 on success, -ENOENT if such entry doesn't exist.
|
* Return: %0 on success, -ENOENT if such entry doesn't exist.
|
||||||
*/
|
*/
|
||||||
int kernfs_remove_by_name_ns(struct kernfs_node *parent, const char *name,
|
int kernfs_remove_by_name_ns(struct kernfs_node *parent, const char *name,
|
||||||
const void *ns)
|
const struct ns_common *ns)
|
||||||
{
|
{
|
||||||
struct kernfs_node *kn;
|
struct kernfs_node *kn;
|
||||||
struct kernfs_root *root;
|
struct kernfs_root *root;
|
||||||
@@ -1741,7 +1745,7 @@ int kernfs_remove_by_name_ns(struct kernfs_node *parent, const char *name,
|
|||||||
* Return: %0 on success, -errno on failure.
|
* Return: %0 on success, -errno on failure.
|
||||||
*/
|
*/
|
||||||
int kernfs_rename_ns(struct kernfs_node *kn, struct kernfs_node *new_parent,
|
int kernfs_rename_ns(struct kernfs_node *kn, struct kernfs_node *new_parent,
|
||||||
const char *new_name, const void *new_ns)
|
const char *new_name, const struct ns_common *new_ns)
|
||||||
{
|
{
|
||||||
struct kernfs_node *old_parent;
|
struct kernfs_node *old_parent;
|
||||||
struct kernfs_root *root;
|
struct kernfs_root *root;
|
||||||
@@ -1832,7 +1836,7 @@ static int kernfs_dir_fop_release(struct inode *inode, struct file *filp)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct kernfs_node *kernfs_dir_pos(const void *ns,
|
static struct kernfs_node *kernfs_dir_pos(const struct ns_common *ns,
|
||||||
struct kernfs_node *parent, loff_t hash, struct kernfs_node *pos)
|
struct kernfs_node *parent, loff_t hash, struct kernfs_node *pos)
|
||||||
{
|
{
|
||||||
if (pos) {
|
if (pos) {
|
||||||
@@ -1867,7 +1871,7 @@ static struct kernfs_node *kernfs_dir_pos(const void *ns,
|
|||||||
return pos;
|
return pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct kernfs_node *kernfs_dir_next_pos(const void *ns,
|
static struct kernfs_node *kernfs_dir_next_pos(const struct ns_common *ns,
|
||||||
struct kernfs_node *parent, ino_t ino, struct kernfs_node *pos)
|
struct kernfs_node *parent, ino_t ino, struct kernfs_node *pos)
|
||||||
{
|
{
|
||||||
pos = kernfs_dir_pos(ns, parent, ino, pos);
|
pos = kernfs_dir_pos(ns, parent, ino, pos);
|
||||||
@@ -1889,7 +1893,7 @@ static int kernfs_fop_readdir(struct file *file, struct dir_context *ctx)
|
|||||||
struct kernfs_node *parent = kernfs_dentry_node(dentry);
|
struct kernfs_node *parent = kernfs_dentry_node(dentry);
|
||||||
struct kernfs_node *pos = file->private_data;
|
struct kernfs_node *pos = file->private_data;
|
||||||
struct kernfs_root *root;
|
struct kernfs_root *root;
|
||||||
const void *ns = NULL;
|
const struct ns_common *ns = NULL;
|
||||||
|
|
||||||
if (!dir_emit_dots(file, ctx))
|
if (!dir_emit_dots(file, ctx))
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -1045,7 +1045,7 @@ struct kernfs_node *__kernfs_create_file(struct kernfs_node *parent,
|
|||||||
umode_t mode, kuid_t uid, kgid_t gid,
|
umode_t mode, kuid_t uid, kgid_t gid,
|
||||||
loff_t size,
|
loff_t size,
|
||||||
const struct kernfs_ops *ops,
|
const struct kernfs_ops *ops,
|
||||||
void *priv, const void *ns,
|
void *priv, const struct ns_common *ns,
|
||||||
struct lock_class_key *key)
|
struct lock_class_key *key)
|
||||||
{
|
{
|
||||||
struct kernfs_node *kn;
|
struct kernfs_node *kn;
|
||||||
|
|||||||
@@ -97,7 +97,7 @@ struct kernfs_super_info {
|
|||||||
* instance. If multiple tags become necessary, make the following
|
* instance. If multiple tags become necessary, make the following
|
||||||
* an array and compare kernfs_node tag against every entry.
|
* an array and compare kernfs_node tag against every entry.
|
||||||
*/
|
*/
|
||||||
const void *ns;
|
const struct ns_common *ns;
|
||||||
|
|
||||||
/* anchored at kernfs_root->supers, protected by kernfs_rwsem */
|
/* anchored at kernfs_root->supers, protected by kernfs_rwsem */
|
||||||
struct list_head node;
|
struct list_head node;
|
||||||
|
|||||||
@@ -345,7 +345,7 @@ static int kernfs_set_super(struct super_block *sb, struct fs_context *fc)
|
|||||||
*
|
*
|
||||||
* Return: the namespace tag associated with kernfs super_block @sb.
|
* Return: the namespace tag associated with kernfs super_block @sb.
|
||||||
*/
|
*/
|
||||||
const void *kernfs_super_ns(struct super_block *sb)
|
const struct ns_common *kernfs_super_ns(struct super_block *sb)
|
||||||
{
|
{
|
||||||
struct kernfs_super_info *info = kernfs_info(sb);
|
struct kernfs_super_info *info = kernfs_info(sb);
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
#include <linux/netdevice.h>
|
#include <linux/netdevice.h>
|
||||||
#include <linux/string.h>
|
#include <linux/string.h>
|
||||||
#include <linux/nfs_fs.h>
|
#include <linux/nfs_fs.h>
|
||||||
|
#include <net/net_namespace.h>
|
||||||
#include <linux/rcupdate.h>
|
#include <linux/rcupdate.h>
|
||||||
#include <linux/lockd/lockd.h>
|
#include <linux/lockd/lockd.h>
|
||||||
|
|
||||||
@@ -127,9 +128,10 @@ static void nfs_netns_client_release(struct kobject *kobj)
|
|||||||
kfree(rcu_dereference_raw(c->identifier));
|
kfree(rcu_dereference_raw(c->identifier));
|
||||||
}
|
}
|
||||||
|
|
||||||
static const void *nfs_netns_client_namespace(const struct kobject *kobj)
|
static const struct ns_common *nfs_netns_client_namespace(const struct kobject *kobj)
|
||||||
{
|
{
|
||||||
return container_of(kobj, struct nfs_netns_client, kobject)->net;
|
return to_ns_common(container_of(kobj, struct nfs_netns_client,
|
||||||
|
kobject)->net);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct kobj_attribute nfs_netns_client_id = __ATTR(identifier,
|
static struct kobj_attribute nfs_netns_client_id = __ATTR(identifier,
|
||||||
@@ -156,9 +158,10 @@ static void nfs_netns_object_release(struct kobject *kobj)
|
|||||||
kfree(c);
|
kfree(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const void *nfs_netns_namespace(const struct kobject *kobj)
|
static const struct ns_common *nfs_netns_namespace(const struct kobject *kobj)
|
||||||
{
|
{
|
||||||
return container_of(kobj, struct nfs_netns_client, nfs_net_kobj)->net;
|
return to_ns_common(container_of(kobj, struct nfs_netns_client,
|
||||||
|
nfs_net_kobj)->net);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct kobj_type nfs_netns_object_type = {
|
static struct kobj_type nfs_netns_object_type = {
|
||||||
@@ -350,9 +353,10 @@ static void nfs_sysfs_sb_release(struct kobject *kobj)
|
|||||||
/* no-op: why? see lib/kobject.c kobject_cleanup() */
|
/* no-op: why? see lib/kobject.c kobject_cleanup() */
|
||||||
}
|
}
|
||||||
|
|
||||||
static const void *nfs_netns_server_namespace(const struct kobject *kobj)
|
static const struct ns_common *nfs_netns_server_namespace(const struct kobject *kobj)
|
||||||
{
|
{
|
||||||
return container_of(kobj, struct nfs_server, kobj)->nfs_client->cl_net;
|
return to_ns_common(container_of(kobj, struct nfs_server,
|
||||||
|
kobj)->nfs_client->cl_net);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct kobj_type nfs_sb_ktype = {
|
static struct kobj_type nfs_sb_ktype = {
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ void sysfs_warn_dup(struct kernfs_node *parent, const char *name)
|
|||||||
* @kobj: object we're creating directory for
|
* @kobj: object we're creating directory for
|
||||||
* @ns: the namespace tag to use
|
* @ns: the namespace tag to use
|
||||||
*/
|
*/
|
||||||
int sysfs_create_dir_ns(struct kobject *kobj, const void *ns)
|
int sysfs_create_dir_ns(struct kobject *kobj, const struct ns_common *ns)
|
||||||
{
|
{
|
||||||
struct kernfs_node *parent, *kn;
|
struct kernfs_node *parent, *kn;
|
||||||
kuid_t uid;
|
kuid_t uid;
|
||||||
@@ -103,7 +103,7 @@ void sysfs_remove_dir(struct kobject *kobj)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int sysfs_rename_dir_ns(struct kobject *kobj, const char *new_name,
|
int sysfs_rename_dir_ns(struct kobject *kobj, const char *new_name,
|
||||||
const void *new_ns)
|
const struct ns_common *new_ns)
|
||||||
{
|
{
|
||||||
struct kernfs_node *parent;
|
struct kernfs_node *parent;
|
||||||
int ret;
|
int ret;
|
||||||
@@ -115,7 +115,7 @@ int sysfs_rename_dir_ns(struct kobject *kobj, const char *new_name,
|
|||||||
}
|
}
|
||||||
|
|
||||||
int sysfs_move_dir_ns(struct kobject *kobj, struct kobject *new_parent_kobj,
|
int sysfs_move_dir_ns(struct kobject *kobj, struct kobject *new_parent_kobj,
|
||||||
const void *new_ns)
|
const struct ns_common *new_ns)
|
||||||
{
|
{
|
||||||
struct kernfs_node *kn = kobj->sd;
|
struct kernfs_node *kn = kobj->sd;
|
||||||
struct kernfs_node *new_parent;
|
struct kernfs_node *new_parent;
|
||||||
|
|||||||
@@ -272,7 +272,7 @@ static const struct kernfs_ops sysfs_bin_kfops_mmap = {
|
|||||||
|
|
||||||
int sysfs_add_file_mode_ns(struct kernfs_node *parent,
|
int sysfs_add_file_mode_ns(struct kernfs_node *parent,
|
||||||
const struct attribute *attr, umode_t mode, kuid_t uid,
|
const struct attribute *attr, umode_t mode, kuid_t uid,
|
||||||
kgid_t gid, const void *ns)
|
kgid_t gid, const struct ns_common *ns)
|
||||||
{
|
{
|
||||||
struct kobject *kobj = parent->priv;
|
struct kobject *kobj = parent->priv;
|
||||||
const struct sysfs_ops *sysfs_ops = kobj->ktype->sysfs_ops;
|
const struct sysfs_ops *sysfs_ops = kobj->ktype->sysfs_ops;
|
||||||
@@ -322,7 +322,7 @@ int sysfs_add_file_mode_ns(struct kernfs_node *parent,
|
|||||||
|
|
||||||
int sysfs_add_bin_file_mode_ns(struct kernfs_node *parent,
|
int sysfs_add_bin_file_mode_ns(struct kernfs_node *parent,
|
||||||
const struct bin_attribute *battr, umode_t mode, size_t size,
|
const struct bin_attribute *battr, umode_t mode, size_t size,
|
||||||
kuid_t uid, kgid_t gid, const void *ns)
|
kuid_t uid, kgid_t gid, const struct ns_common *ns)
|
||||||
{
|
{
|
||||||
const struct attribute *attr = &battr->attr;
|
const struct attribute *attr = &battr->attr;
|
||||||
struct lock_class_key *key = NULL;
|
struct lock_class_key *key = NULL;
|
||||||
@@ -362,7 +362,7 @@ int sysfs_add_bin_file_mode_ns(struct kernfs_node *parent,
|
|||||||
* @ns: namespace the new file should belong to
|
* @ns: namespace the new file should belong to
|
||||||
*/
|
*/
|
||||||
int sysfs_create_file_ns(struct kobject *kobj, const struct attribute *attr,
|
int sysfs_create_file_ns(struct kobject *kobj, const struct attribute *attr,
|
||||||
const void *ns)
|
const struct ns_common *ns)
|
||||||
{
|
{
|
||||||
kuid_t uid;
|
kuid_t uid;
|
||||||
kgid_t gid;
|
kgid_t gid;
|
||||||
@@ -505,7 +505,7 @@ EXPORT_SYMBOL_GPL(sysfs_unbreak_active_protection);
|
|||||||
* Hash the attribute name and namespace tag and kill the victim.
|
* Hash the attribute name and namespace tag and kill the victim.
|
||||||
*/
|
*/
|
||||||
void sysfs_remove_file_ns(struct kobject *kobj, const struct attribute *attr,
|
void sysfs_remove_file_ns(struct kobject *kobj, const struct attribute *attr,
|
||||||
const void *ns)
|
const struct ns_common *ns)
|
||||||
{
|
{
|
||||||
struct kernfs_node *parent = kobj->sd;
|
struct kernfs_node *parent = kobj->sd;
|
||||||
|
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ static const struct fs_context_operations sysfs_fs_context_ops = {
|
|||||||
static int sysfs_init_fs_context(struct fs_context *fc)
|
static int sysfs_init_fs_context(struct fs_context *fc)
|
||||||
{
|
{
|
||||||
struct kernfs_fs_context *kfc;
|
struct kernfs_fs_context *kfc;
|
||||||
struct net *netns;
|
struct ns_common *ns;
|
||||||
|
|
||||||
if (!(fc->sb_flags & SB_KERNMOUNT)) {
|
if (!(fc->sb_flags & SB_KERNMOUNT)) {
|
||||||
if (!kobj_ns_current_may_mount(KOBJ_NS_TYPE_NET))
|
if (!kobj_ns_current_may_mount(KOBJ_NS_TYPE_NET))
|
||||||
@@ -66,12 +66,14 @@ static int sysfs_init_fs_context(struct fs_context *fc)
|
|||||||
if (!kfc)
|
if (!kfc)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
kfc->ns_tag = netns = kobj_ns_grab_current(KOBJ_NS_TYPE_NET);
|
kfc->ns_tag = ns = kobj_ns_grab_current(KOBJ_NS_TYPE_NET);
|
||||||
kfc->root = sysfs_root;
|
kfc->root = sysfs_root;
|
||||||
kfc->magic = SYSFS_MAGIC;
|
kfc->magic = SYSFS_MAGIC;
|
||||||
fc->fs_private = kfc;
|
fc->fs_private = kfc;
|
||||||
fc->ops = &sysfs_fs_context_ops;
|
fc->ops = &sysfs_fs_context_ops;
|
||||||
if (netns) {
|
if (ns) {
|
||||||
|
struct net *netns = to_net_ns(ns);
|
||||||
|
|
||||||
put_user_ns(fc->user_ns);
|
put_user_ns(fc->user_ns);
|
||||||
fc->user_ns = get_user_ns(netns->user_ns);
|
fc->user_ns = get_user_ns(netns->user_ns);
|
||||||
}
|
}
|
||||||
@@ -81,7 +83,7 @@ static int sysfs_init_fs_context(struct fs_context *fc)
|
|||||||
|
|
||||||
static void sysfs_kill_sb(struct super_block *sb)
|
static void sysfs_kill_sb(struct super_block *sb)
|
||||||
{
|
{
|
||||||
void *ns = (void *)kernfs_super_ns(sb);
|
struct ns_common *ns = (struct ns_common *)kernfs_super_ns(sb);
|
||||||
|
|
||||||
kernfs_kill_sb(sb);
|
kernfs_kill_sb(sb);
|
||||||
kobj_ns_drop(KOBJ_NS_TYPE_NET, ns);
|
kobj_ns_drop(KOBJ_NS_TYPE_NET, ns);
|
||||||
|
|||||||
@@ -121,7 +121,7 @@ EXPORT_SYMBOL_GPL(sysfs_create_link_nowarn);
|
|||||||
void sysfs_delete_link(struct kobject *kobj, struct kobject *targ,
|
void sysfs_delete_link(struct kobject *kobj, struct kobject *targ,
|
||||||
const char *name)
|
const char *name)
|
||||||
{
|
{
|
||||||
const void *ns = NULL;
|
const struct ns_common *ns = NULL;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We don't own @target and it may be removed at any time.
|
* We don't own @target and it may be removed at any time.
|
||||||
@@ -164,10 +164,11 @@ EXPORT_SYMBOL_GPL(sysfs_remove_link);
|
|||||||
* A helper function for the common rename symlink idiom.
|
* A helper function for the common rename symlink idiom.
|
||||||
*/
|
*/
|
||||||
int sysfs_rename_link_ns(struct kobject *kobj, struct kobject *targ,
|
int sysfs_rename_link_ns(struct kobject *kobj, struct kobject *targ,
|
||||||
const char *old, const char *new, const void *new_ns)
|
const char *old, const char *new,
|
||||||
|
const struct ns_common *new_ns)
|
||||||
{
|
{
|
||||||
struct kernfs_node *parent, *kn = NULL;
|
struct kernfs_node *parent, *kn = NULL;
|
||||||
const void *old_ns = NULL;
|
const struct ns_common *old_ns = NULL;
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
if (!kobj)
|
if (!kobj)
|
||||||
|
|||||||
@@ -29,10 +29,10 @@ void sysfs_warn_dup(struct kernfs_node *parent, const char *name);
|
|||||||
*/
|
*/
|
||||||
int sysfs_add_file_mode_ns(struct kernfs_node *parent,
|
int sysfs_add_file_mode_ns(struct kernfs_node *parent,
|
||||||
const struct attribute *attr, umode_t amode, kuid_t uid,
|
const struct attribute *attr, umode_t amode, kuid_t uid,
|
||||||
kgid_t gid, const void *ns);
|
kgid_t gid, const struct ns_common *ns);
|
||||||
int sysfs_add_bin_file_mode_ns(struct kernfs_node *parent,
|
int sysfs_add_bin_file_mode_ns(struct kernfs_node *parent,
|
||||||
const struct bin_attribute *battr, umode_t mode, size_t size,
|
const struct bin_attribute *battr, umode_t mode, size_t size,
|
||||||
kuid_t uid, kgid_t gid, const void *ns);
|
kuid_t uid, kgid_t gid, const struct ns_common *ns);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* symlink.c
|
* symlink.c
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ struct class {
|
|||||||
int (*shutdown_pre)(struct device *dev);
|
int (*shutdown_pre)(struct device *dev);
|
||||||
|
|
||||||
const struct kobj_ns_type_operations *ns_type;
|
const struct kobj_ns_type_operations *ns_type;
|
||||||
const void *(*namespace)(const struct device *dev);
|
const struct ns_common *(*namespace)(const struct device *dev);
|
||||||
|
|
||||||
void (*get_ownership)(const struct device *dev, kuid_t *uid, kgid_t *gid);
|
void (*get_ownership)(const struct device *dev, kuid_t *uid, kgid_t *gid);
|
||||||
|
|
||||||
@@ -180,9 +180,9 @@ struct class_attribute {
|
|||||||
struct class_attribute class_attr_##_name = __ATTR_WO(_name)
|
struct class_attribute class_attr_##_name = __ATTR_WO(_name)
|
||||||
|
|
||||||
int __must_check class_create_file_ns(const struct class *class, const struct class_attribute *attr,
|
int __must_check class_create_file_ns(const struct class *class, const struct class_attribute *attr,
|
||||||
const void *ns);
|
const struct ns_common *ns);
|
||||||
void class_remove_file_ns(const struct class *class, const struct class_attribute *attr,
|
void class_remove_file_ns(const struct class *class, const struct class_attribute *attr,
|
||||||
const void *ns);
|
const struct ns_common *ns);
|
||||||
|
|
||||||
static inline int __must_check class_create_file(const struct class *class,
|
static inline int __must_check class_create_file(const struct class *class,
|
||||||
const struct class_attribute *attr)
|
const struct class_attribute *attr)
|
||||||
|
|||||||
@@ -23,6 +23,7 @@
|
|||||||
struct file;
|
struct file;
|
||||||
struct dentry;
|
struct dentry;
|
||||||
struct iattr;
|
struct iattr;
|
||||||
|
struct ns_common;
|
||||||
struct seq_file;
|
struct seq_file;
|
||||||
struct vm_area_struct;
|
struct vm_area_struct;
|
||||||
struct vm_operations_struct;
|
struct vm_operations_struct;
|
||||||
@@ -209,7 +210,7 @@ struct kernfs_node {
|
|||||||
|
|
||||||
struct rb_node rb;
|
struct rb_node rb;
|
||||||
|
|
||||||
const void *ns; /* namespace tag */
|
const struct ns_common *ns; /* namespace tag */
|
||||||
unsigned int hash; /* ns + name hash */
|
unsigned int hash; /* ns + name hash */
|
||||||
unsigned short flags;
|
unsigned short flags;
|
||||||
umode_t mode;
|
umode_t mode;
|
||||||
@@ -331,7 +332,7 @@ struct kernfs_ops {
|
|||||||
*/
|
*/
|
||||||
struct kernfs_fs_context {
|
struct kernfs_fs_context {
|
||||||
struct kernfs_root *root; /* Root of the hierarchy being mounted */
|
struct kernfs_root *root; /* Root of the hierarchy being mounted */
|
||||||
void *ns_tag; /* Namespace tag of the mount (or NULL) */
|
struct ns_common *ns_tag; /* Namespace tag of the mount (or NULL) */
|
||||||
unsigned long magic; /* File system specific magic number */
|
unsigned long magic; /* File system specific magic number */
|
||||||
|
|
||||||
/* The following are set/used by kernfs_mount() */
|
/* The following are set/used by kernfs_mount() */
|
||||||
@@ -406,9 +407,11 @@ void pr_cont_kernfs_name(struct kernfs_node *kn);
|
|||||||
void pr_cont_kernfs_path(struct kernfs_node *kn);
|
void pr_cont_kernfs_path(struct kernfs_node *kn);
|
||||||
struct kernfs_node *kernfs_get_parent(struct kernfs_node *kn);
|
struct kernfs_node *kernfs_get_parent(struct kernfs_node *kn);
|
||||||
struct kernfs_node *kernfs_find_and_get_ns(struct kernfs_node *parent,
|
struct kernfs_node *kernfs_find_and_get_ns(struct kernfs_node *parent,
|
||||||
const char *name, const void *ns);
|
const char *name,
|
||||||
|
const struct ns_common *ns);
|
||||||
struct kernfs_node *kernfs_walk_and_get_ns(struct kernfs_node *parent,
|
struct kernfs_node *kernfs_walk_and_get_ns(struct kernfs_node *parent,
|
||||||
const char *path, const void *ns);
|
const char *path,
|
||||||
|
const struct ns_common *ns);
|
||||||
void kernfs_get(struct kernfs_node *kn);
|
void kernfs_get(struct kernfs_node *kn);
|
||||||
void kernfs_put(struct kernfs_node *kn);
|
void kernfs_put(struct kernfs_node *kn);
|
||||||
|
|
||||||
@@ -426,7 +429,8 @@ unsigned int kernfs_root_flags(struct kernfs_node *kn);
|
|||||||
struct kernfs_node *kernfs_create_dir_ns(struct kernfs_node *parent,
|
struct kernfs_node *kernfs_create_dir_ns(struct kernfs_node *parent,
|
||||||
const char *name, umode_t mode,
|
const char *name, umode_t mode,
|
||||||
kuid_t uid, kgid_t gid,
|
kuid_t uid, kgid_t gid,
|
||||||
void *priv, const void *ns);
|
void *priv,
|
||||||
|
const struct ns_common *ns);
|
||||||
struct kernfs_node *kernfs_create_empty_dir(struct kernfs_node *parent,
|
struct kernfs_node *kernfs_create_empty_dir(struct kernfs_node *parent,
|
||||||
const char *name);
|
const char *name);
|
||||||
struct kernfs_node *__kernfs_create_file(struct kernfs_node *parent,
|
struct kernfs_node *__kernfs_create_file(struct kernfs_node *parent,
|
||||||
@@ -434,7 +438,8 @@ struct kernfs_node *__kernfs_create_file(struct kernfs_node *parent,
|
|||||||
kuid_t uid, kgid_t gid,
|
kuid_t uid, kgid_t gid,
|
||||||
loff_t size,
|
loff_t size,
|
||||||
const struct kernfs_ops *ops,
|
const struct kernfs_ops *ops,
|
||||||
void *priv, const void *ns,
|
void *priv,
|
||||||
|
const struct ns_common *ns,
|
||||||
struct lock_class_key *key);
|
struct lock_class_key *key);
|
||||||
struct kernfs_node *kernfs_create_link(struct kernfs_node *parent,
|
struct kernfs_node *kernfs_create_link(struct kernfs_node *parent,
|
||||||
const char *name,
|
const char *name,
|
||||||
@@ -446,9 +451,9 @@ void kernfs_break_active_protection(struct kernfs_node *kn);
|
|||||||
void kernfs_unbreak_active_protection(struct kernfs_node *kn);
|
void kernfs_unbreak_active_protection(struct kernfs_node *kn);
|
||||||
bool kernfs_remove_self(struct kernfs_node *kn);
|
bool kernfs_remove_self(struct kernfs_node *kn);
|
||||||
int kernfs_remove_by_name_ns(struct kernfs_node *parent, const char *name,
|
int kernfs_remove_by_name_ns(struct kernfs_node *parent, const char *name,
|
||||||
const void *ns);
|
const struct ns_common *ns);
|
||||||
int kernfs_rename_ns(struct kernfs_node *kn, struct kernfs_node *new_parent,
|
int kernfs_rename_ns(struct kernfs_node *kn, struct kernfs_node *new_parent,
|
||||||
const char *new_name, const void *new_ns);
|
const char *new_name, const struct ns_common *new_ns);
|
||||||
int kernfs_setattr(struct kernfs_node *kn, const struct iattr *iattr);
|
int kernfs_setattr(struct kernfs_node *kn, const struct iattr *iattr);
|
||||||
__poll_t kernfs_generic_poll(struct kernfs_open_file *of,
|
__poll_t kernfs_generic_poll(struct kernfs_open_file *of,
|
||||||
struct poll_table_struct *pt);
|
struct poll_table_struct *pt);
|
||||||
@@ -459,7 +464,7 @@ int kernfs_xattr_get(struct kernfs_node *kn, const char *name,
|
|||||||
int kernfs_xattr_set(struct kernfs_node *kn, const char *name,
|
int kernfs_xattr_set(struct kernfs_node *kn, const char *name,
|
||||||
const void *value, size_t size, int flags);
|
const void *value, size_t size, int flags);
|
||||||
|
|
||||||
const void *kernfs_super_ns(struct super_block *sb);
|
const struct ns_common *kernfs_super_ns(struct super_block *sb);
|
||||||
int kernfs_get_tree(struct fs_context *fc);
|
int kernfs_get_tree(struct fs_context *fc);
|
||||||
void kernfs_free_fs_context(struct fs_context *fc);
|
void kernfs_free_fs_context(struct fs_context *fc);
|
||||||
void kernfs_kill_sb(struct super_block *sb);
|
void kernfs_kill_sb(struct super_block *sb);
|
||||||
@@ -494,11 +499,11 @@ static inline struct kernfs_node *kernfs_get_parent(struct kernfs_node *kn)
|
|||||||
|
|
||||||
static inline struct kernfs_node *
|
static inline struct kernfs_node *
|
||||||
kernfs_find_and_get_ns(struct kernfs_node *parent, const char *name,
|
kernfs_find_and_get_ns(struct kernfs_node *parent, const char *name,
|
||||||
const void *ns)
|
const struct ns_common *ns)
|
||||||
{ return NULL; }
|
{ return NULL; }
|
||||||
static inline struct kernfs_node *
|
static inline struct kernfs_node *
|
||||||
kernfs_walk_and_get_ns(struct kernfs_node *parent, const char *path,
|
kernfs_walk_and_get_ns(struct kernfs_node *parent, const char *path,
|
||||||
const void *ns)
|
const struct ns_common *ns)
|
||||||
{ return NULL; }
|
{ return NULL; }
|
||||||
|
|
||||||
static inline void kernfs_get(struct kernfs_node *kn) { }
|
static inline void kernfs_get(struct kernfs_node *kn) { }
|
||||||
@@ -526,14 +531,15 @@ static inline unsigned int kernfs_root_flags(struct kernfs_node *kn)
|
|||||||
static inline struct kernfs_node *
|
static inline struct kernfs_node *
|
||||||
kernfs_create_dir_ns(struct kernfs_node *parent, const char *name,
|
kernfs_create_dir_ns(struct kernfs_node *parent, const char *name,
|
||||||
umode_t mode, kuid_t uid, kgid_t gid,
|
umode_t mode, kuid_t uid, kgid_t gid,
|
||||||
void *priv, const void *ns)
|
void *priv, const struct ns_common *ns)
|
||||||
{ return ERR_PTR(-ENOSYS); }
|
{ return ERR_PTR(-ENOSYS); }
|
||||||
|
|
||||||
static inline struct kernfs_node *
|
static inline struct kernfs_node *
|
||||||
__kernfs_create_file(struct kernfs_node *parent, const char *name,
|
__kernfs_create_file(struct kernfs_node *parent, const char *name,
|
||||||
umode_t mode, kuid_t uid, kgid_t gid,
|
umode_t mode, kuid_t uid, kgid_t gid,
|
||||||
loff_t size, const struct kernfs_ops *ops,
|
loff_t size, const struct kernfs_ops *ops,
|
||||||
void *priv, const void *ns, struct lock_class_key *key)
|
void *priv, const struct ns_common *ns,
|
||||||
|
struct lock_class_key *key)
|
||||||
{ return ERR_PTR(-ENOSYS); }
|
{ return ERR_PTR(-ENOSYS); }
|
||||||
|
|
||||||
static inline struct kernfs_node *
|
static inline struct kernfs_node *
|
||||||
@@ -549,12 +555,14 @@ static inline bool kernfs_remove_self(struct kernfs_node *kn)
|
|||||||
{ return false; }
|
{ return false; }
|
||||||
|
|
||||||
static inline int kernfs_remove_by_name_ns(struct kernfs_node *kn,
|
static inline int kernfs_remove_by_name_ns(struct kernfs_node *kn,
|
||||||
const char *name, const void *ns)
|
const char *name,
|
||||||
|
const struct ns_common *ns)
|
||||||
{ return -ENOSYS; }
|
{ return -ENOSYS; }
|
||||||
|
|
||||||
static inline int kernfs_rename_ns(struct kernfs_node *kn,
|
static inline int kernfs_rename_ns(struct kernfs_node *kn,
|
||||||
struct kernfs_node *new_parent,
|
struct kernfs_node *new_parent,
|
||||||
const char *new_name, const void *new_ns)
|
const char *new_name,
|
||||||
|
const struct ns_common *new_ns)
|
||||||
{ return -ENOSYS; }
|
{ return -ENOSYS; }
|
||||||
|
|
||||||
static inline int kernfs_setattr(struct kernfs_node *kn,
|
static inline int kernfs_setattr(struct kernfs_node *kn,
|
||||||
@@ -575,7 +583,7 @@ static inline int kernfs_xattr_set(struct kernfs_node *kn, const char *name,
|
|||||||
const void *value, size_t size, int flags)
|
const void *value, size_t size, int flags)
|
||||||
{ return -ENOSYS; }
|
{ return -ENOSYS; }
|
||||||
|
|
||||||
static inline const void *kernfs_super_ns(struct super_block *sb)
|
static inline const struct ns_common *kernfs_super_ns(struct super_block *sb)
|
||||||
{ return NULL; }
|
{ return NULL; }
|
||||||
|
|
||||||
static inline int kernfs_get_tree(struct fs_context *fc)
|
static inline int kernfs_get_tree(struct fs_context *fc)
|
||||||
|
|||||||
@@ -109,7 +109,7 @@ struct kobject *kobject_get(struct kobject *kobj);
|
|||||||
struct kobject * __must_check kobject_get_unless_zero(struct kobject *kobj);
|
struct kobject * __must_check kobject_get_unless_zero(struct kobject *kobj);
|
||||||
void kobject_put(struct kobject *kobj);
|
void kobject_put(struct kobject *kobj);
|
||||||
|
|
||||||
const void *kobject_namespace(const struct kobject *kobj);
|
const struct ns_common *kobject_namespace(const struct kobject *kobj);
|
||||||
void kobject_get_ownership(const struct kobject *kobj, kuid_t *uid, kgid_t *gid);
|
void kobject_get_ownership(const struct kobject *kobj, kuid_t *uid, kgid_t *gid);
|
||||||
char *kobject_get_path(const struct kobject *kobj, gfp_t flag);
|
char *kobject_get_path(const struct kobject *kobj, gfp_t flag);
|
||||||
|
|
||||||
@@ -118,7 +118,7 @@ struct kobj_type {
|
|||||||
const struct sysfs_ops *sysfs_ops;
|
const struct sysfs_ops *sysfs_ops;
|
||||||
const struct attribute_group **default_groups;
|
const struct attribute_group **default_groups;
|
||||||
const struct kobj_ns_type_operations *(*child_ns_type)(const struct kobject *kobj);
|
const struct kobj_ns_type_operations *(*child_ns_type)(const struct kobject *kobj);
|
||||||
const void *(*namespace)(const struct kobject *kobj);
|
const struct ns_common *(*namespace)(const struct kobject *kobj);
|
||||||
void (*get_ownership)(const struct kobject *kobj, kuid_t *uid, kgid_t *gid);
|
void (*get_ownership)(const struct kobject *kobj, kuid_t *uid, kgid_t *gid);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
#ifndef _LINUX_KOBJECT_NS_H
|
#ifndef _LINUX_KOBJECT_NS_H
|
||||||
#define _LINUX_KOBJECT_NS_H
|
#define _LINUX_KOBJECT_NS_H
|
||||||
|
|
||||||
|
struct ns_common;
|
||||||
struct sock;
|
struct sock;
|
||||||
struct kobject;
|
struct kobject;
|
||||||
|
|
||||||
@@ -39,10 +40,10 @@ enum kobj_ns_type {
|
|||||||
struct kobj_ns_type_operations {
|
struct kobj_ns_type_operations {
|
||||||
enum kobj_ns_type type;
|
enum kobj_ns_type type;
|
||||||
bool (*current_may_mount)(void);
|
bool (*current_may_mount)(void);
|
||||||
void *(*grab_current_ns)(void);
|
struct ns_common *(*grab_current_ns)(void);
|
||||||
const void *(*netlink_ns)(struct sock *sk);
|
const struct ns_common *(*netlink_ns)(struct sock *sk);
|
||||||
const void *(*initial_ns)(void);
|
const struct ns_common *(*initial_ns)(void);
|
||||||
void (*drop_ns)(void *);
|
void (*drop_ns)(struct ns_common *);
|
||||||
};
|
};
|
||||||
|
|
||||||
int kobj_ns_type_register(const struct kobj_ns_type_operations *ops);
|
int kobj_ns_type_register(const struct kobj_ns_type_operations *ops);
|
||||||
@@ -51,7 +52,7 @@ const struct kobj_ns_type_operations *kobj_child_ns_ops(const struct kobject *pa
|
|||||||
const struct kobj_ns_type_operations *kobj_ns_ops(const struct kobject *kobj);
|
const struct kobj_ns_type_operations *kobj_ns_ops(const struct kobject *kobj);
|
||||||
|
|
||||||
bool kobj_ns_current_may_mount(enum kobj_ns_type type);
|
bool kobj_ns_current_may_mount(enum kobj_ns_type type);
|
||||||
void *kobj_ns_grab_current(enum kobj_ns_type type);
|
struct ns_common *kobj_ns_grab_current(enum kobj_ns_type type);
|
||||||
void kobj_ns_drop(enum kobj_ns_type type, void *ns);
|
void kobj_ns_drop(enum kobj_ns_type type, struct ns_common *ns);
|
||||||
|
|
||||||
#endif /* _LINUX_KOBJECT_NS_H */
|
#endif /* _LINUX_KOBJECT_NS_H */
|
||||||
|
|||||||
@@ -5339,9 +5339,9 @@ static inline netdev_tx_t netdev_start_xmit(struct sk_buff *skb, struct net_devi
|
|||||||
}
|
}
|
||||||
|
|
||||||
int netdev_class_create_file_ns(const struct class_attribute *class_attr,
|
int netdev_class_create_file_ns(const struct class_attribute *class_attr,
|
||||||
const void *ns);
|
const struct ns_common *ns);
|
||||||
void netdev_class_remove_file_ns(const struct class_attribute *class_attr,
|
void netdev_class_remove_file_ns(const struct class_attribute *class_attr,
|
||||||
const void *ns);
|
const struct ns_common *ns);
|
||||||
|
|
||||||
extern const struct kobj_ns_type_operations net_ns_type_operations;
|
extern const struct kobj_ns_type_operations net_ns_type_operations;
|
||||||
|
|
||||||
|
|||||||
@@ -396,13 +396,13 @@ struct sysfs_ops {
|
|||||||
|
|
||||||
#ifdef CONFIG_SYSFS
|
#ifdef CONFIG_SYSFS
|
||||||
|
|
||||||
int __must_check sysfs_create_dir_ns(struct kobject *kobj, const void *ns);
|
int __must_check sysfs_create_dir_ns(struct kobject *kobj, const struct ns_common *ns);
|
||||||
void sysfs_remove_dir(struct kobject *kobj);
|
void sysfs_remove_dir(struct kobject *kobj);
|
||||||
int __must_check sysfs_rename_dir_ns(struct kobject *kobj, const char *new_name,
|
int __must_check sysfs_rename_dir_ns(struct kobject *kobj, const char *new_name,
|
||||||
const void *new_ns);
|
const struct ns_common *new_ns);
|
||||||
int __must_check sysfs_move_dir_ns(struct kobject *kobj,
|
int __must_check sysfs_move_dir_ns(struct kobject *kobj,
|
||||||
struct kobject *new_parent_kobj,
|
struct kobject *new_parent_kobj,
|
||||||
const void *new_ns);
|
const struct ns_common *new_ns);
|
||||||
int __must_check sysfs_create_mount_point(struct kobject *parent_kobj,
|
int __must_check sysfs_create_mount_point(struct kobject *parent_kobj,
|
||||||
const char *name);
|
const char *name);
|
||||||
void sysfs_remove_mount_point(struct kobject *parent_kobj,
|
void sysfs_remove_mount_point(struct kobject *parent_kobj,
|
||||||
@@ -410,7 +410,7 @@ void sysfs_remove_mount_point(struct kobject *parent_kobj,
|
|||||||
|
|
||||||
int __must_check sysfs_create_file_ns(struct kobject *kobj,
|
int __must_check sysfs_create_file_ns(struct kobject *kobj,
|
||||||
const struct attribute *attr,
|
const struct attribute *attr,
|
||||||
const void *ns);
|
const struct ns_common *ns);
|
||||||
int __must_check sysfs_create_files(struct kobject *kobj,
|
int __must_check sysfs_create_files(struct kobject *kobj,
|
||||||
const struct attribute * const *attr);
|
const struct attribute * const *attr);
|
||||||
int __must_check sysfs_chmod_file(struct kobject *kobj,
|
int __must_check sysfs_chmod_file(struct kobject *kobj,
|
||||||
@@ -419,7 +419,7 @@ struct kernfs_node *sysfs_break_active_protection(struct kobject *kobj,
|
|||||||
const struct attribute *attr);
|
const struct attribute *attr);
|
||||||
void sysfs_unbreak_active_protection(struct kernfs_node *kn);
|
void sysfs_unbreak_active_protection(struct kernfs_node *kn);
|
||||||
void sysfs_remove_file_ns(struct kobject *kobj, const struct attribute *attr,
|
void sysfs_remove_file_ns(struct kobject *kobj, const struct attribute *attr,
|
||||||
const void *ns);
|
const struct ns_common *ns);
|
||||||
bool sysfs_remove_file_self(struct kobject *kobj, const struct attribute *attr);
|
bool sysfs_remove_file_self(struct kobject *kobj, const struct attribute *attr);
|
||||||
void sysfs_remove_files(struct kobject *kobj, const struct attribute * const *attr);
|
void sysfs_remove_files(struct kobject *kobj, const struct attribute * const *attr);
|
||||||
|
|
||||||
@@ -437,7 +437,7 @@ void sysfs_remove_link(struct kobject *kobj, const char *name);
|
|||||||
|
|
||||||
int sysfs_rename_link_ns(struct kobject *kobj, struct kobject *target,
|
int sysfs_rename_link_ns(struct kobject *kobj, struct kobject *target,
|
||||||
const char *old_name, const char *new_name,
|
const char *old_name, const char *new_name,
|
||||||
const void *new_ns);
|
const struct ns_common *new_ns);
|
||||||
|
|
||||||
void sysfs_delete_link(struct kobject *dir, struct kobject *targ,
|
void sysfs_delete_link(struct kobject *dir, struct kobject *targ,
|
||||||
const char *name);
|
const char *name);
|
||||||
@@ -502,7 +502,7 @@ ssize_t sysfs_bin_attr_simple_read(struct file *file, struct kobject *kobj,
|
|||||||
|
|
||||||
#else /* CONFIG_SYSFS */
|
#else /* CONFIG_SYSFS */
|
||||||
|
|
||||||
static inline int sysfs_create_dir_ns(struct kobject *kobj, const void *ns)
|
static inline int sysfs_create_dir_ns(struct kobject *kobj, const struct ns_common *ns)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -512,14 +512,14 @@ static inline void sysfs_remove_dir(struct kobject *kobj)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static inline int sysfs_rename_dir_ns(struct kobject *kobj,
|
static inline int sysfs_rename_dir_ns(struct kobject *kobj,
|
||||||
const char *new_name, const void *new_ns)
|
const char *new_name, const struct ns_common *new_ns)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int sysfs_move_dir_ns(struct kobject *kobj,
|
static inline int sysfs_move_dir_ns(struct kobject *kobj,
|
||||||
struct kobject *new_parent_kobj,
|
struct kobject *new_parent_kobj,
|
||||||
const void *new_ns)
|
const struct ns_common *new_ns)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -537,7 +537,7 @@ static inline void sysfs_remove_mount_point(struct kobject *parent_kobj,
|
|||||||
|
|
||||||
static inline int sysfs_create_file_ns(struct kobject *kobj,
|
static inline int sysfs_create_file_ns(struct kobject *kobj,
|
||||||
const struct attribute *attr,
|
const struct attribute *attr,
|
||||||
const void *ns)
|
const struct ns_common *ns)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -567,7 +567,7 @@ static inline void sysfs_unbreak_active_protection(struct kernfs_node *kn)
|
|||||||
|
|
||||||
static inline void sysfs_remove_file_ns(struct kobject *kobj,
|
static inline void sysfs_remove_file_ns(struct kobject *kobj,
|
||||||
const struct attribute *attr,
|
const struct attribute *attr,
|
||||||
const void *ns)
|
const struct ns_common *ns)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -612,7 +612,7 @@ static inline void sysfs_remove_link(struct kobject *kobj, const char *name)
|
|||||||
|
|
||||||
static inline int sysfs_rename_link_ns(struct kobject *k, struct kobject *t,
|
static inline int sysfs_rename_link_ns(struct kobject *k, struct kobject *t,
|
||||||
const char *old_name,
|
const char *old_name,
|
||||||
const char *new_name, const void *ns)
|
const char *new_name, const struct ns_common *ns)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -264,14 +264,14 @@ void ipx_unregister_sysctl(void);
|
|||||||
#define ipx_unregister_sysctl()
|
#define ipx_unregister_sysctl()
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_NET_NS
|
|
||||||
void __put_net(struct net *net);
|
|
||||||
|
|
||||||
static inline struct net *to_net_ns(struct ns_common *ns)
|
static inline struct net *to_net_ns(struct ns_common *ns)
|
||||||
{
|
{
|
||||||
return container_of(ns, struct net, ns);
|
return container_of(ns, struct net, ns);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_NET_NS
|
||||||
|
void __put_net(struct net *net);
|
||||||
|
|
||||||
/* Try using get_net_track() instead */
|
/* Try using get_net_track() instead */
|
||||||
static inline struct net *get_net(struct net *net)
|
static inline struct net *get_net(struct net *net)
|
||||||
{
|
{
|
||||||
@@ -309,7 +309,7 @@ static inline int check_net(const struct net *net)
|
|||||||
return ns_ref_read(net) != 0;
|
return ns_ref_read(net) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void net_drop_ns(void *);
|
void net_drop_ns(struct ns_common *);
|
||||||
void net_passive_dec(struct net *net);
|
void net_passive_dec(struct net *net);
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|||||||
@@ -27,7 +27,7 @@
|
|||||||
* and thus @kobj should have a namespace tag associated with it. Returns
|
* and thus @kobj should have a namespace tag associated with it. Returns
|
||||||
* %NULL otherwise.
|
* %NULL otherwise.
|
||||||
*/
|
*/
|
||||||
const void *kobject_namespace(const struct kobject *kobj)
|
const struct ns_common *kobject_namespace(const struct kobject *kobj)
|
||||||
{
|
{
|
||||||
const struct kobj_ns_type_operations *ns_ops = kobj_ns_ops(kobj);
|
const struct kobj_ns_type_operations *ns_ops = kobj_ns_ops(kobj);
|
||||||
|
|
||||||
@@ -1083,9 +1083,9 @@ bool kobj_ns_current_may_mount(enum kobj_ns_type type)
|
|||||||
return may_mount;
|
return may_mount;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *kobj_ns_grab_current(enum kobj_ns_type type)
|
struct ns_common *kobj_ns_grab_current(enum kobj_ns_type type)
|
||||||
{
|
{
|
||||||
void *ns = NULL;
|
struct ns_common *ns = NULL;
|
||||||
|
|
||||||
spin_lock(&kobj_ns_type_lock);
|
spin_lock(&kobj_ns_type_lock);
|
||||||
if (kobj_ns_type_is_valid(type) && kobj_ns_ops_tbl[type])
|
if (kobj_ns_type_is_valid(type) && kobj_ns_ops_tbl[type])
|
||||||
@@ -1096,7 +1096,7 @@ void *kobj_ns_grab_current(enum kobj_ns_type type)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(kobj_ns_grab_current);
|
EXPORT_SYMBOL_GPL(kobj_ns_grab_current);
|
||||||
|
|
||||||
void kobj_ns_drop(enum kobj_ns_type type, void *ns)
|
void kobj_ns_drop(enum kobj_ns_type type, struct ns_common *ns)
|
||||||
{
|
{
|
||||||
spin_lock(&kobj_ns_type_lock);
|
spin_lock(&kobj_ns_type_lock);
|
||||||
if (kobj_ns_type_is_valid(type) &&
|
if (kobj_ns_type_is_valid(type) &&
|
||||||
|
|||||||
@@ -238,7 +238,7 @@ static int kobj_usermode_filter(struct kobject *kobj)
|
|||||||
|
|
||||||
ops = kobj_ns_ops(kobj);
|
ops = kobj_ns_ops(kobj);
|
||||||
if (ops) {
|
if (ops) {
|
||||||
const void *init_ns, *ns;
|
const struct ns_common *init_ns, *ns;
|
||||||
|
|
||||||
ns = kobj->ktype->namespace(kobj);
|
ns = kobj->ktype->namespace(kobj);
|
||||||
init_ns = ops->initial_ns();
|
init_ns = ops->initial_ns();
|
||||||
@@ -388,7 +388,7 @@ static int kobject_uevent_net_broadcast(struct kobject *kobj,
|
|||||||
|
|
||||||
#ifdef CONFIG_NET
|
#ifdef CONFIG_NET
|
||||||
const struct kobj_ns_type_operations *ops;
|
const struct kobj_ns_type_operations *ops;
|
||||||
const struct net *net = NULL;
|
const struct ns_common *ns = NULL;
|
||||||
|
|
||||||
ops = kobj_ns_ops(kobj);
|
ops = kobj_ns_ops(kobj);
|
||||||
if (!ops && kobj->kset) {
|
if (!ops && kobj->kset) {
|
||||||
@@ -404,14 +404,17 @@ static int kobject_uevent_net_broadcast(struct kobject *kobj,
|
|||||||
*/
|
*/
|
||||||
if (ops && ops->netlink_ns && kobj->ktype->namespace)
|
if (ops && ops->netlink_ns && kobj->ktype->namespace)
|
||||||
if (ops->type == KOBJ_NS_TYPE_NET)
|
if (ops->type == KOBJ_NS_TYPE_NET)
|
||||||
net = kobj->ktype->namespace(kobj);
|
ns = kobj->ktype->namespace(kobj);
|
||||||
|
|
||||||
if (!net)
|
if (!ns)
|
||||||
ret = uevent_net_broadcast_untagged(env, action_string,
|
ret = uevent_net_broadcast_untagged(env, action_string,
|
||||||
devpath);
|
devpath);
|
||||||
else
|
else {
|
||||||
|
const struct net *net = container_of(ns, struct net, ns);
|
||||||
|
|
||||||
ret = uevent_net_broadcast_tagged(net->uevent_sock->sk, env,
|
ret = uevent_net_broadcast_tagged(net->uevent_sock->sk, env,
|
||||||
action_string, devpath);
|
action_string, devpath);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|||||||
@@ -1181,24 +1181,24 @@ static void rx_queue_release(struct kobject *kobj)
|
|||||||
netdev_put(queue->dev, &queue->dev_tracker);
|
netdev_put(queue->dev, &queue->dev_tracker);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const void *rx_queue_namespace(const struct kobject *kobj)
|
static const struct ns_common *rx_queue_namespace(const struct kobject *kobj)
|
||||||
{
|
{
|
||||||
struct netdev_rx_queue *queue = to_rx_queue(kobj);
|
struct netdev_rx_queue *queue = to_rx_queue(kobj);
|
||||||
struct device *dev = &queue->dev->dev;
|
struct device *dev = &queue->dev->dev;
|
||||||
const void *ns = NULL;
|
|
||||||
|
|
||||||
if (dev->class && dev->class->namespace)
|
if (dev->class && dev->class->namespace)
|
||||||
ns = dev->class->namespace(dev);
|
return dev->class->namespace(dev);
|
||||||
|
|
||||||
return ns;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rx_queue_get_ownership(const struct kobject *kobj,
|
static void rx_queue_get_ownership(const struct kobject *kobj,
|
||||||
kuid_t *uid, kgid_t *gid)
|
kuid_t *uid, kgid_t *gid)
|
||||||
{
|
{
|
||||||
const struct net *net = rx_queue_namespace(kobj);
|
const struct ns_common *ns = rx_queue_namespace(kobj);
|
||||||
|
|
||||||
net_ns_get_ownership(net, uid, gid);
|
net_ns_get_ownership(ns ? container_of(ns, struct net, ns) : NULL,
|
||||||
|
uid, gid);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct kobj_type rx_queue_ktype = {
|
static const struct kobj_type rx_queue_ktype = {
|
||||||
@@ -1931,24 +1931,24 @@ static void netdev_queue_release(struct kobject *kobj)
|
|||||||
netdev_put(queue->dev, &queue->dev_tracker);
|
netdev_put(queue->dev, &queue->dev_tracker);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const void *netdev_queue_namespace(const struct kobject *kobj)
|
static const struct ns_common *netdev_queue_namespace(const struct kobject *kobj)
|
||||||
{
|
{
|
||||||
struct netdev_queue *queue = to_netdev_queue(kobj);
|
struct netdev_queue *queue = to_netdev_queue(kobj);
|
||||||
struct device *dev = &queue->dev->dev;
|
struct device *dev = &queue->dev->dev;
|
||||||
const void *ns = NULL;
|
|
||||||
|
|
||||||
if (dev->class && dev->class->namespace)
|
if (dev->class && dev->class->namespace)
|
||||||
ns = dev->class->namespace(dev);
|
return dev->class->namespace(dev);
|
||||||
|
|
||||||
return ns;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void netdev_queue_get_ownership(const struct kobject *kobj,
|
static void netdev_queue_get_ownership(const struct kobject *kobj,
|
||||||
kuid_t *uid, kgid_t *gid)
|
kuid_t *uid, kgid_t *gid)
|
||||||
{
|
{
|
||||||
const struct net *net = netdev_queue_namespace(kobj);
|
const struct ns_common *ns = netdev_queue_namespace(kobj);
|
||||||
|
|
||||||
net_ns_get_ownership(net, uid, gid);
|
net_ns_get_ownership(ns ? container_of(ns, struct net, ns) : NULL,
|
||||||
|
uid, gid);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct kobj_type netdev_queue_ktype = {
|
static const struct kobj_type netdev_queue_ktype = {
|
||||||
@@ -2185,24 +2185,24 @@ static bool net_current_may_mount(void)
|
|||||||
return ns_capable(net->user_ns, CAP_SYS_ADMIN);
|
return ns_capable(net->user_ns, CAP_SYS_ADMIN);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *net_grab_current_ns(void)
|
static struct ns_common *net_grab_current_ns(void)
|
||||||
{
|
{
|
||||||
struct net *ns = current->nsproxy->net_ns;
|
struct net *net = current->nsproxy->net_ns;
|
||||||
#ifdef CONFIG_NET_NS
|
#ifdef CONFIG_NET_NS
|
||||||
if (ns)
|
if (net)
|
||||||
refcount_inc(&ns->passive);
|
refcount_inc(&net->passive);
|
||||||
#endif
|
#endif
|
||||||
return ns;
|
return net ? to_ns_common(net) : NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const void *net_initial_ns(void)
|
static const struct ns_common *net_initial_ns(void)
|
||||||
{
|
{
|
||||||
return &init_net;
|
return to_ns_common(&init_net);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const void *net_netlink_ns(struct sock *sk)
|
static const struct ns_common *net_netlink_ns(struct sock *sk)
|
||||||
{
|
{
|
||||||
return sock_net(sk);
|
return to_ns_common(sock_net(sk));
|
||||||
}
|
}
|
||||||
|
|
||||||
const struct kobj_ns_type_operations net_ns_type_operations = {
|
const struct kobj_ns_type_operations net_ns_type_operations = {
|
||||||
@@ -2252,11 +2252,11 @@ static void netdev_release(struct device *d)
|
|||||||
kvfree(dev);
|
kvfree(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const void *net_namespace(const struct device *d)
|
static const struct ns_common *net_namespace(const struct device *d)
|
||||||
{
|
{
|
||||||
const struct net_device *dev = to_net_dev(d);
|
const struct net_device *dev = to_net_dev(d);
|
||||||
|
|
||||||
return dev_net(dev);
|
return to_ns_common(dev_net(dev));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void net_get_ownership(const struct device *d, kuid_t *uid, kgid_t *gid)
|
static void net_get_ownership(const struct device *d, kuid_t *uid, kgid_t *gid)
|
||||||
@@ -2402,14 +2402,14 @@ int netdev_change_owner(struct net_device *ndev, const struct net *net_old,
|
|||||||
}
|
}
|
||||||
|
|
||||||
int netdev_class_create_file_ns(const struct class_attribute *class_attr,
|
int netdev_class_create_file_ns(const struct class_attribute *class_attr,
|
||||||
const void *ns)
|
const struct ns_common *ns)
|
||||||
{
|
{
|
||||||
return class_create_file_ns(&net_class, class_attr, ns);
|
return class_create_file_ns(&net_class, class_attr, ns);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(netdev_class_create_file_ns);
|
EXPORT_SYMBOL(netdev_class_create_file_ns);
|
||||||
|
|
||||||
void netdev_class_remove_file_ns(const struct class_attribute *class_attr,
|
void netdev_class_remove_file_ns(const struct class_attribute *class_attr,
|
||||||
const void *ns)
|
const struct ns_common *ns)
|
||||||
{
|
{
|
||||||
class_remove_file_ns(&net_class, class_attr, ns);
|
class_remove_file_ns(&net_class, class_attr, ns);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -540,12 +540,10 @@ void net_passive_dec(struct net *net)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void net_drop_ns(void *p)
|
void net_drop_ns(struct ns_common *ns)
|
||||||
{
|
{
|
||||||
struct net *net = (struct net *)p;
|
if (ns)
|
||||||
|
net_passive_dec(to_net_ns(ns));
|
||||||
if (net)
|
|
||||||
net_passive_dec(net);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct net *copy_net_ns(u64 flags,
|
struct net *copy_net_ns(u64 flags,
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
#include <linux/kobject.h>
|
#include <linux/kobject.h>
|
||||||
#include <linux/sunrpc/addr.h>
|
#include <linux/sunrpc/addr.h>
|
||||||
#include <linux/sunrpc/xprtsock.h>
|
#include <linux/sunrpc/xprtsock.h>
|
||||||
|
#include <net/net_namespace.h>
|
||||||
|
|
||||||
#include "sysfs.h"
|
#include "sysfs.h"
|
||||||
|
|
||||||
@@ -553,20 +554,22 @@ static void rpc_sysfs_xprt_release(struct kobject *kobj)
|
|||||||
kfree(xprt);
|
kfree(xprt);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const void *rpc_sysfs_client_namespace(const struct kobject *kobj)
|
static const struct ns_common *rpc_sysfs_client_namespace(const struct kobject *kobj)
|
||||||
{
|
{
|
||||||
return container_of(kobj, struct rpc_sysfs_client, kobject)->net;
|
return to_ns_common(container_of(kobj, struct rpc_sysfs_client,
|
||||||
|
kobject)->net);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const void *rpc_sysfs_xprt_switch_namespace(const struct kobject *kobj)
|
static const struct ns_common *rpc_sysfs_xprt_switch_namespace(const struct kobject *kobj)
|
||||||
{
|
{
|
||||||
return container_of(kobj, struct rpc_sysfs_xprt_switch, kobject)->net;
|
return to_ns_common(container_of(kobj, struct rpc_sysfs_xprt_switch,
|
||||||
|
kobject)->net);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const void *rpc_sysfs_xprt_namespace(const struct kobject *kobj)
|
static const struct ns_common *rpc_sysfs_xprt_namespace(const struct kobject *kobj)
|
||||||
{
|
{
|
||||||
return container_of(kobj, struct rpc_sysfs_xprt,
|
return to_ns_common(container_of(kobj, struct rpc_sysfs_xprt,
|
||||||
kobject)->xprt->xprt_net;
|
kobject)->xprt->xprt_net);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct kobj_attribute rpc_sysfs_clnt_version = __ATTR(rpc_version,
|
static struct kobj_attribute rpc_sysfs_clnt_version = __ATTR(rpc_version,
|
||||||
|
|||||||
@@ -154,11 +154,11 @@ static SIMPLE_DEV_PM_OPS(wiphy_pm_ops, wiphy_suspend, wiphy_resume);
|
|||||||
#define WIPHY_PM_OPS NULL
|
#define WIPHY_PM_OPS NULL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static const void *wiphy_namespace(const struct device *d)
|
static const struct ns_common *wiphy_namespace(const struct device *d)
|
||||||
{
|
{
|
||||||
struct wiphy *wiphy = container_of(d, struct wiphy, dev);
|
struct wiphy *wiphy = container_of(d, struct wiphy, dev);
|
||||||
|
|
||||||
return wiphy_net(wiphy);
|
return to_ns_common(wiphy_net(wiphy));
|
||||||
}
|
}
|
||||||
|
|
||||||
struct class ieee80211_class = {
|
struct class ieee80211_class = {
|
||||||
|
|||||||
Reference in New Issue
Block a user