]> www.infradead.org Git - users/hch/misc.git/commitdiff
pivot_root(2): use __free() to deal with struct path in it
authorAl Viro <viro@zeniv.linux.org.uk>
Fri, 22 Aug 2025 02:40:14 +0000 (22:40 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Tue, 2 Sep 2025 23:35:58 +0000 (19:35 -0400)
preparations for making unlock_mount() a __cleanup();
can't have path_put() inside mount_lock scope.

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

index 245cf2d19a6b0f8f2f650eb97b8609855ccde8fa..90b62ee882da06d542d79fc01188c01d618ceab1 100644 (file)
@@ -4622,7 +4622,9 @@ EXPORT_SYMBOL(path_is_under);
 SYSCALL_DEFINE2(pivot_root, const char __user *, new_root,
                const char __user *, put_old)
 {
-       struct path new, old, root;
+       struct path new __free(path_put) = {};
+       struct path old __free(path_put) = {};
+       struct path root __free(path_put) = {};
        struct mount *new_mnt, *root_mnt, *old_mnt, *root_parent, *ex_parent;
        struct pinned_mountpoint old_mp = {};
        int error;
@@ -4633,21 +4635,21 @@ SYSCALL_DEFINE2(pivot_root, const char __user *, new_root,
        error = user_path_at(AT_FDCWD, new_root,
                             LOOKUP_FOLLOW | LOOKUP_DIRECTORY, &new);
        if (error)
-               goto out0;
+               return error;
 
        error = user_path_at(AT_FDCWD, put_old,
                             LOOKUP_FOLLOW | LOOKUP_DIRECTORY, &old);
        if (error)
-               goto out1;
+               return error;
 
        error = security_sb_pivotroot(&old, &new);
        if (error)
-               goto out2;
+               return error;
 
        get_fs_root(current->fs, &root);
        error = lock_mount(&old, &old_mp);
        if (error)
-               goto out3;
+               return error;
 
        error = -EINVAL;
        new_mnt = real_mount(new.mnt);
@@ -4705,13 +4707,6 @@ SYSCALL_DEFINE2(pivot_root, const char __user *, new_root,
        error = 0;
 out4:
        unlock_mount(&old_mp);
-out3:
-       path_put(&root);
-out2:
-       path_put(&old);
-out1:
-       path_put(&new);
-out0:
        return error;
 }