aboutsummaryrefslogtreecommitdiff
path: root/fs
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2009-07-19 08:44:27 -0500
committerSteven Rostedt <rostedt@rostedt.homelinux.com>2013-08-16 21:59:46 -0400
commited11c95717c6e317b6e3ca9c8f7a7458b5a1f705 (patch)
tree5535bd727d08486e5453c9a01161bc8bb4f71fb7 /fs
parent793de4906086a001d9026418978e917cf271df3a (diff)
fs: namespace preemption fix
On RT we cannot loop with preemption disabled here as mnt_make_readonly() might have been preempted. We can safely enable preemption while waiting for MNT_WRITE_HOLD to be cleared. Safe on !RT as well. Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'fs')
-rw-r--r--fs/namespace.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/fs/namespace.c b/fs/namespace.c
index ca4913a54f03..644dbde12d38 100644
--- a/fs/namespace.c
+++ b/fs/namespace.c
@@ -341,8 +341,14 @@ int mnt_want_write(struct vfsmount *mnt)
* incremented count after it has set MNT_WRITE_HOLD.
*/
smp_mb();
- while (mnt->mnt_flags & MNT_WRITE_HOLD)
+ /*
+ * No need to keep preemption disabled accross the spin loop.
+ */
+ while (mnt->mnt_flags & MNT_WRITE_HOLD) {
+ preempt_enable();
cpu_relax();
+ preempt_disable();
+ }
/*
* After the slowpath clears MNT_WRITE_HOLD, mnt_is_readonly will
* be set to match its requirements. So we must not load that until
@@ -352,9 +358,7 @@ int mnt_want_write(struct vfsmount *mnt)
if (__mnt_is_readonly(mnt)) {
mnt_dec_writers(mnt);
ret = -EROFS;
- goto out;
}
-out:
preempt_enable();
return ret;
}