diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2013-09-28 23:10:55 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2013-10-24 23:34:58 -0400 |
commit | aba809cf0944fdc5a83ef8b5864cdce2a99b2513 (patch) | |
tree | ea958e25bc153d0075933b8258723a3182ad2cec /fs/namespace.c | |
parent | 9559f68915024ece8be3781003f25aef3677e574 (diff) |
namespace.c: get rid of mnt_ghosts
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/namespace.c')
-rw-r--r-- | fs/namespace.c | 22 |
1 files changed, 7 insertions, 15 deletions
diff --git a/fs/namespace.c b/fs/namespace.c index c8d214ce30c6..846ea43ab0c6 100644 --- a/fs/namespace.c +++ b/fs/namespace.c @@ -1136,20 +1136,8 @@ static void namespace_unlock(void) while (!list_empty(&head)) { mnt = list_first_entry(&head, struct mount, mnt_hash); list_del_init(&mnt->mnt_hash); - if (mnt_has_parent(mnt)) { - struct dentry *dentry; - struct mount *m; - - br_write_lock(&vfsmount_lock); - dentry = mnt->mnt_mountpoint; - m = mnt->mnt_parent; - mnt->mnt_mountpoint = mnt->mnt.mnt_root; - mnt->mnt_parent = mnt; - m->mnt_ghosts--; - br_write_unlock(&vfsmount_lock); - dput(dentry); - mntput(&m->mnt); - } + if (mnt->mnt_ex_mountpoint.mnt) + path_put(&mnt->mnt_ex_mountpoint); mntput(&mnt->mnt); } } @@ -1181,8 +1169,12 @@ void umount_tree(struct mount *mnt, int propagate) p->mnt_ns = NULL; list_del_init(&p->mnt_child); if (mnt_has_parent(p)) { - p->mnt_parent->mnt_ghosts++; put_mountpoint(p->mnt_mp); + /* move the reference to mountpoint into ->mnt_ex_mountpoint */ + p->mnt_ex_mountpoint.dentry = p->mnt_mountpoint; + p->mnt_ex_mountpoint.mnt = &p->mnt_parent->mnt; + p->mnt_mountpoint = p->mnt.mnt_root; + p->mnt_parent = p; p->mnt_mp = NULL; } change_mnt_propagation(p, MS_PRIVATE); |