From: Al Viro Date: Wed, 20 Aug 2025 17:47:43 +0000 (-0400) Subject: do_move_mount(): use the parent mount returned by do_lock_mount() X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=842e12352c3074b8af1bc95cc2bb1e9fb47f4334;p=users%2Fhch%2Fmisc.git do_move_mount(): use the parent mount returned by do_lock_mount() After successful do_lock_mount() call, mp.parent is set to either real_mount(path->mnt) (for !beneath case) or to ->mnt_parent of that (for beneath). p is set to real_mount(path->mnt) and after several uses it's made equal to mp.parent. All uses prior to that care only about p->mnt_ns and since p->mnt_ns == parent->mnt_ns, we might as well use mp.parent all along. Reviewed-by: Christian Brauner Signed-off-by: Al Viro --- diff --git a/fs/namespace.c b/fs/namespace.c index a6f48750536a..bae4be8c7192 100644 --- a/fs/namespace.c +++ b/fs/namespace.c @@ -3566,7 +3566,6 @@ static inline bool may_use_mount(struct mount *mnt) static int do_move_mount(struct path *old_path, struct path *new_path, enum mnt_tree_flags_t flags) { - struct mount *p; struct mount *old = real_mount(old_path->mnt); int err; bool beneath = flags & MNT_TREE_BENEATH; @@ -3581,8 +3580,6 @@ static int do_move_mount(struct path *old_path, if (IS_ERR(mp.parent)) return PTR_ERR(mp.parent); - p = real_mount(new_path->mnt); - if (check_mnt(old)) { /* if the source is in our namespace... */ /* ... it should be detachable from parent */ @@ -3592,7 +3589,7 @@ static int do_move_mount(struct path *old_path, if (IS_MNT_SHARED(old->mnt_parent)) return -EINVAL; /* ... and the target should be in our namespace */ - if (!check_mnt(p)) + if (!check_mnt(mp.parent)) return -EINVAL; } else { /* @@ -3605,13 +3602,13 @@ static int do_move_mount(struct path *old_path, * subsequent checks would've rejected that, but they lose * some corner cases if we check it early. */ - if (old->mnt_ns == p->mnt_ns) + if (old->mnt_ns == mp.parent->mnt_ns) return -EINVAL; /* * Target should be either in our namespace or in an acceptable * anon namespace, sensu check_anonymous_mnt(). */ - if (!may_use_mount(p)) + if (!may_use_mount(mp.parent)) return -EINVAL; } @@ -3619,22 +3616,20 @@ static int do_move_mount(struct path *old_path, err = can_move_mount_beneath(old, new_path, mp.mp); if (err) return err; - - p = p->mnt_parent; } /* * Don't move a mount tree containing unbindable mounts to a destination * mount which is shared. */ - if (IS_MNT_SHARED(p) && tree_contains_unbindable(old)) + if (IS_MNT_SHARED(mp.parent) && tree_contains_unbindable(old)) return -EINVAL; if (!check_for_nsfs_mounts(old)) return -ELOOP; - if (mount_is_ancestor(old, p)) + if (mount_is_ancestor(old, mp.parent)) return -ELOOP; - return attach_recursive_mnt(old, p, mp.mp); + return attach_recursive_mnt(old, mp.parent, mp.mp); } static int do_move_mount_old(struct path *path, const char *old_name)