diff options
| author | John Stultz <johnstul@us.ibm.com> | 2010-02-22 21:09:56 -0500 |
|---|---|---|
| committer | Thomas Gleixner <tglx@linutronix.de> | 2010-04-27 11:32:59 -0400 |
| commit | 070976b5b038218900648ea4cc88786d5dfcd58d (patch) | |
| tree | 1c5ffc0d3ba5006981a8e328cee270e96183a584 | |
| parent | 23695896abe0d1c813c2c88f0dd165d435d08689 (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.c | 8 |
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) | |||
| 766 | repeat: | 768 | repeat: |
| 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(); |
