Commit 7bdb11de authored by Eric W. Biederman's avatar Eric W. Biederman

mnt: Factor out unhash_mnt from detach_mnt and umount_tree

Create a function unhash_mnt that contains the common code between
detach_mnt and umount_tree, and use unhash_mnt in place of the common
code.  This add a unncessary list_del_init(mnt->mnt_child) into
umount_tree but given that mnt_child is already empty this extra
line is a noop.

Cc: stable@vger.kernel.org
Signed-off-by: default avatar"Eric W. Biederman" <ebiederm@xmission.com>
parent cd4a4017
...@@ -798,10 +798,8 @@ static void __touch_mnt_namespace(struct mnt_namespace *ns) ...@@ -798,10 +798,8 @@ static void __touch_mnt_namespace(struct mnt_namespace *ns)
/* /*
* vfsmount lock must be held for write * vfsmount lock must be held for write
*/ */
static void detach_mnt(struct mount *mnt, struct path *old_path) static void unhash_mnt(struct mount *mnt)
{ {
old_path->dentry = mnt->mnt_mountpoint;
old_path->mnt = &mnt->mnt_parent->mnt;
mnt->mnt_parent = mnt; mnt->mnt_parent = mnt;
mnt->mnt_mountpoint = mnt->mnt.mnt_root; mnt->mnt_mountpoint = mnt->mnt.mnt_root;
list_del_init(&mnt->mnt_child); list_del_init(&mnt->mnt_child);
...@@ -811,6 +809,16 @@ static void detach_mnt(struct mount *mnt, struct path *old_path) ...@@ -811,6 +809,16 @@ static void detach_mnt(struct mount *mnt, struct path *old_path)
mnt->mnt_mp = NULL; mnt->mnt_mp = NULL;
} }
/*
* vfsmount lock must be held for write
*/
static void detach_mnt(struct mount *mnt, struct path *old_path)
{
old_path->dentry = mnt->mnt_mountpoint;
old_path->mnt = &mnt->mnt_parent->mnt;
unhash_mnt(mnt);
}
/* /*
* vfsmount lock must be held for write * vfsmount lock must be held for write
*/ */
...@@ -1362,15 +1370,10 @@ static void umount_tree(struct mount *mnt, enum umount_tree_flags how) ...@@ -1362,15 +1370,10 @@ static void umount_tree(struct mount *mnt, enum umount_tree_flags how)
pin_insert_group(&p->mnt_umount, &p->mnt_parent->mnt, &unmounted); pin_insert_group(&p->mnt_umount, &p->mnt_parent->mnt, &unmounted);
if (mnt_has_parent(p)) { if (mnt_has_parent(p)) {
hlist_del_init(&p->mnt_mp_list);
put_mountpoint(p->mnt_mp);
mnt_add_count(p->mnt_parent, -1); mnt_add_count(p->mnt_parent, -1);
/* old mountpoint will be dropped when we can do that */ /* old mountpoint will be dropped when we can do that */
p->mnt_ex_mountpoint = p->mnt_mountpoint; p->mnt_ex_mountpoint = p->mnt_mountpoint;
p->mnt_mountpoint = p->mnt.mnt_root; unhash_mnt(p);
p->mnt_parent = p;
p->mnt_mp = NULL;
hlist_del_init_rcu(&p->mnt_hash);
} }
change_mnt_propagation(p, MS_PRIVATE); change_mnt_propagation(p, MS_PRIVATE);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment