]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
pivot_root(): reorder tree surgeries, collapse unhash_mnt() and put_mountpoint()
authorAl Viro <viro@zeniv.linux.org.uk>
Fri, 25 Apr 2025 20:53:01 +0000 (16:53 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Sun, 29 Jun 2025 22:13:42 +0000 (18:13 -0400)
attach new_mnt *before* detaching root_mnt; that way we don't need to keep hold
on the mountpoint and one more pair of unhash_mnt()/put_mountpoint() gets
folded together into umount_mnt().

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

index ff2281f780dc59579e62a0a30d255702abce4a96..eee73e945a5406bc92248a01cf4f4cc2aea84bc7 100644 (file)
@@ -4685,7 +4685,7 @@ SYSCALL_DEFINE2(pivot_root, const char __user *, new_root,
 {
        struct path new, old, root;
        struct mount *new_mnt, *root_mnt, *old_mnt, *root_parent, *ex_parent;
-       struct mountpoint *old_mp, *root_mp;
+       struct mountpoint *old_mp;
        int error;
 
        if (!may_mount())
@@ -4748,20 +4748,19 @@ SYSCALL_DEFINE2(pivot_root, const char __user *, new_root,
                goto out4;
        lock_mount_hash();
        umount_mnt(new_mnt);
-       root_mp = unhash_mnt(root_mnt);  /* we'll need its mountpoint */
        if (root_mnt->mnt.mnt_flags & MNT_LOCKED) {
                new_mnt->mnt.mnt_flags |= MNT_LOCKED;
                root_mnt->mnt.mnt_flags &= ~MNT_LOCKED;
        }
-       /* mount old root on put_old */
-       attach_mnt(root_mnt, old_mnt, old_mp);
        /* mount new_root on / */
-       attach_mnt(new_mnt, root_parent, root_mp);
+       attach_mnt(new_mnt, root_parent, root_mnt->mnt_mp);
+       umount_mnt(root_mnt);
        mnt_add_count(root_parent, -1);
+       /* mount old root on put_old */
+       attach_mnt(root_mnt, old_mnt, old_mp);
        touch_mnt_namespace(current->nsproxy->mnt_ns);
        /* A moved mount should not expire automatically */
        list_del_init(&new_mnt->mnt_expire);
-       put_mountpoint(root_mp);
        unlock_mount_hash();
        mnt_notify_add(root_mnt);
        mnt_notify_add(new_mnt);