]> www.infradead.org Git - users/hch/misc.git/commitdiff
finish_automount(): use __free() to deal with dropping mnt on failure
authorAl Viro <viro@zeniv.linux.org.uk>
Fri, 22 Aug 2025 02:53:06 +0000 (22:53 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Tue, 2 Sep 2025 23:35:59 +0000 (19:35 -0400)
same story as with do_new_mount_fc().

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

index 3551e51461a2d705f559e96c5d63f97d528b4094..779cfed04291609068f54ad5183c18776813cc42 100644 (file)
@@ -3801,8 +3801,9 @@ static int lock_mount_exact(const struct path *path,
        return err;
 }
 
-int finish_automount(struct vfsmount *m, const struct path *path)
+int finish_automount(struct vfsmount *__m, const struct path *path)
 {
+       struct vfsmount *m __free(mntput) = __m;
        struct pinned_mountpoint mp = {};
        struct mount *mnt;
        int err;
@@ -3814,10 +3815,8 @@ int finish_automount(struct vfsmount *m, const struct path *path)
 
        mnt = real_mount(m);
 
-       if (m->mnt_root == path->dentry) {
-               err = -ELOOP;
-               goto discard;
-       }
+       if (m->mnt_root == path->dentry)
+               return -ELOOP;
 
        /*
         * we don't want to use lock_mount() - in this case finding something
@@ -3825,19 +3824,14 @@ int finish_automount(struct vfsmount *m, const struct path *path)
         * got", not "try to mount it on top".
         */
        err = lock_mount_exact(path, &mp);
-       if (unlikely(err)) {
-               mntput(m);
+       if (unlikely(err))
                return err == -EBUSY ? 0 : err;
-       }
+
        err = do_add_mount(mnt, mp.mp, path,
                           path->mnt->mnt_flags | MNT_SHRINKABLE);
+       if (likely(!err))
+               retain_and_null_ptr(m);
        unlock_mount(&mp);
-       if (unlikely(err))
-               goto discard;
-       return 0;
-
-discard:
-       mntput(m);
        return err;
 }