]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
attach_mnt(): expand in attach_recursive_mnt(), then lose the flag argument
authorAl Viro <viro@zeniv.linux.org.uk>
Fri, 25 Apr 2025 16:40:28 +0000 (12:40 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Sun, 29 Jun 2025 22:13:41 +0000 (18:13 -0400)
simpler that way - all but one caller pass false as 'beneath' argument,
and that one caller is actually happier with the call expanded - the
logics with choice of mountpoint is identical for 'moving' and 'attaching'
cases, and now that is no longer hidden.

Reviewed-by: Christian Brauner <brauner@kernel.org>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/namespace.c

index 54c59e091919bcfd224915717af1ac0eb2e25e04..1761d2c2fdae60706ef773cbb969f361e9705b62 100644 (file)
@@ -1116,16 +1116,10 @@ static void __attach_mnt(struct mount *mnt, struct mount *parent)
  * @parent:  the parent
  * @mnt:     the new mount
  * @mp:      the new mountpoint
- * @beneath: whether to mount @mnt beneath or on top of @parent
  *
- * If @beneath is false, mount @mnt at @mp on @parent. Then attach @mnt
+ * Mount @mnt at @mp on @parent. Then attach @mnt
  * to @parent's child mount list and to @mount_hashtable.
  *
- * If @beneath is true, remove @mnt from its current parent and
- * mountpoint and mount it on @mp on @parent, and mount @parent on the
- * old parent and old mountpoint of @mnt. Finally, attach @parent to
- * @mnt_hashtable and @parent->mnt_parent->mnt_mounts.
- *
  * Note, when __attach_mnt() is called @mnt->mnt_parent already points
  * to the correct parent.
  *
@@ -1133,18 +1127,9 @@ static void __attach_mnt(struct mount *mnt, struct mount *parent)
  *          to have been acquired in that order.
  */
 static void attach_mnt(struct mount *mnt, struct mount *parent,
-                      struct mountpoint *mp, bool beneath)
+                      struct mountpoint *mp)
 {
-       if (beneath)
-               mnt_set_mountpoint_beneath(mnt, parent, mp);
-       else
-               mnt_set_mountpoint(parent, mp, mnt);
-       /*
-        * Note, @mnt->mnt_parent has to be used. If @mnt was mounted
-        * beneath @parent then @mnt will need to be attached to
-        * @parent's old parent, not @parent. IOW, @mnt->mnt_parent
-        * isn't the same mount as @parent.
-        */
+       mnt_set_mountpoint(parent, mp, mnt);
        __attach_mnt(mnt, mnt->mnt_parent);
 }
 
@@ -1157,7 +1142,7 @@ void mnt_change_mountpoint(struct mount *parent, struct mountpoint *mp, struct m
        hlist_del_init(&mnt->mnt_mp_list);
        hlist_del_init_rcu(&mnt->mnt_hash);
 
-       attach_mnt(mnt, parent, mp, false);
+       attach_mnt(mnt, parent, mp);
 
        put_mountpoint(old_mp);
        mnt_add_count(old_parent, -1);
@@ -2295,7 +2280,7 @@ struct mount *copy_tree(struct mount *src_root, struct dentry *dentry,
                                goto out;
                        lock_mount_hash();
                        list_add_tail(&dst_mnt->mnt_list, &res->mnt_list);
-                       attach_mnt(dst_mnt, dst_parent, src_parent->mnt_mp, false);
+                       attach_mnt(dst_mnt, dst_parent, src_parent->mnt_mp);
                        unlock_mount_hash();
                }
        }
@@ -2743,10 +2728,12 @@ static int attach_recursive_mnt(struct mount *source_mnt,
        }
 
        if (moving) {
-               if (beneath)
-                       dest_mp = smp;
                unhash_mnt(source_mnt);
-               attach_mnt(source_mnt, top_mnt, dest_mp, beneath);
+               if (beneath)
+                       mnt_set_mountpoint_beneath(source_mnt, top_mnt, smp);
+               else
+                       mnt_set_mountpoint(top_mnt, dest_mp, source_mnt);
+               __attach_mnt(source_mnt, source_mnt->mnt_parent);
                mnt_notify_add(source_mnt);
                touch_mnt_namespace(source_mnt->mnt_ns);
        } else {
@@ -4827,9 +4814,9 @@ SYSCALL_DEFINE2(pivot_root, const char __user *, new_root,
                root_mnt->mnt.mnt_flags &= ~MNT_LOCKED;
        }
        /* mount old root on put_old */
-       attach_mnt(root_mnt, old_mnt, old_mp, false);
+       attach_mnt(root_mnt, old_mnt, old_mp);
        /* mount new_root on / */
-       attach_mnt(new_mnt, root_parent, root_mp, false);
+       attach_mnt(new_mnt, root_parent, root_mp);
        mnt_add_count(root_parent, -1);
        touch_mnt_namespace(current->nsproxy->mnt_ns);
        /* A moved mount should not expire automatically */