aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/namespace.c7
-rw-r--r--include/linux/namespace.h3
2 files changed, 7 insertions, 3 deletions
diff --git a/fs/namespace.c b/fs/namespace.c
index a0d0ef1f1a48..9d17541ebafa 100644
--- a/fs/namespace.c
+++ b/fs/namespace.c
@@ -869,7 +869,7 @@ void mark_mounts_for_expiry(struct list_head *mounts)
869 /* don't do anything if the namespace is dead - all the 869 /* don't do anything if the namespace is dead - all the
870 * vfsmounts from it are going away anyway */ 870 * vfsmounts from it are going away anyway */
871 namespace = mnt->mnt_namespace; 871 namespace = mnt->mnt_namespace;
872 if (!namespace || atomic_read(&namespace->count) <= 0) 872 if (!namespace || !namespace->root)
873 continue; 873 continue;
874 get_namespace(namespace); 874 get_namespace(namespace);
875 875
@@ -1450,9 +1450,12 @@ void __init mnt_init(unsigned long mempages)
1450 1450
1451void __put_namespace(struct namespace *namespace) 1451void __put_namespace(struct namespace *namespace)
1452{ 1452{
1453 struct vfsmount *root = namespace->root;
1454 namespace->root = NULL;
1455 spin_unlock(&vfsmount_lock);
1453 down_write(&namespace->sem); 1456 down_write(&namespace->sem);
1454 spin_lock(&vfsmount_lock); 1457 spin_lock(&vfsmount_lock);
1455 umount_tree(namespace->root); 1458 umount_tree(root);
1456 spin_unlock(&vfsmount_lock); 1459 spin_unlock(&vfsmount_lock);
1457 up_write(&namespace->sem); 1460 up_write(&namespace->sem);
1458 kfree(namespace); 1461 kfree(namespace);
diff --git a/include/linux/namespace.h b/include/linux/namespace.h
index 697991b69f9b..0e5a86f13b2f 100644
--- a/include/linux/namespace.h
+++ b/include/linux/namespace.h
@@ -17,7 +17,8 @@ extern void __put_namespace(struct namespace *namespace);
17 17
18static inline void put_namespace(struct namespace *namespace) 18static inline void put_namespace(struct namespace *namespace)
19{ 19{
20 if (atomic_dec_and_test(&namespace->count)) 20 if (atomic_dec_and_lock(&namespace->count, &vfsmount_lock))
21 /* releases vfsmount_lock */
21 __put_namespace(namespace); 22 __put_namespace(namespace);
22} 23}
23 24