]> www.infradead.org Git - users/hch/misc.git/commitdiff
open_detached_copy(): separate creation of namespace into helper
authorAl Viro <viro@zeniv.linux.org.uk>
Tue, 26 Aug 2025 20:59:16 +0000 (16:59 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Tue, 16 Sep 2025 01:26:44 +0000 (21:26 -0400)
... and convert the helper to use of a guard(namespace_excl)

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

index 468ae0cb475e8611877f9106e68acbf74ccf73af..4ebd9cc6f6c6e321b54f1d55f1416b779a98a28d 100644 (file)
@@ -3047,18 +3047,17 @@ static int do_loopback(const struct path *path, const char *old_name,
        return err;
 }
 
-static struct file *open_detached_copy(struct path *path, bool recursive)
+static struct mnt_namespace *get_detached_copy(const struct path *path, bool recursive)
 {
        struct mnt_namespace *ns, *mnt_ns = current->nsproxy->mnt_ns, *src_mnt_ns;
        struct user_namespace *user_ns = mnt_ns->user_ns;
        struct mount *mnt, *p;
-       struct file *file;
 
        ns = alloc_mnt_ns(user_ns, true);
        if (IS_ERR(ns))
-               return ERR_CAST(ns);
+               return ns;
 
-       namespace_lock();
+       guard(namespace_excl)();
 
        /*
         * Record the sequence number of the source mount namespace.
@@ -3075,8 +3074,7 @@ static struct file *open_detached_copy(struct path *path, bool recursive)
 
        mnt = __do_loopback(path, recursive);
        if (IS_ERR(mnt)) {
-               namespace_unlock();
-               free_mnt_ns(ns);
+               emptied_ns = ns;
                return ERR_CAST(mnt);
        }
 
@@ -3085,11 +3083,19 @@ static struct file *open_detached_copy(struct path *path, bool recursive)
                ns->nr_mounts++;
        }
        ns->root = mnt;
-       mntget(&mnt->mnt);
-       namespace_unlock();
+       return ns;
+}
+
+static struct file *open_detached_copy(struct path *path, bool recursive)
+{
+       struct mnt_namespace *ns = get_detached_copy(path, recursive);
+       struct file *file;
+
+       if (IS_ERR(ns))
+               return ERR_CAST(ns);
 
        mntput(path->mnt);
-       path->mnt = &mnt->mnt;
+       path->mnt = mntget(&ns->root->mnt);
        file = dentry_open(path, O_PATH, current_cred());
        if (IS_ERR(file))
                dissolve_on_fput(path->mnt);