summaryrefslogtreecommitdiff
path: root/fs/namespace.c
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2025-08-21 22:53:06 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2025-09-02 19:35:59 -0400
commitf1f486b841c73e94167956e1885f865cac4e629f (patch)
tree50b96e99b5e7ba108cb78dfae0a355541c4b5a43 /fs/namespace.c
parent308a022f41bd3f12ceeda34f6d36bf8f2601d9ae (diff)
finish_automount(): use __free() to deal with dropping mnt on failure
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>
Diffstat (limited to 'fs/namespace.c')
-rw-r--r--fs/namespace.c22
1 files changed, 8 insertions, 14 deletions
diff --git a/fs/namespace.c b/fs/namespace.c
index 3551e51461a2..779cfed04291 100644
--- a/fs/namespace.c
+++ b/fs/namespace.c
@@ -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;
}