aboutsummaryrefslogtreecommitdiffstats
path: root/fs/namespace.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/namespace.c')
-rw-r--r--fs/namespace.c139
1 files changed, 70 insertions, 69 deletions
diff --git a/fs/namespace.c b/fs/namespace.c
index e6081996c9a..224aff1c0df 100644
--- a/fs/namespace.c
+++ b/fs/namespace.c
@@ -397,7 +397,7 @@ static int mnt_make_readonly(struct mount *mnt)
397{ 397{
398 int ret = 0; 398 int ret = 0;
399 399
400 br_write_lock(vfsmount_lock); 400 br_write_lock(&vfsmount_lock);
401 mnt->mnt.mnt_flags |= MNT_WRITE_HOLD; 401 mnt->mnt.mnt_flags |= MNT_WRITE_HOLD;
402 /* 402 /*
403 * After storing MNT_WRITE_HOLD, we'll read the counters. This store 403 * After storing MNT_WRITE_HOLD, we'll read the counters. This store
@@ -431,15 +431,15 @@ static int mnt_make_readonly(struct mount *mnt)
431 */ 431 */
432 smp_wmb(); 432 smp_wmb();
433 mnt->mnt.mnt_flags &= ~MNT_WRITE_HOLD; 433 mnt->mnt.mnt_flags &= ~MNT_WRITE_HOLD;
434 br_write_unlock(vfsmount_lock); 434 br_write_unlock(&vfsmount_lock);
435 return ret; 435 return ret;
436} 436}
437 437
438static void __mnt_unmake_readonly(struct mount *mnt) 438static void __mnt_unmake_readonly(struct mount *mnt)
439{ 439{
440 br_write_lock(vfsmount_lock); 440 br_write_lock(&vfsmount_lock);
441 mnt->mnt.mnt_flags &= ~MNT_READONLY; 441 mnt->mnt.mnt_flags &= ~MNT_READONLY;
442 br_write_unlock(vfsmount_lock); 442 br_write_unlock(&vfsmount_lock);
443} 443}
444 444
445int sb_prepare_remount_readonly(struct super_block *sb) 445int sb_prepare_remount_readonly(struct super_block *sb)
@@ -451,7 +451,7 @@ int sb_prepare_remount_readonly(struct super_block *sb)
451 if (atomic_long_read(&sb->s_remove_count)) 451 if (atomic_long_read(&sb->s_remove_count))
452 return -EBUSY; 452 return -EBUSY;
453 453
454 br_write_lock(vfsmount_lock); 454 br_write_lock(&vfsmount_lock);
455 list_for_each_entry(mnt, &sb->s_mounts, mnt_instance) { 455 list_for_each_entry(mnt, &sb->s_mounts, mnt_instance) {
456 if (!(mnt->mnt.mnt_flags & MNT_READONLY)) { 456 if (!(mnt->mnt.mnt_flags & MNT_READONLY)) {
457 mnt->mnt.mnt_flags |= MNT_WRITE_HOLD; 457 mnt->mnt.mnt_flags |= MNT_WRITE_HOLD;
@@ -473,7 +473,7 @@ int sb_prepare_remount_readonly(struct super_block *sb)
473 if (mnt->mnt.mnt_flags & MNT_WRITE_HOLD) 473 if (mnt->mnt.mnt_flags & MNT_WRITE_HOLD)
474 mnt->mnt.mnt_flags &= ~MNT_WRITE_HOLD; 474 mnt->mnt.mnt_flags &= ~MNT_WRITE_HOLD;
475 } 475 }
476 br_write_unlock(vfsmount_lock); 476 br_write_unlock(&vfsmount_lock);
477 477
478 return err; 478 return err;
479} 479}
@@ -522,14 +522,14 @@ struct vfsmount *lookup_mnt(struct path *path)
522{ 522{
523 struct mount *child_mnt; 523 struct mount *child_mnt;
524 524
525 br_read_lock(vfsmount_lock); 525 br_read_lock(&vfsmount_lock);
526 child_mnt = __lookup_mnt(path->mnt, path->dentry, 1); 526 child_mnt = __lookup_mnt(path->mnt, path->dentry, 1);
527 if (child_mnt) { 527 if (child_mnt) {
528 mnt_add_count(child_mnt, 1); 528 mnt_add_count(child_mnt, 1);
529 br_read_unlock(vfsmount_lock); 529 br_read_unlock(&vfsmount_lock);
530 return &child_mnt->mnt; 530 return &child_mnt->mnt;
531 } else { 531 } else {
532 br_read_unlock(vfsmount_lock); 532 br_read_unlock(&vfsmount_lock);
533 return NULL; 533 return NULL;
534 } 534 }
535} 535}
@@ -714,9 +714,9 @@ vfs_kern_mount(struct file_system_type *type, int flags, const char *name, void
714 mnt->mnt.mnt_sb = root->d_sb; 714 mnt->mnt.mnt_sb = root->d_sb;
715 mnt->mnt_mountpoint = mnt->mnt.mnt_root; 715 mnt->mnt_mountpoint = mnt->mnt.mnt_root;
716 mnt->mnt_parent = mnt; 716 mnt->mnt_parent = mnt;
717 br_write_lock(vfsmount_lock); 717 br_write_lock(&vfsmount_lock);
718 list_add_tail(&mnt->mnt_instance, &root->d_sb->s_mounts); 718 list_add_tail(&mnt->mnt_instance, &root->d_sb->s_mounts);
719 br_write_unlock(vfsmount_lock); 719 br_write_unlock(&vfsmount_lock);
720 return &mnt->mnt; 720 return &mnt->mnt;
721} 721}
722EXPORT_SYMBOL_GPL(vfs_kern_mount); 722EXPORT_SYMBOL_GPL(vfs_kern_mount);
@@ -745,9 +745,9 @@ static struct mount *clone_mnt(struct mount *old, struct dentry *root,
745 mnt->mnt.mnt_root = dget(root); 745 mnt->mnt.mnt_root = dget(root);
746 mnt->mnt_mountpoint = mnt->mnt.mnt_root; 746 mnt->mnt_mountpoint = mnt->mnt.mnt_root;
747 mnt->mnt_parent = mnt; 747 mnt->mnt_parent = mnt;
748 br_write_lock(vfsmount_lock); 748 br_write_lock(&vfsmount_lock);
749 list_add_tail(&mnt->mnt_instance, &sb->s_mounts); 749 list_add_tail(&mnt->mnt_instance, &sb->s_mounts);
750 br_write_unlock(vfsmount_lock); 750 br_write_unlock(&vfsmount_lock);
751 751
752 if (flag & CL_SLAVE) { 752 if (flag & CL_SLAVE) {
753 list_add(&mnt->mnt_slave, &old->mnt_slave_list); 753 list_add(&mnt->mnt_slave, &old->mnt_slave_list);
@@ -803,35 +803,36 @@ static void mntput_no_expire(struct mount *mnt)
803{ 803{
804put_again: 804put_again:
805#ifdef CONFIG_SMP 805#ifdef CONFIG_SMP
806 br_read_lock(vfsmount_lock); 806 br_read_lock(&vfsmount_lock);
807 if (likely(atomic_read(&mnt->mnt_longterm))) { 807 if (likely(atomic_read(&mnt->mnt_longterm))) {
808 mnt_add_count(mnt, -1); 808 mnt_add_count(mnt, -1);
809 br_read_unlock(vfsmount_lock); 809 br_read_unlock(&vfsmount_lock);
810 return; 810 return;
811 } 811 }
812 br_read_unlock(vfsmount_lock); 812 br_read_unlock(&vfsmount_lock);
813 813
814 br_write_lock(vfsmount_lock); 814 br_write_lock(&vfsmount_lock);
815 mnt_add_count(mnt, -1); 815 mnt_add_count(mnt, -1);
816 if (mnt_get_count(mnt)) { 816 if (mnt_get_count(mnt)) {
817 br_write_unlock(vfsmount_lock); 817 br_write_unlock(&vfsmount_lock);
818 return; 818 return;
819 } 819 }
820#else 820#else
821 mnt_add_count(mnt, -1); 821 mnt_add_count(mnt, -1);
822 if (likely(mnt_get_count(mnt))) 822 if (likely(mnt_get_count(mnt)))
823 return; 823 return;
824 br_write_lock(vfsmount_lock); 824 br_write_lock(&vfsmount_lock);
825#endif 825#endif
826 if (unlikely(mnt->mnt_pinned)) { 826 if (unlikely(mnt->mnt_pinned)) {
827 mnt_add_count(mnt, mnt->mnt_pinned + 1); 827 mnt_add_count(mnt, mnt->mnt_pinned + 1);
828 mnt->mnt_pinned = 0; 828 mnt->mnt_pinned = 0;
829 br_write_unlock(vfsmount_lock); 829 br_write_unlock(&vfsmount_lock);
830 acct_auto_close_mnt(&mnt->mnt); 830 acct_auto_close_mnt(&mnt->mnt);
831 goto put_again; 831 goto put_again;
832 } 832 }
833
833 list_del(&mnt->mnt_instance); 834 list_del(&mnt->mnt_instance);
834 br_write_unlock(vfsmount_lock); 835 br_write_unlock(&vfsmount_lock);
835 mntfree(mnt); 836 mntfree(mnt);
836} 837}
837 838
@@ -857,21 +858,21 @@ EXPORT_SYMBOL(mntget);
857 858
858void mnt_pin(struct vfsmount *mnt) 859void mnt_pin(struct vfsmount *mnt)
859{ 860{
860 br_write_lock(vfsmount_lock); 861 br_write_lock(&vfsmount_lock);
861 real_mount(mnt)->mnt_pinned++; 862 real_mount(mnt)->mnt_pinned++;
862 br_write_unlock(vfsmount_lock); 863 br_write_unlock(&vfsmount_lock);
863} 864}
864EXPORT_SYMBOL(mnt_pin); 865EXPORT_SYMBOL(mnt_pin);
865 866
866void mnt_unpin(struct vfsmount *m) 867void mnt_unpin(struct vfsmount *m)
867{ 868{
868 struct mount *mnt = real_mount(m); 869 struct mount *mnt = real_mount(m);
869 br_write_lock(vfsmount_lock); 870 br_write_lock(&vfsmount_lock);
870 if (mnt->mnt_pinned) { 871 if (mnt->mnt_pinned) {
871 mnt_add_count(mnt, 1); 872 mnt_add_count(mnt, 1);
872 mnt->mnt_pinned--; 873 mnt->mnt_pinned--;
873 } 874 }
874 br_write_unlock(vfsmount_lock); 875 br_write_unlock(&vfsmount_lock);
875} 876}
876EXPORT_SYMBOL(mnt_unpin); 877EXPORT_SYMBOL(mnt_unpin);
877 878
@@ -988,12 +989,12 @@ int may_umount_tree(struct vfsmount *m)
988 BUG_ON(!m); 989 BUG_ON(!m);
989 990
990 /* write lock needed for mnt_get_count */ 991 /* write lock needed for mnt_get_count */
991 br_write_lock(vfsmount_lock); 992 br_write_lock(&vfsmount_lock);
992 for (p = mnt; p; p = next_mnt(p, mnt)) { 993 for (p = mnt; p; p = next_mnt(p, mnt)) {
993 actual_refs += mnt_get_count(p); 994 actual_refs += mnt_get_count(p);
994 minimum_refs += 2; 995 minimum_refs += 2;
995 } 996 }
996 br_write_unlock(vfsmount_lock); 997 br_write_unlock(&vfsmount_lock);
997 998
998 if (actual_refs > minimum_refs) 999 if (actual_refs > minimum_refs)
999 return 0; 1000 return 0;
@@ -1020,10 +1021,10 @@ int may_umount(struct vfsmount *mnt)
1020{ 1021{
1021 int ret = 1; 1022 int ret = 1;
1022 down_read(&namespace_sem); 1023 down_read(&namespace_sem);
1023 br_write_lock(vfsmount_lock); 1024 br_write_lock(&vfsmount_lock);
1024 if (propagate_mount_busy(real_mount(mnt), 2)) 1025 if (propagate_mount_busy(real_mount(mnt), 2))
1025 ret = 0; 1026 ret = 0;
1026 br_write_unlock(vfsmount_lock); 1027 br_write_unlock(&vfsmount_lock);
1027 up_read(&namespace_sem); 1028 up_read(&namespace_sem);
1028 return ret; 1029 return ret;
1029} 1030}
@@ -1040,13 +1041,13 @@ void release_mounts(struct list_head *head)
1040 struct dentry *dentry; 1041 struct dentry *dentry;
1041 struct mount *m; 1042 struct mount *m;
1042 1043
1043 br_write_lock(vfsmount_lock); 1044 br_write_lock(&vfsmount_lock);
1044 dentry = mnt->mnt_mountpoint; 1045 dentry = mnt->mnt_mountpoint;
1045 m = mnt->mnt_parent; 1046 m = mnt->mnt_parent;
1046 mnt->mnt_mountpoint = mnt->mnt.mnt_root; 1047 mnt->mnt_mountpoint = mnt->mnt.mnt_root;
1047 mnt->mnt_parent = mnt; 1048 mnt->mnt_parent = mnt;
1048 m->mnt_ghosts--; 1049 m->mnt_ghosts--;
1049 br_write_unlock(vfsmount_lock); 1050 br_write_unlock(&vfsmount_lock);
1050 dput(dentry); 1051 dput(dentry);
1051 mntput(&m->mnt); 1052 mntput(&m->mnt);
1052 } 1053 }
@@ -1112,12 +1113,12 @@ static int do_umount(struct mount *mnt, int flags)
1112 * probably don't strictly need the lock here if we examined 1113 * probably don't strictly need the lock here if we examined
1113 * all race cases, but it's a slowpath. 1114 * all race cases, but it's a slowpath.
1114 */ 1115 */
1115 br_write_lock(vfsmount_lock); 1116 br_write_lock(&vfsmount_lock);
1116 if (mnt_get_count(mnt) != 2) { 1117 if (mnt_get_count(mnt) != 2) {
1117 br_write_unlock(vfsmount_lock); 1118 br_write_unlock(&vfsmount_lock);
1118 return -EBUSY; 1119 return -EBUSY;
1119 } 1120 }
1120 br_write_unlock(vfsmount_lock); 1121 br_write_unlock(&vfsmount_lock);
1121 1122
1122 if (!xchg(&mnt->mnt_expiry_mark, 1)) 1123 if (!xchg(&mnt->mnt_expiry_mark, 1))
1123 return -EAGAIN; 1124 return -EAGAIN;
@@ -1159,7 +1160,7 @@ static int do_umount(struct mount *mnt, int flags)
1159 } 1160 }
1160 1161
1161 down_write(&namespace_sem); 1162 down_write(&namespace_sem);
1162 br_write_lock(vfsmount_lock); 1163 br_write_lock(&vfsmount_lock);
1163 event++; 1164 event++;
1164 1165
1165 if (!(flags & MNT_DETACH)) 1166 if (!(flags & MNT_DETACH))
@@ -1171,7 +1172,7 @@ static int do_umount(struct mount *mnt, int flags)
1171 umount_tree(mnt, 1, &umount_list); 1172 umount_tree(mnt, 1, &umount_list);
1172 retval = 0; 1173 retval = 0;
1173 } 1174 }
1174 br_write_unlock(vfsmount_lock); 1175 br_write_unlock(&vfsmount_lock);
1175 up_write(&namespace_sem); 1176 up_write(&namespace_sem);
1176 release_mounts(&umount_list); 1177 release_mounts(&umount_list);
1177 return retval; 1178 return retval;
@@ -1286,19 +1287,19 @@ struct mount *copy_tree(struct mount *mnt, struct dentry *dentry,
1286 q = clone_mnt(p, p->mnt.mnt_root, flag); 1287 q = clone_mnt(p, p->mnt.mnt_root, flag);
1287 if (!q) 1288 if (!q)
1288 goto Enomem; 1289 goto Enomem;
1289 br_write_lock(vfsmount_lock); 1290 br_write_lock(&vfsmount_lock);
1290 list_add_tail(&q->mnt_list, &res->mnt_list); 1291 list_add_tail(&q->mnt_list, &res->mnt_list);
1291 attach_mnt(q, &path); 1292 attach_mnt(q, &path);
1292 br_write_unlock(vfsmount_lock); 1293 br_write_unlock(&vfsmount_lock);
1293 } 1294 }
1294 } 1295 }
1295 return res; 1296 return res;
1296Enomem: 1297Enomem:
1297 if (res) { 1298 if (res) {
1298 LIST_HEAD(umount_list); 1299 LIST_HEAD(umount_list);
1299 br_write_lock(vfsmount_lock); 1300 br_write_lock(&vfsmount_lock);
1300 umount_tree(res, 0, &umount_list); 1301 umount_tree(res, 0, &umount_list);
1301 br_write_unlock(vfsmount_lock); 1302 br_write_unlock(&vfsmount_lock);
1302 release_mounts(&umount_list); 1303 release_mounts(&umount_list);
1303 } 1304 }
1304 return NULL; 1305 return NULL;
@@ -1318,9 +1319,9 @@ void drop_collected_mounts(struct vfsmount *mnt)
1318{ 1319{
1319 LIST_HEAD(umount_list); 1320 LIST_HEAD(umount_list);
1320 down_write(&namespace_sem); 1321 down_write(&namespace_sem);
1321 br_write_lock(vfsmount_lock); 1322 br_write_lock(&vfsmount_lock);
1322 umount_tree(real_mount(mnt), 0, &umount_list); 1323 umount_tree(real_mount(mnt), 0, &umount_list);
1323 br_write_unlock(vfsmount_lock); 1324 br_write_unlock(&vfsmount_lock);
1324 up_write(&namespace_sem); 1325 up_write(&namespace_sem);
1325 release_mounts(&umount_list); 1326 release_mounts(&umount_list);
1326} 1327}
@@ -1448,7 +1449,7 @@ static int attach_recursive_mnt(struct mount *source_mnt,
1448 if (err) 1449 if (err)
1449 goto out_cleanup_ids; 1450 goto out_cleanup_ids;
1450 1451
1451 br_write_lock(vfsmount_lock); 1452 br_write_lock(&vfsmount_lock);
1452 1453
1453 if (IS_MNT_SHARED(dest_mnt)) { 1454 if (IS_MNT_SHARED(dest_mnt)) {
1454 for (p = source_mnt; p; p = next_mnt(p, source_mnt)) 1455 for (p = source_mnt; p; p = next_mnt(p, source_mnt))
@@ -1467,7 +1468,7 @@ static int attach_recursive_mnt(struct mount *source_mnt,
1467 list_del_init(&child->mnt_hash); 1468 list_del_init(&child->mnt_hash);
1468 commit_tree(child); 1469 commit_tree(child);
1469 } 1470 }
1470 br_write_unlock(vfsmount_lock); 1471 br_write_unlock(&vfsmount_lock);
1471 1472
1472 return 0; 1473 return 0;
1473 1474
@@ -1565,10 +1566,10 @@ static int do_change_type(struct path *path, int flag)
1565 goto out_unlock; 1566 goto out_unlock;
1566 } 1567 }
1567 1568
1568 br_write_lock(vfsmount_lock); 1569 br_write_lock(&vfsmount_lock);
1569 for (m = mnt; m; m = (recurse ? next_mnt(m, mnt) : NULL)) 1570 for (m = mnt; m; m = (recurse ? next_mnt(m, mnt) : NULL))
1570 change_mnt_propagation(m, type); 1571 change_mnt_propagation(m, type);
1571 br_write_unlock(vfsmount_lock); 1572 br_write_unlock(&vfsmount_lock);
1572 1573
1573 out_unlock: 1574 out_unlock:
1574 up_write(&namespace_sem); 1575 up_write(&namespace_sem);
@@ -1617,9 +1618,9 @@ static int do_loopback(struct path *path, char *old_name,
1617 1618
1618 err = graft_tree(mnt, path); 1619 err = graft_tree(mnt, path);
1619 if (err) { 1620 if (err) {
1620 br_write_lock(vfsmount_lock); 1621 br_write_lock(&vfsmount_lock);
1621 umount_tree(mnt, 0, &umount_list); 1622 umount_tree(mnt, 0, &umount_list);
1622 br_write_unlock(vfsmount_lock); 1623 br_write_unlock(&vfsmount_lock);
1623 } 1624 }
1624out2: 1625out2:
1625 unlock_mount(path); 1626 unlock_mount(path);
@@ -1677,16 +1678,16 @@ static int do_remount(struct path *path, int flags, int mnt_flags,
1677 else 1678 else
1678 err = do_remount_sb(sb, flags, data, 0); 1679 err = do_remount_sb(sb, flags, data, 0);
1679 if (!err) { 1680 if (!err) {
1680 br_write_lock(vfsmount_lock); 1681 br_write_lock(&vfsmount_lock);
1681 mnt_flags |= mnt->mnt.mnt_flags & MNT_PROPAGATION_MASK; 1682 mnt_flags |= mnt->mnt.mnt_flags & MNT_PROPAGATION_MASK;
1682 mnt->mnt.mnt_flags = mnt_flags; 1683 mnt->mnt.mnt_flags = mnt_flags;
1683 br_write_unlock(vfsmount_lock); 1684 br_write_unlock(&vfsmount_lock);
1684 } 1685 }
1685 up_write(&sb->s_umount); 1686 up_write(&sb->s_umount);
1686 if (!err) { 1687 if (!err) {
1687 br_write_lock(vfsmount_lock); 1688 br_write_lock(&vfsmount_lock);
1688 touch_mnt_namespace(mnt->mnt_ns); 1689 touch_mnt_namespace(mnt->mnt_ns);
1689 br_write_unlock(vfsmount_lock); 1690 br_write_unlock(&vfsmount_lock);
1690 } 1691 }
1691 return err; 1692 return err;
1692} 1693}
@@ -1893,9 +1894,9 @@ fail:
1893 /* remove m from any expiration list it may be on */ 1894 /* remove m from any expiration list it may be on */
1894 if (!list_empty(&mnt->mnt_expire)) { 1895 if (!list_empty(&mnt->mnt_expire)) {
1895 down_write(&namespace_sem); 1896 down_write(&namespace_sem);
1896 br_write_lock(vfsmount_lock); 1897 br_write_lock(&vfsmount_lock);
1897 list_del_init(&mnt->mnt_expire); 1898 list_del_init(&mnt->mnt_expire);
1898 br_write_unlock(vfsmount_lock); 1899 br_write_unlock(&vfsmount_lock);
1899 up_write(&namespace_sem); 1900 up_write(&namespace_sem);
1900 } 1901 }
1901 mntput(m); 1902 mntput(m);
@@ -1911,11 +1912,11 @@ fail:
1911void mnt_set_expiry(struct vfsmount *mnt, struct list_head *expiry_list) 1912void mnt_set_expiry(struct vfsmount *mnt, struct list_head *expiry_list)
1912{ 1913{
1913 down_write(&namespace_sem); 1914 down_write(&namespace_sem);
1914 br_write_lock(vfsmount_lock); 1915 br_write_lock(&vfsmount_lock);
1915 1916
1916 list_add_tail(&real_mount(mnt)->mnt_expire, expiry_list); 1917 list_add_tail(&real_mount(mnt)->mnt_expire, expiry_list);
1917 1918
1918 br_write_unlock(vfsmount_lock); 1919 br_write_unlock(&vfsmount_lock);
1919 up_write(&namespace_sem); 1920 up_write(&namespace_sem);
1920} 1921}
1921EXPORT_SYMBOL(mnt_set_expiry); 1922EXPORT_SYMBOL(mnt_set_expiry);
@@ -1935,7 +1936,7 @@ void mark_mounts_for_expiry(struct list_head *mounts)
1935 return; 1936 return;
1936 1937
1937 down_write(&namespace_sem); 1938 down_write(&namespace_sem);
1938 br_write_lock(vfsmount_lock); 1939 br_write_lock(&vfsmount_lock);
1939 1940
1940 /* extract from the expiration list every vfsmount that matches the 1941 /* extract from the expiration list every vfsmount that matches the
1941 * following criteria: 1942 * following criteria:
@@ -1954,7 +1955,7 @@ void mark_mounts_for_expiry(struct list_head *mounts)
1954 touch_mnt_namespace(mnt->mnt_ns); 1955 touch_mnt_namespace(mnt->mnt_ns);
1955 umount_tree(mnt, 1, &umounts); 1956 umount_tree(mnt, 1, &umounts);
1956 } 1957 }
1957 br_write_unlock(vfsmount_lock); 1958 br_write_unlock(&vfsmount_lock);
1958 up_write(&namespace_sem); 1959 up_write(&namespace_sem);
1959 1960
1960 release_mounts(&umounts); 1961 release_mounts(&umounts);
@@ -2218,9 +2219,9 @@ void mnt_make_shortterm(struct vfsmount *m)
2218 struct mount *mnt = real_mount(m); 2219 struct mount *mnt = real_mount(m);
2219 if (atomic_add_unless(&mnt->mnt_longterm, -1, 1)) 2220 if (atomic_add_unless(&mnt->mnt_longterm, -1, 1))
2220 return; 2221 return;
2221 br_write_lock(vfsmount_lock); 2222 br_write_lock(&vfsmount_lock);
2222 atomic_dec(&mnt->mnt_longterm); 2223 atomic_dec(&mnt->mnt_longterm);
2223 br_write_unlock(vfsmount_lock); 2224 br_write_unlock(&vfsmount_lock);
2224#endif 2225#endif
2225} 2226}
2226 2227
@@ -2250,9 +2251,9 @@ static struct mnt_namespace *dup_mnt_ns(struct mnt_namespace *mnt_ns,
2250 return ERR_PTR(-ENOMEM); 2251 return ERR_PTR(-ENOMEM);
2251 } 2252 }
2252 new_ns->root = new; 2253 new_ns->root = new;
2253 br_write_lock(vfsmount_lock); 2254 br_write_lock(&vfsmount_lock);
2254 list_add_tail(&new_ns->list, &new->mnt_list); 2255 list_add_tail(&new_ns->list, &new->mnt_list);
2255 br_write_unlock(vfsmount_lock); 2256 br_write_unlock(&vfsmount_lock);
2256 2257
2257 /* 2258 /*
2258 * Second pass: switch the tsk->fs->* elements and mark new vfsmounts 2259 * Second pass: switch the tsk->fs->* elements and mark new vfsmounts
@@ -2416,9 +2417,9 @@ bool is_path_reachable(struct mount *mnt, struct dentry *dentry,
2416int path_is_under(struct path *path1, struct path *path2) 2417int path_is_under(struct path *path1, struct path *path2)
2417{ 2418{
2418 int res; 2419 int res;
2419 br_read_lock(vfsmount_lock); 2420 br_read_lock(&vfsmount_lock);
2420 res = is_path_reachable(real_mount(path1->mnt), path1->dentry, path2); 2421 res = is_path_reachable(real_mount(path1->mnt), path1->dentry, path2);
2421 br_read_unlock(vfsmount_lock); 2422 br_read_unlock(&vfsmount_lock);
2422 return res; 2423 return res;
2423} 2424}
2424EXPORT_SYMBOL(path_is_under); 2425EXPORT_SYMBOL(path_is_under);
@@ -2505,7 +2506,7 @@ SYSCALL_DEFINE2(pivot_root, const char __user *, new_root,
2505 /* make sure we can reach put_old from new_root */ 2506 /* make sure we can reach put_old from new_root */
2506 if (!is_path_reachable(real_mount(old.mnt), old.dentry, &new)) 2507 if (!is_path_reachable(real_mount(old.mnt), old.dentry, &new))
2507 goto out4; 2508 goto out4;
2508 br_write_lock(vfsmount_lock); 2509 br_write_lock(&vfsmount_lock);
2509 detach_mnt(new_mnt, &parent_path); 2510 detach_mnt(new_mnt, &parent_path);
2510 detach_mnt(root_mnt, &root_parent); 2511 detach_mnt(root_mnt, &root_parent);
2511 /* mount old root on put_old */ 2512 /* mount old root on put_old */
@@ -2513,7 +2514,7 @@ SYSCALL_DEFINE2(pivot_root, const char __user *, new_root,
2513 /* mount new_root on / */ 2514 /* mount new_root on / */
2514 attach_mnt(new_mnt, &root_parent); 2515 attach_mnt(new_mnt, &root_parent);
2515 touch_mnt_namespace(current->nsproxy->mnt_ns); 2516 touch_mnt_namespace(current->nsproxy->mnt_ns);
2516 br_write_unlock(vfsmount_lock); 2517 br_write_unlock(&vfsmount_lock);
2517 chroot_fs_refs(&root, &new); 2518 chroot_fs_refs(&root, &new);
2518 error = 0; 2519 error = 0;
2519out4: 2520out4:
@@ -2576,7 +2577,7 @@ void __init mnt_init(void)
2576 for (u = 0; u < HASH_SIZE; u++) 2577 for (u = 0; u < HASH_SIZE; u++)
2577 INIT_LIST_HEAD(&mount_hashtable[u]); 2578 INIT_LIST_HEAD(&mount_hashtable[u]);
2578 2579
2579 br_lock_init(vfsmount_lock); 2580 br_lock_init(&vfsmount_lock);
2580 2581
2581 err = sysfs_init(); 2582 err = sysfs_init();
2582 if (err) 2583 if (err)
@@ -2596,9 +2597,9 @@ void put_mnt_ns(struct mnt_namespace *ns)
2596 if (!atomic_dec_and_test(&ns->count)) 2597 if (!atomic_dec_and_test(&ns->count))
2597 return; 2598 return;
2598 down_write(&namespace_sem); 2599 down_write(&namespace_sem);
2599 br_write_lock(vfsmount_lock); 2600 br_write_lock(&vfsmount_lock);
2600 umount_tree(ns->root, 0, &umount_list); 2601 umount_tree(ns->root, 0, &umount_list);
2601 br_write_unlock(vfsmount_lock); 2602 br_write_unlock(&vfsmount_lock);
2602 up_write(&namespace_sem); 2603 up_write(&namespace_sem);
2603 release_mounts(&umount_list); 2604 release_mounts(&umount_list);
2604 kfree(ns); 2605 kfree(ns);