diff options
| author | Al Viro <viro@zeniv.linux.org.uk> | 2025-08-20 20:19:05 -0400 |
|---|---|---|
| committer | Al Viro <viro@zeniv.linux.org.uk> | 2025-09-02 19:35:56 -0400 |
| commit | 7b99ee2c5c83b2df03c50bb2d61bdceb76189352 (patch) | |
| tree | 232cb793524fcbb50aa4db2710587455df2d5b63 /fs/namespace.c | |
| parent | 12cdd1af7a6d123fc4690bae1807d8c90c5c5580 (diff) | |
| download | random-7b99ee2c5c83b2df03c50bb2d61bdceb76189352.tar.gz | |
do_set_group(): use guards
clean fit; namespace_excl to modify propagation graph
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 | 33 |
1 files changed, 13 insertions, 20 deletions
diff --git a/fs/namespace.c b/fs/namespace.c index a6a7b068770a43..13e2f3837a2695 100644 --- a/fs/namespace.c +++ b/fs/namespace.c @@ -3349,47 +3349,44 @@ static inline int tree_contains_unbindable(struct mount *mnt) static int do_set_group(struct path *from_path, struct path *to_path) { - struct mount *from, *to; + struct mount *from = real_mount(from_path->mnt); + struct mount *to = real_mount(to_path->mnt); int err; - from = real_mount(from_path->mnt); - to = real_mount(to_path->mnt); - - namespace_lock(); + guard(namespace_excl)(); err = may_change_propagation(from); if (err) - goto out; + return err; err = may_change_propagation(to); if (err) - goto out; + return err; - err = -EINVAL; /* To and From paths should be mount roots */ if (!path_mounted(from_path)) - goto out; + return -EINVAL; if (!path_mounted(to_path)) - goto out; + return -EINVAL; /* Setting sharing groups is only allowed across same superblock */ if (from->mnt.mnt_sb != to->mnt.mnt_sb) - goto out; + return -EINVAL; /* From mount root should be wider than To mount root */ if (!is_subdir(to->mnt.mnt_root, from->mnt.mnt_root)) - goto out; + return -EINVAL; /* From mount should not have locked children in place of To's root */ if (__has_locked_children(from, to->mnt.mnt_root)) - goto out; + return -EINVAL; /* Setting sharing groups is only allowed on private mounts */ if (IS_MNT_SHARED(to) || IS_MNT_SLAVE(to)) - goto out; + return -EINVAL; /* From should not be private */ if (!IS_MNT_SHARED(from) && !IS_MNT_SLAVE(from)) - goto out; + return -EINVAL; if (IS_MNT_SLAVE(from)) { hlist_add_behind(&to->mnt_slave, &from->mnt_slave); @@ -3401,11 +3398,7 @@ static int do_set_group(struct path *from_path, struct path *to_path) list_add(&to->mnt_share, &from->mnt_share); set_mnt_shared(to); } - - err = 0; -out: - namespace_unlock(); - return err; + return 0; } /** |
