]> www.infradead.org Git - users/hch/misc.git/commitdiff
do_new_mount_fc(): use __free() to deal with dropping mnt on failure
authorAl Viro <viro@zeniv.linux.org.uk>
Fri, 22 Aug 2025 02:43:32 +0000 (22:43 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Tue, 2 Sep 2025 23:35:59 +0000 (19:35 -0400)
do_add_mount() consumes vfsmount on success; just follow it with
conditional retain_and_null_ptr() on success and we can switch
to __free() for mnt and be done with that - unlock_mount() is
in the very end.

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

index 6251ee15f5f65a41e3ede3e5b73b63880561da77..3551e51461a2d705f559e96c5d63f97d528b4094 100644 (file)
@@ -3696,7 +3696,7 @@ static int do_new_mount_fc(struct fs_context *fc, struct path *mountpoint,
 {
        struct pinned_mountpoint mp = {};
        struct super_block *sb;
-       struct vfsmount *mnt = fc_mount(fc);
+       struct vfsmount *mnt __free(mntput) = fc_mount(fc);
        int error;
 
        if (IS_ERR(mnt))
@@ -3704,10 +3704,11 @@ static int do_new_mount_fc(struct fs_context *fc, struct path *mountpoint,
 
        sb = fc->root->d_sb;
        error = security_sb_kern_mount(sb);
-       if (!error && mount_too_revealing(sb, &mnt_flags))
-               error = -EPERM;
        if (unlikely(error))
-               goto out;
+               return error;
+
+       if (unlikely(mount_too_revealing(sb, &mnt_flags)))
+               return -EPERM;
 
        mnt_warn_timestamp_expiry(mountpoint, mnt);
 
@@ -3716,11 +3717,9 @@ static int do_new_mount_fc(struct fs_context *fc, struct path *mountpoint,
                error = do_add_mount(real_mount(mnt), mp.mp,
                                     mountpoint, mnt_flags);
                if (!error)
-                       mnt = NULL;     // consumed on success
+                       retain_and_null_ptr(mnt); // consumed on success
                unlock_mount(&mp);
        }
-out:
-       mntput(mnt);
        return error;
 }