mirror of
https://github.com/torvalds/linux.git
synced 2026-06-02 11:33:28 +02:00
pivot_root(): reorder tree surgeries, collapse unhash_mnt() and put_mountpoint()
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>
This commit is contained in:
parent
ec3265a245
commit
e30da2a20e
|
|
@ -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 new_root on / */
|
||||
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);
|
||||
/* mount new_root on / */
|
||||
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 */
|
||||
list_del_init(&new_mnt->mnt_expire);
|
||||
put_mountpoint(root_mp);
|
||||
unlock_mount_hash();
|
||||
mnt_notify_add(root_mnt);
|
||||
mnt_notify_add(new_mnt);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user