]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
kernfs: pass struct ns_common instead of const void * for namespace tags
authorChristian Brauner <brauner@kernel.org>
Wed, 1 Apr 2026 10:15:58 +0000 (12:15 +0200)
committerChristian Brauner <brauner@kernel.org>
Thu, 9 Apr 2026 12:36:52 +0000 (14:36 +0200)
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>
30 files changed:
drivers/base/class.c
drivers/base/core.c
drivers/infiniband/core/device.c
drivers/infiniband/ulp/srp/ib_srp.c
drivers/net/bonding/bond_sysfs.c
drivers/net/ipvlan/ipvtap.c
drivers/net/macvtap.c
fs/kernfs/dir.c
fs/kernfs/file.c
fs/kernfs/kernfs-internal.h
fs/kernfs/mount.c
fs/nfs/sysfs.c
fs/sysfs/dir.c
fs/sysfs/file.c
fs/sysfs/mount.c
fs/sysfs/symlink.c
fs/sysfs/sysfs.h
include/linux/device/class.h
include/linux/kernfs.h
include/linux/kobject.h
include/linux/kobject_ns.h
include/linux/netdevice.h
include/linux/sysfs.h
include/net/net_namespace.h
lib/kobject.c
lib/kobject_uevent.c
net/core/net-sysfs.c
net/core/net_namespace.c
net/sunrpc/sysfs.c
net/wireless/sysfs.c

index 827fc7adacc7e2f74bc34dbe332e76eba017c340..ffab0a9c8ccbaece83b5a19b6ec1664e26cab584 100644 (file)
@@ -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,
-                        const void *ns)
+                        const struct ns_common *ns)
 {
        struct subsys_private *sp = class_to_subsys(cls);
        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);
 
 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);
 
index 09b98f02f559d073c892648dbe49c60317df432b..0613de0fbe44dcab7cf8a9fa601d34f7dba706e3 100644 (file)
@@ -2570,15 +2570,14 @@ static void device_release(struct kobject *kobj)
        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 void *ns = NULL;
 
        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)
index 558b73940d66816bde7e41946a90e8f078a18f29..7945614be36d47d0ebbe91a204528532e5953b39 100644 (file)
@@ -509,12 +509,13 @@ static int ib_device_uevent(const struct device *device,
        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 =
                        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 = {
index 30339dcabb4d13839c206ef126a2679dd13ace98..b58868e1cf11c2cd097a3efc6ff74aa3b5050847 100644 (file)
@@ -43,6 +43,7 @@
 #include <linux/jiffies.h>
 #include <linux/lockdep.h>
 #include <linux/inet.h>
+#include <net/net_namespace.h>
 #include <rdma/ib_cache.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);
        srp_stop_rport_timers(target->rport);
        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++) {
                ch = &target->ch[i];
                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->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->scsi_host       = target_host;
        target->srp_host        = host;
@@ -3905,7 +3906,7 @@ put:
                 * earlier in this function.
                 */
                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);
        }
 
index 9a75ad3181ab5c7eeaddd1362bf2da01be0088fb..eaba44c76a5ec69fb677d1e0698ab515e1fa82b3 100644 (file)
@@ -808,7 +808,7 @@ int __net_init bond_create_sysfs(struct bond_net *bn)
        sysfs_attr_init(&bn->class_attr_bonding_masters.attr);
 
        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
         * create the bonding_masters sysfs file.  Bonding devices
         * 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. */
 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
index edd13916831a7c8fe90bfaece5a696e3e2803b17..2d6bbddd1edd51dbb76e91b375ab3ea3dc291304 100644 (file)
 static dev_t ipvtap_major;
 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);
-       return dev_net(dev);
+
+       return to_ns_common(dev_net(dev));
 }
 
 static struct class ipvtap_class = {
index b391a0f740a3f3a8b45c5adc7ca378ac8cc310cf..cc975dfb738051cd43d70e6b95d7499400e345aa 100644 (file)
@@ -35,10 +35,11 @@ struct macvtap_dev {
  */
 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);
-       return dev_net(dev);
+
+       return to_ns_common(dev_net(dev));
 }
 
 static struct class macvtap_class = {
index 8d40c4b1db9fff83e09b0ec9c8e4e47ef5ebf1ad..be262145ae0847551f6ff39df0e03f5dc54fcfde 100644 (file)
@@ -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)
  */
-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 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,
-                              const void *ns, const struct kernfs_node *kn)
+                              const struct ns_common *ns, const struct kernfs_node *kn)
 {
        if (hash < kn->hash)
                return -1;
@@ -856,7 +857,7 @@ out_unlock:
  */
 static struct kernfs_node *kernfs_find_ns(struct kernfs_node *parent,
                                          const unsigned char *name,
-                                         const void *ns)
+                                         const struct ns_common *ns)
 {
        struct rb_node *node = parent->dir.children.rb_node;
        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,
                                          const unsigned char *path,
-                                         const void *ns)
+                                         const struct ns_common *ns)
 {
        ssize_t len;
        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.
  */
 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_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.
  */
 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_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,
                                         const char *name, umode_t mode,
                                         kuid_t uid, kgid_t gid,
-                                        void *priv, const void *ns)
+                                        void *priv,
+                                        const struct ns_common *ns)
 {
        struct kernfs_node *kn;
        int rc;
@@ -1221,7 +1225,7 @@ static struct dentry *kernfs_iop_lookup(struct inode *dir,
        struct kernfs_node *kn;
        struct kernfs_root *root;
        struct inode *inode = NULL;
-       const void *ns = NULL;
+       const struct ns_common *ns = NULL;
 
        root = kernfs_root(parent);
        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.
  */
 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_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.
  */
 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_root *root;
@@ -1832,7 +1836,7 @@ static int kernfs_dir_fop_release(struct inode *inode, struct file *filp)
        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)
 {
        if (pos) {
@@ -1867,7 +1871,7 @@ static struct kernfs_node *kernfs_dir_pos(const void *ns,
        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)
 {
        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 *pos = file->private_data;
        struct kernfs_root *root;
-       const void *ns = NULL;
+       const struct ns_common *ns = NULL;
 
        if (!dir_emit_dots(file, ctx))
                return 0;
index e32406d62c0d366da4fe14604abf8b0a45a057ae..1163aa769738498890cc53ac09ef95d0b06b487e 100644 (file)
@@ -1045,7 +1045,7 @@ struct kernfs_node *__kernfs_create_file(struct kernfs_node *parent,
                                         umode_t mode, kuid_t uid, kgid_t gid,
                                         loff_t size,
                                         const struct kernfs_ops *ops,
-                                        void *priv, const void *ns,
+                                        void *priv, const struct ns_common *ns,
                                         struct lock_class_key *key)
 {
        struct kernfs_node *kn;
index 6061b6f70d2a3c43ed167785036980f8e95c36dc..b1fd9622a5e34dfea959706a63d768cb819dadba 100644 (file)
@@ -97,7 +97,7 @@ struct kernfs_super_info {
         * instance.  If multiple tags become necessary, make the following
         * 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 */
        struct list_head        node;
index 048f00b73b7173fa61e37d4089182b91c0e6c132..6e3217b6e4811a2d5dce76819c2745b86c873f5a 100644 (file)
@@ -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.
  */
-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);
 
index 7d8921f524a694ea7eaca1817d4f7a194cc6da40..1da4f707f9efeed0c7b22b030b4ed4d96b55ead4 100644 (file)
@@ -11,6 +11,7 @@
 #include <linux/netdevice.h>
 #include <linux/string.h>
 #include <linux/nfs_fs.h>
+#include <net/net_namespace.h>
 #include <linux/rcupdate.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));
 }
 
-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,
@@ -156,9 +158,10 @@ static void nfs_netns_object_release(struct kobject *kobj)
        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 = {
@@ -350,9 +353,10 @@ static void nfs_sysfs_sb_release(struct kobject *kobj)
        /* 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 = {
index 94e12efd92f216888e82b6c80e04cfc964fae945..ffdcd4153c5848633ae7737c10ea6efc6b11ef35 100644 (file)
@@ -37,7 +37,7 @@ void sysfs_warn_dup(struct kernfs_node *parent, const char *name)
  * @kobj: object we're creating directory for
  * @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;
        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,
-                       const void *new_ns)
+                       const struct ns_common *new_ns)
 {
        struct kernfs_node *parent;
        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,
-                     const void *new_ns)
+                     const struct ns_common *new_ns)
 {
        struct kernfs_node *kn = kobj->sd;
        struct kernfs_node *new_parent;
index a8176c875f55e707da5927d619cfbde235937e09..5709cede1d75689b4f08772ffcc4aabc8ec66970 100644 (file)
@@ -272,7 +272,7 @@ static const struct kernfs_ops sysfs_bin_kfops_mmap = {
 
 int sysfs_add_file_mode_ns(struct kernfs_node *parent,
                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;
        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,
                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;
        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
  */
 int sysfs_create_file_ns(struct kobject *kobj, const struct attribute *attr,
-                        const void *ns)
+                        const struct ns_common *ns)
 {
        kuid_t uid;
        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.
  */
 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;
 
index e65c60158a04ac0705878bee444ec19540d104ab..b199e8ff79b1f93ef8708b0927ba33c2c6ff10fd 100644 (file)
@@ -55,7 +55,7 @@ static const struct fs_context_operations sysfs_fs_context_ops = {
 static int sysfs_init_fs_context(struct fs_context *fc)
 {
        struct kernfs_fs_context *kfc;
-       struct net *netns;
+       struct ns_common *ns;
 
        if (!(fc->sb_flags & SB_KERNMOUNT)) {
                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)
                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->magic = SYSFS_MAGIC;
        fc->fs_private = kfc;
        fc->ops = &sysfs_fs_context_ops;
-       if (netns) {
+       if (ns) {
+               struct net *netns = to_net_ns(ns);
+
                put_user_ns(fc->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)
 {
-       void *ns = (void *)kernfs_super_ns(sb);
+       struct ns_common *ns = (struct ns_common *)kernfs_super_ns(sb);
 
        kernfs_kill_sb(sb);
        kobj_ns_drop(KOBJ_NS_TYPE_NET, ns);
index 5603530a1a520d9e481147bc58b9e1b4dc489db1..5f9c05fb13940b261c9a493ba36ed0df466abf7b 100644 (file)
@@ -121,7 +121,7 @@ EXPORT_SYMBOL_GPL(sysfs_create_link_nowarn);
 void sysfs_delete_link(struct kobject *kobj, struct kobject *targ,
                        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.
@@ -164,10 +164,11 @@ EXPORT_SYMBOL_GPL(sysfs_remove_link);
  *     A helper function for the common rename symlink idiom.
  */
 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;
-       const void *old_ns = NULL;
+       const struct ns_common *old_ns = NULL;
        int result;
 
        if (!kobj)
index 8e012f25e1c06e802c3138cc2715b46c1f67fa48..f4583dcafcd1efe1c750ce4f4e316f0b51128c27 100644 (file)
@@ -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,
                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,
                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
index 65880e60c720834f5a9cf102a93274e03300ce6c..021da0d61796a53a65bd9204854b349c19fae2c3 100644 (file)
@@ -62,7 +62,7 @@ struct class {
        int (*shutdown_pre)(struct device *dev);
 
        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);
 
@@ -180,9 +180,9 @@ struct class_attribute {
        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,
-                                     const void *ns);
+                                     const struct ns_common *ns);
 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,
                                                 const struct class_attribute *attr)
index b5a5f32fdfd1af90f662ee079b376fffc95be198..4f0ab88a1b31664100c312cbcbf5fc265a966b4b 100644 (file)
@@ -23,6 +23,7 @@
 struct file;
 struct dentry;
 struct iattr;
+struct ns_common;
 struct seq_file;
 struct vm_area_struct;
 struct vm_operations_struct;
@@ -209,7 +210,7 @@ struct kernfs_node {
 
        struct rb_node          rb;
 
-       const void              *ns;    /* namespace tag */
+       const struct ns_common  *ns;    /* namespace tag */
        unsigned int            hash;   /* ns + name hash */
        unsigned short          flags;
        umode_t                 mode;
@@ -331,7 +332,7 @@ struct kernfs_ops {
  */
 struct kernfs_fs_context {
        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 */
 
        /* 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);
 struct kernfs_node *kernfs_get_parent(struct kernfs_node *kn);
 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,
-                                          const char *path, const void *ns);
+                                          const char *path,
+                                          const struct ns_common *ns);
 void kernfs_get(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,
                                         const char *name, umode_t mode,
                                         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,
                                            const char *name);
 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,
                                         loff_t size,
                                         const struct kernfs_ops *ops,
-                                        void *priv, const void *ns,
+                                        void *priv,
+                                        const struct ns_common *ns,
                                         struct lock_class_key *key);
 struct kernfs_node *kernfs_create_link(struct kernfs_node *parent,
                                       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);
 bool kernfs_remove_self(struct kernfs_node *kn);
 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,
-                    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);
 __poll_t kernfs_generic_poll(struct kernfs_open_file *of,
                             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,
                     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);
 void kernfs_free_fs_context(struct fs_context *fc);
 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 *
 kernfs_find_and_get_ns(struct kernfs_node *parent, const char *name,
-                      const void *ns)
+                      const struct ns_common *ns)
 { return NULL; }
 static inline struct kernfs_node *
 kernfs_walk_and_get_ns(struct kernfs_node *parent, const char *path,
-                      const void *ns)
+                      const struct ns_common *ns)
 { return NULL; }
 
 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 *
 kernfs_create_dir_ns(struct kernfs_node *parent, const char *name,
                     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); }
 
 static inline struct kernfs_node *
 __kernfs_create_file(struct kernfs_node *parent, const char *name,
                     umode_t mode, kuid_t uid, kgid_t gid,
                     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); }
 
 static inline struct kernfs_node *
@@ -549,12 +555,14 @@ static inline bool kernfs_remove_self(struct kernfs_node *kn)
 { return false; }
 
 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; }
 
 static inline 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)
 { return -ENOSYS; }
 
 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)
 { 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; }
 
 static inline int kernfs_get_tree(struct fs_context *fc)
index c8219505a79f98bc370e52997efc8af51833cfda..bcb5d4e320015a75778fe3efebb86942ed22c206 100644 (file)
@@ -109,7 +109,7 @@ struct kobject *kobject_get(struct kobject *kobj);
 struct kobject * __must_check kobject_get_unless_zero(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);
 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 attribute_group **default_groups;
        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);
 };
 
index 150fe2ae1b6b257ad2f1466e98da4dc312c848b0..4f0990e09b93e1ca3be11d0c5cbae12cb79010e8 100644 (file)
@@ -16,6 +16,7 @@
 #ifndef _LINUX_KOBJECT_NS_H
 #define _LINUX_KOBJECT_NS_H
 
+struct ns_common;
 struct sock;
 struct kobject;
 
@@ -39,10 +40,10 @@ enum kobj_ns_type {
 struct kobj_ns_type_operations {
        enum kobj_ns_type type;
        bool (*current_may_mount)(void);
-       void *(*grab_current_ns)(void);
-       const void *(*netlink_ns)(struct sock *sk);
-       const void *(*initial_ns)(void);
-       void (*drop_ns)(void *);
+       struct ns_common *(*grab_current_ns)(void);
+       const struct ns_common *(*netlink_ns)(struct sock *sk);
+       const struct ns_common *(*initial_ns)(void);
+       void (*drop_ns)(struct ns_common *);
 };
 
 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);
 
 bool kobj_ns_current_may_mount(enum kobj_ns_type type);
-void *kobj_ns_grab_current(enum kobj_ns_type type);
-void kobj_ns_drop(enum kobj_ns_type type, void *ns);
+struct ns_common *kobj_ns_grab_current(enum kobj_ns_type type);
+void kobj_ns_drop(enum kobj_ns_type type, struct ns_common *ns);
 
 #endif /* _LINUX_KOBJECT_NS_H */
index 7ca01eb3f7d2b22a188502583dc95121adff7cc9..85c20bdd36fbdd07d50cf307a25435a00860c0f6 100644 (file)
@@ -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,
-                               const void *ns);
+                               const struct ns_common *ns);
 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;
 
index 99b775f3ff469f0ffb56b03f2e20ecde095eafc2..468259fb6049eee05fb435227f6b1586ee36b6d2 100644 (file)
@@ -396,13 +396,13 @@ struct sysfs_ops {
 
 #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);
 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,
                                   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,
                                          const char *name);
 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,
                                      const struct attribute *attr,
-                                     const void *ns);
+                                     const struct ns_common *ns);
 int __must_check sysfs_create_files(struct kobject *kobj,
                                   const struct attribute * const *attr);
 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);
 void sysfs_unbreak_active_protection(struct kernfs_node *kn);
 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);
 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,
                         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,
                        const char *name);
@@ -502,7 +502,7 @@ ssize_t sysfs_bin_attr_simple_read(struct file *file, struct kobject *kobj,
 
 #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;
 }
@@ -512,14 +512,14 @@ static inline void sysfs_remove_dir(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;
 }
 
 static inline int sysfs_move_dir_ns(struct kobject *kobj,
                                    struct kobject *new_parent_kobj,
-                                   const void *new_ns)
+                                   const struct ns_common *new_ns)
 {
        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,
                                       const struct attribute *attr,
-                                      const void *ns)
+                                      const struct ns_common *ns)
 {
        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,
                                        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,
                                       const char *old_name,
-                                      const char *new_name, const void *ns)
+                                      const char *new_name, const struct ns_common *ns)
 {
        return 0;
 }
index d7bec49ee9ea91b495f4d1cc297327ede093ae57..80de5e98a66d6c9273aa7c5b9d489b22cef8559a 100644 (file)
@@ -264,14 +264,14 @@ void ipx_unregister_sysctl(void);
 #define ipx_unregister_sysctl()
 #endif
 
-#ifdef CONFIG_NET_NS
-void __put_net(struct net *net);
-
 static inline struct net *to_net_ns(struct ns_common *ns)
 {
        return container_of(ns, struct net, ns);
 }
 
+#ifdef CONFIG_NET_NS
+void __put_net(struct net *net);
+
 /* Try using get_net_track() instead */
 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;
 }
 
-void net_drop_ns(void *);
+void net_drop_ns(struct ns_common *);
 void net_passive_dec(struct net *net);
 
 #else
index cfdb2c3f20a2ef0ffc74912ecac203a7570d5e22..9c9ff0f5175fb4a6576f83518144e4ba69ea4c2f 100644 (file)
@@ -27,7 +27,7 @@
  * and thus @kobj should have a namespace tag associated with it.  Returns
  * %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);
 
@@ -1083,9 +1083,9 @@ bool kobj_ns_current_may_mount(enum kobj_ns_type type)
        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);
        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);
 
-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);
        if (kobj_ns_type_is_valid(type) &&
index 871941c9830cf5bb9c77a25c3c4e9928fedab9c6..ddbc4d7482d2437ddb77b75721a6d909f64c9357 100644 (file)
@@ -238,7 +238,7 @@ static int kobj_usermode_filter(struct kobject *kobj)
 
        ops = kobj_ns_ops(kobj);
        if (ops) {
-               const void *init_ns, *ns;
+               const struct ns_common *init_ns, *ns;
 
                ns = kobj->ktype->namespace(kobj);
                init_ns = ops->initial_ns();
@@ -388,7 +388,7 @@ static int kobject_uevent_net_broadcast(struct kobject *kobj,
 
 #ifdef CONFIG_NET
        const struct kobj_ns_type_operations *ops;
-       const struct net *net = NULL;
+       const struct ns_common *ns = NULL;
 
        ops = kobj_ns_ops(kobj);
        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->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,
                                                    devpath);
-       else
+       else {
+               const struct net *net = container_of(ns, struct net, ns);
+
                ret = uevent_net_broadcast_tagged(net->uevent_sock->sk, env,
                                                  action_string, devpath);
+       }
 #endif
 
        return ret;
index 07624b682b08b24da790d377f1deec4dc0a84269..b9740a397f55b8313ec66490be520b050769f4b8 100644 (file)
@@ -1181,24 +1181,24 @@ static void rx_queue_release(struct kobject *kobj)
        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 device *dev = &queue->dev->dev;
-       const void *ns = NULL;
 
        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,
                                   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 = {
@@ -1931,24 +1931,24 @@ static void netdev_queue_release(struct kobject *kobj)
        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 device *dev = &queue->dev->dev;
-       const void *ns = NULL;
 
        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,
                                       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 = {
@@ -2185,24 +2185,24 @@ static bool net_current_may_mount(void)
        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
-       if (ns)
-               refcount_inc(&ns->passive);
+       if (net)
+               refcount_inc(&net->passive);
 #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 = {
@@ -2252,11 +2252,11 @@ static void netdev_release(struct device *d)
        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);
 
-       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)
@@ -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,
-                               const void *ns)
+                               const struct ns_common *ns)
 {
        return class_create_file_ns(&net_class, class_attr, ns);
 }
 EXPORT_SYMBOL(netdev_class_create_file_ns);
 
 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);
 }
index 1057d16d5dd28ae0a3facc7fabc6e4c7cebd5a45..24aa10a1d0eaa83f4e88ad7c36b817185b1ba31b 100644 (file)
@@ -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 (net)
-               net_passive_dec(net);
+       if (ns)
+               net_passive_dec(to_net_ns(ns));
 }
 
 struct net *copy_net_ns(u64 flags,
index af8fac9cedd448cfe495bfe80f099801215ad3a7..a90480f8015480b9af9f4083b92a1f7e51ef35f7 100644 (file)
@@ -6,6 +6,7 @@
 #include <linux/kobject.h>
 #include <linux/sunrpc/addr.h>
 #include <linux/sunrpc/xprtsock.h>
+#include <net/net_namespace.h>
 
 #include "sysfs.h"
 
@@ -553,20 +554,22 @@ static void rpc_sysfs_xprt_release(struct kobject *kobj)
        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,
-                           kobject)->xprt->xprt_net;
+       return to_ns_common(container_of(kobj, struct rpc_sysfs_xprt,
+                                        kobject)->xprt->xprt_net);
 }
 
 static struct kobj_attribute rpc_sysfs_clnt_version = __ATTR(rpc_version,
index 2e0ea69b9604e9e72629f1076d16d4fb97b93b7b..0b9abe70d39d86b5e226b8926bd5b780634ac841 100644 (file)
@@ -154,11 +154,11 @@ static SIMPLE_DEV_PM_OPS(wiphy_pm_ops, wiphy_suspend, wiphy_resume);
 #define WIPHY_PM_OPS NULL
 #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);
 
-       return wiphy_net(wiphy);
+       return to_ns_common(wiphy_net(wiphy));
 }
 
 struct class ieee80211_class = {