summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Brauner <brauner@kernel.org>2024-06-07 16:55:36 +0200
committerChristian Brauner <brauner@kernel.org>2024-06-28 09:53:29 +0200
commit17e70161281bb66316e94e63a15d1a8498bf6f01 (patch)
tree20774dc6ebca2e6fd298ee39dea28868413e45bb
parentfs: don't copy to userspace under namespace semaphore (diff)
downloadlinux-17e70161281bb66316e94e63a15d1a8498bf6f01.tar.xz
linux-17e70161281bb66316e94e63a15d1a8498bf6f01.zip
fs: simplify error handling
Rely on cleanup helper and simplify error handling Link: https://lore.kernel.org/r/20240607-vfs-listmount-reverse-v1-3-7877a2bfa5e5@kernel.org Reviewed-by: Josef Bacik <josef@toxicpanda.com> Signed-off-by: Christian Brauner <brauner@kernel.org>
-rw-r--r--fs/namespace.c18
1 files changed, 6 insertions, 12 deletions
diff --git a/fs/namespace.c b/fs/namespace.c
index 57311ecbdf5a..98671cd89511 100644
--- a/fs/namespace.c
+++ b/fs/namespace.c
@@ -5050,7 +5050,7 @@ static struct mount *listmnt_next(struct mount *curr)
static ssize_t do_listmount(u64 mnt_parent_id, u64 last_mnt_id, u64 *mnt_ids,
size_t nr_mnt_ids)
{
- struct path root;
+ struct path root __free(path_put) = {};
struct mnt_namespace *ns = current->nsproxy->mnt_ns;
struct path orig;
struct mount *r, *first;
@@ -5063,10 +5063,8 @@ static ssize_t do_listmount(u64 mnt_parent_id, u64 last_mnt_id, u64 *mnt_ids,
orig = root;
} else {
orig.mnt = lookup_mnt_in_ns(mnt_parent_id, ns);
- if (!orig.mnt) {
- ret = -ENOENT;
- goto err;
- }
+ if (!orig.mnt)
+ return -ENOENT;
orig.dentry = orig.mnt->mnt_root;
}
@@ -5075,14 +5073,12 @@ static ssize_t do_listmount(u64 mnt_parent_id, u64 last_mnt_id, u64 *mnt_ids,
* mounts to show users.
*/
if (!is_path_reachable(real_mount(orig.mnt), orig.dentry, &root) &&
- !ns_capable_noaudit(&init_user_ns, CAP_SYS_ADMIN)) {
- ret = -EPERM;
- goto err;
- }
+ !ns_capable_noaudit(&init_user_ns, CAP_SYS_ADMIN))
+ return -EPERM;
ret = security_sb_statfs(orig.dentry);
if (ret)
- goto err;
+ return ret;
if (!last_mnt_id)
first = node_to_mount(rb_first(&ns->mounts));
@@ -5099,8 +5095,6 @@ static ssize_t do_listmount(u64 mnt_parent_id, u64 last_mnt_id, u64 *mnt_ids,
nr_mnt_ids--;
ret++;
}
-err:
- path_put(&root);
return ret;
}