diff options
Diffstat (limited to 'fs/namespace.c')
| -rw-r--r-- | fs/namespace.c | 10 | 
1 files changed, 9 insertions, 1 deletions
diff --git a/fs/namespace.c b/fs/namespace.c index a01c7730e9af..ef42d9bee212 100644 --- a/fs/namespace.c +++ b/fs/namespace.c @@ -1217,6 +1217,11 @@ static void namespace_unlock(void)  	head.first->pprev = &head.first;  	INIT_HLIST_HEAD(&unmounted); +	/* undo decrements we'd done in umount_tree() */ +	hlist_for_each_entry(mnt, &head, mnt_hash) +		if (mnt->mnt_ex_mountpoint.mnt) +			mntget(mnt->mnt_ex_mountpoint.mnt); +  	up_write(&namespace_sem);  	synchronize_rcu(); @@ -1253,6 +1258,9 @@ void umount_tree(struct mount *mnt, int how)  		hlist_add_head(&p->mnt_hash, &tmp_list);  	} +	hlist_for_each_entry(p, &tmp_list, mnt_hash) +		list_del_init(&p->mnt_child); +  	if (how)  		propagate_umount(&tmp_list); @@ -1263,9 +1271,9 @@ void umount_tree(struct mount *mnt, int how)  		p->mnt_ns = NULL;  		if (how < 2)  			p->mnt.mnt_flags |= MNT_SYNC_UMOUNT; -		list_del_init(&p->mnt_child);  		if (mnt_has_parent(p)) {  			put_mountpoint(p->mnt_mp); +			mnt_add_count(p->mnt_parent, -1);  			/* 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;  |