diff options
| author | 2025-08-21 22:53:06 -0400 | |
|---|---|---|
| committer | 2025-09-02 19:35:59 -0400 | |
| commit | f1f486b841c73e94167956e1885f865cac4e629f (patch) | |
| tree | 50b96e99b5e7ba108cb78dfae0a355541c4b5a43 | |
| parent | do_new_mount_fc(): use __free() to deal with dropping mnt on failure (diff) | |
| download | wireguard-linux-f1f486b841c73e94167956e1885f865cac4e629f.tar.xz wireguard-linux-f1f486b841c73e94167956e1885f865cac4e629f.zip | |
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 '')
| -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; } |
