]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - fs/btrfs/locking.c
Merge branch 'x86-pti-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
[linux.git] / fs / btrfs / locking.c
index e4faefac9d16e91939ac8d8504adf646decde4e6..1da768e5ef75bda36142c084d6ba7c2b5c4bc809 100644 (file)
@@ -66,22 +66,16 @@ void btrfs_clear_lock_blocking_rw(struct extent_buffer *eb, int rw)
                write_lock(&eb->lock);
                WARN_ON(atomic_read(&eb->spinning_writers));
                atomic_inc(&eb->spinning_writers);
-               /*
-                * atomic_dec_and_test implies a barrier for waitqueue_active
-                */
-               if (atomic_dec_and_test(&eb->blocking_writers) &&
-                   waitqueue_active(&eb->write_lock_wq))
-                       wake_up(&eb->write_lock_wq);
+               /* atomic_dec_and_test implies a barrier */
+               if (atomic_dec_and_test(&eb->blocking_writers))
+                       cond_wake_up_nomb(&eb->write_lock_wq);
        } else if (rw == BTRFS_READ_LOCK_BLOCKING) {
                BUG_ON(atomic_read(&eb->blocking_readers) == 0);
                read_lock(&eb->lock);
                atomic_inc(&eb->spinning_readers);
-               /*
-                * atomic_dec_and_test implies a barrier for waitqueue_active
-                */
-               if (atomic_dec_and_test(&eb->blocking_readers) &&
-                   waitqueue_active(&eb->read_lock_wq))
-                       wake_up(&eb->read_lock_wq);
+               /* atomic_dec_and_test implies a barrier */
+               if (atomic_dec_and_test(&eb->blocking_readers))
+                       cond_wake_up_nomb(&eb->read_lock_wq);
        }
 }
 
@@ -221,12 +215,9 @@ void btrfs_tree_read_unlock_blocking(struct extent_buffer *eb)
        }
        btrfs_assert_tree_read_locked(eb);
        WARN_ON(atomic_read(&eb->blocking_readers) == 0);
-       /*
-        * atomic_dec_and_test implies a barrier for waitqueue_active
-        */
-       if (atomic_dec_and_test(&eb->blocking_readers) &&
-           waitqueue_active(&eb->read_lock_wq))
-               wake_up(&eb->read_lock_wq);
+       /* atomic_dec_and_test implies a barrier */
+       if (atomic_dec_and_test(&eb->blocking_readers))
+               cond_wake_up_nomb(&eb->read_lock_wq);
        atomic_dec(&eb->read_locks);
 }
 
@@ -275,12 +266,9 @@ void btrfs_tree_unlock(struct extent_buffer *eb)
        if (blockers) {
                WARN_ON(atomic_read(&eb->spinning_writers));
                atomic_dec(&eb->blocking_writers);
-               /*
-                * Make sure counter is updated before we wake up waiters.
-                */
+               /* Use the lighter barrier after atomic */
                smp_mb__after_atomic();
-               if (waitqueue_active(&eb->write_lock_wq))
-                       wake_up(&eb->write_lock_wq);
+               cond_wake_up_nomb(&eb->write_lock_wq);
        } else {
                WARN_ON(atomic_read(&eb->spinning_writers) != 1);
                atomic_dec(&eb->spinning_writers);