aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn Stultz <johnstul@us.ibm.com>2010-02-22 21:09:56 -0500
committerThomas Gleixner <tglx@linutronix.de>2010-04-27 11:32:59 -0400
commit070976b5b038218900648ea4cc88786d5dfcd58d (patch)
tree1c5ffc0d3ba5006981a8e328cee270e96183a584
parent23695896abe0d1c813c2c88f0dd165d435d08689 (diff)
Fix inc/dec_mnt_count for -rt
With Nick's vfs patches, inc/dec_mnt_count use per-cpu counters, so this patch makes sure we disable preemption before calling. Its not a great fix, but works because count_mnt_count() sums all the percpu values, so each one individually doesn't need to be 0'ed out. I suspect the better fix for -rt is to revert the mnt_count back to an atomic counter. Signed-off-by: John Stultz <johnstul@us.ibm.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
-rw-r--r--fs/namespace.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/fs/namespace.c b/fs/namespace.c
index 7fb7fe3da44e..c1632069b06c 100644
--- a/fs/namespace.c
+++ b/fs/namespace.c
@@ -757,7 +757,9 @@ void mntput_no_expire(struct vfsmount *mnt)
757 vfsmount_read_unlock(cpu); 757 vfsmount_read_unlock(cpu);
758 goto repeat; 758 goto repeat;
759 } 759 }
760 preempt_disable();
760 dec_mnt_count(mnt); 761 dec_mnt_count(mnt);
762 preempt_enable();
761 vfsmount_read_unlock(cpu); 763 vfsmount_read_unlock(cpu);
762 764
763 return; 765 return;
@@ -766,7 +768,9 @@ void mntput_no_expire(struct vfsmount *mnt)
766repeat: 768repeat:
767 vfsmount_write_lock(); 769 vfsmount_write_lock();
768 BUG_ON(mnt->mnt_flags & MNT_MOUNTED); 770 BUG_ON(mnt->mnt_flags & MNT_MOUNTED);
771 preempt_disable();
769 dec_mnt_count(mnt); 772 dec_mnt_count(mnt);
773 preempt_enable();
770 if (count_mnt_count(mnt)) { 774 if (count_mnt_count(mnt)) {
771 vfsmount_write_unlock(); 775 vfsmount_write_unlock();
772 return; 776 return;
@@ -819,7 +823,9 @@ void mnt_unpin(struct vfsmount *mnt)
819{ 823{
820 vfsmount_write_lock(); 824 vfsmount_write_lock();
821 if (mnt->mnt_pinned) { 825 if (mnt->mnt_pinned) {
822 inc_mnt_count(mnt); 826 preempt_disable();
827 dec_mnt_count(mnt);
828 preempt_enable();
823 mnt->mnt_pinned--; 829 mnt->mnt_pinned--;
824 } 830 }
825 vfsmount_write_unlock(); 831 vfsmount_write_unlock();