| From: Thomas Gleixner <tglx@linutronix.de> |
| Date: Sun, 19 Jul 2009 08:44:27 -0500 |
| Subject: 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> |
| |
| --- |
| fs/namespace.c | 5 ++++- |
| 1 file changed, 4 insertions(+), 1 deletion(-) |
| |
| --- a/fs/namespace.c |
| +++ b/fs/namespace.c |
| @@ -353,8 +353,11 @@ int __mnt_want_write(struct vfsmount *m) |
| * incremented count after it has set MNT_WRITE_HOLD. |
| */ |
| smp_mb(); |
| - while (ACCESS_ONCE(mnt->mnt.mnt_flags) & MNT_WRITE_HOLD) |
| + while (ACCESS_ONCE(mnt->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 |