]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
mnt: expose pointer to init_mnt_ns
authorChristian Brauner <brauner@kernel.org>
Wed, 17 Sep 2025 10:28:01 +0000 (12:28 +0200)
committerChristian Brauner <brauner@kernel.org>
Fri, 19 Sep 2025 12:26:18 +0000 (14:26 +0200)
There's various scenarios where we need to know whether we are in the
initial set of namespaces or not to e.g., shortcut permission checking.
All namespaces expose that information. Let's do that too.

Reviewed-by: Jan Kara <jack@suse.cz>
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/namespace.c
include/linux/mnt_namespace.h

index a68998449698977c48de78f0f74b29703f5f156a..f0bddc9cf2a6d55de3ffdfa6c263131ec24ad692 100644 (file)
@@ -6008,27 +6008,32 @@ SYSCALL_DEFINE4(listmount, const struct mnt_id_req __user *, req,
        return ret;
 }
 
+struct mnt_namespace init_mnt_ns = {
+       .ns.inum        = PROC_MNT_INIT_INO,
+       .ns.ops         = &mntns_operations,
+       .user_ns        = &init_user_ns,
+       .ns.count       = REFCOUNT_INIT(1),
+       .passive        = REFCOUNT_INIT(1),
+       .mounts         = RB_ROOT,
+       .poll           = __WAIT_QUEUE_HEAD_INITIALIZER(init_mnt_ns.poll),
+};
+
 static void __init init_mount_tree(void)
 {
        struct vfsmount *mnt;
        struct mount *m;
-       struct mnt_namespace *ns;
        struct path root;
 
        mnt = vfs_kern_mount(&rootfs_fs_type, 0, "rootfs", NULL);
        if (IS_ERR(mnt))
                panic("Can't create rootfs");
 
-       ns = alloc_mnt_ns(&init_user_ns, true);
-       if (IS_ERR(ns))
-               panic("Can't allocate initial namespace");
-       ns->ns.inum = PROC_MNT_INIT_INO;
        m = real_mount(mnt);
-       ns->root = m;
-       ns->nr_mounts = 1;
-       mnt_add_to_ns(ns, m);
-       init_task.nsproxy->mnt_ns = ns;
-       get_mnt_ns(ns);
+       init_mnt_ns.root = m;
+       init_mnt_ns.nr_mounts = 1;
+       mnt_add_to_ns(&init_mnt_ns, m);
+       init_task.nsproxy->mnt_ns = &init_mnt_ns;
+       get_mnt_ns(&init_mnt_ns);
 
        root.mnt = mnt;
        root.dentry = mnt->mnt_root;
@@ -6036,7 +6041,7 @@ static void __init init_mount_tree(void)
        set_fs_pwd(current->fs, &root);
        set_fs_root(current->fs, &root);
 
-       ns_tree_add(ns);
+       ns_tree_add(&init_mnt_ns);
 }
 
 void __init mnt_init(void)
index 70b366b64816056618702e418a80d181fa51a746..6d1c4c218c14f89a1304302a68bbce4b74149abe 100644 (file)
@@ -11,6 +11,8 @@ struct fs_struct;
 struct user_namespace;
 struct ns_common;
 
+extern struct mnt_namespace init_mnt_ns;
+
 extern struct mnt_namespace *copy_mnt_ns(unsigned long, struct mnt_namespace *,
                struct user_namespace *, struct fs_struct *);
 extern void put_mnt_ns(struct mnt_namespace *ns);