fs: namespace preemption fix
authorThomas Gleixner <tglx@linutronix.de>
Sun, 19 Jul 2009 13:44:27 +0000 (08:44 -0500)
committerClark Williams <williams@redhat.com>
Wed, 15 Feb 2012 16:32:56 +0000 (10:32 -0600)
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

index cfc6d4448aa54bdc538131b1e53285a92bb20073..63fd6d78be27c2fced8ff422e878d5f0e55a824b 100644 (file)
@@ -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;
 }