]> www.infradead.org Git - users/hch/misc.git/commitdiff
current_chrooted(): don't bother with follow_down_one()
authorAl Viro <viro@zeniv.linux.org.uk>
Wed, 2 Jul 2025 05:39:45 +0000 (01:39 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Tue, 2 Sep 2025 23:35:57 +0000 (19:35 -0400)
All we need here is to follow ->overmount on root mount of namespace...

Reviewed-by: Christian Brauner <brauner@kernel.org>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/namespace.c

index 6aabf0045389c5ebfda7c1e4725143c7fffa0732..cf680fbf015e9fc856d3e1ca425ecbee0761bf63 100644 (file)
@@ -6194,24 +6194,22 @@ bool our_mnt(struct vfsmount *mnt)
 bool current_chrooted(void)
 {
        /* Does the current process have a non-standard root */
-       struct path ns_root;
+       struct mount *root = current->nsproxy->mnt_ns->root;
        struct path fs_root;
        bool chrooted;
 
+       get_fs_root(current->fs, &fs_root);
+
        /* Find the namespace root */
-       ns_root.mnt = &current->nsproxy->mnt_ns->root->mnt;
-       ns_root.dentry = ns_root.mnt->mnt_root;
-       path_get(&ns_root);
-       while (d_mountpoint(ns_root.dentry) && follow_down_one(&ns_root))
-               ;
+       read_seqlock_excl(&mount_lock);
 
-       get_fs_root(current->fs, &fs_root);
+       while (unlikely(root->overmount))
+               root = root->overmount;
 
-       chrooted = !path_equal(&fs_root, &ns_root);
+       chrooted = fs_root.mnt != &root->mnt || !path_mounted(&fs_root);
 
+       read_sequnlock_excl(&mount_lock);
        path_put(&fs_root);
-       path_put(&ns_root);
-
        return chrooted;
 }