From: Al Viro Date: Thu, 8 May 2025 04:09:30 +0000 (-0400) Subject: do_move_mount(): get rid of 'attached' flag X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ee1ee33ccc1ba0620a77833b2a3e320588701217;p=thirdparty%2Fkernel%2Fstable.git do_move_mount(): get rid of 'attached' flag 'attached' serves as a proxy for "source is a subtree of our namespace and not the entirety of anon namespace"; finish massaging it away. Reviewed-by: Christian Brauner Signed-off-by: Al Viro --- diff --git a/fs/namespace.c b/fs/namespace.c index e5f8fde57c997..7c7cc14da1ee2 100644 --- a/fs/namespace.c +++ b/fs/namespace.c @@ -3600,7 +3600,7 @@ static int do_move_mount(struct path *old_path, struct mount *parent; struct mountpoint *mp; int err; - bool attached, beneath = flags & MNT_TREE_BENEATH; + bool beneath = flags & MNT_TREE_BENEATH; mp = do_lock_mount(new_path, beneath); if (IS_ERR(mp)) @@ -3609,7 +3609,6 @@ static int do_move_mount(struct path *old_path, old = real_mount(old_path->mnt); p = real_mount(new_path->mnt); parent = old->mnt_parent; - attached = mnt_has_parent(old); ns = old->mnt_ns; err = -EINVAL; @@ -3622,6 +3621,9 @@ static int do_move_mount(struct path *old_path, /* ... and the target should be in our namespace */ if (!check_mnt(p)) goto out; + /* parent of the source should not be shared */ + if (IS_MNT_SHARED(parent)) + goto out; } else { /* * otherwise the source must be the root of some anon namespace. @@ -3649,11 +3651,6 @@ static int do_move_mount(struct path *old_path, if (d_is_dir(new_path->dentry) != d_is_dir(old_path->dentry)) goto out; - /* - * Don't move a mount residing in a shared parent. - */ - if (attached && IS_MNT_SHARED(parent)) - goto out; if (beneath) { err = can_move_mount_beneath(old_path, new_path, mp); @@ -3686,7 +3683,7 @@ static int do_move_mount(struct path *old_path, out: unlock_mount(mp); if (!err) { - if (attached) { + if (!is_anon_ns(ns)) { mntput_no_expire(parent); } else { /* Make sure we notice when we leak mounts. */