diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2025-08-21 22:53:06 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2025-09-02 19:35:59 -0400 |
commit | f1f486b841c73e94167956e1885f865cac4e629f (patch) | |
tree | 50b96e99b5e7ba108cb78dfae0a355541c4b5a43 /fs/namespace.c | |
parent | 308a022f41bd3f12ceeda34f6d36bf8f2601d9ae (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.c | 22 |
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; } |