btrfs: use assertion helpers for spinning readers
[sfrench/cifs-2.6.git] / fs / btrfs / locking.c
index 82b84e4daad1f336fc8b6de895d445682308f3ef..47bcd288977de78bd41697254106704907d90734 100644 (file)
 
 static void btrfs_assert_tree_read_locked(struct extent_buffer *eb);
 
+#ifdef CONFIG_BTRFS_DEBUG
+static void btrfs_assert_spinning_writers_get(struct extent_buffer *eb)
+{
+       WARN_ON(atomic_read(&eb->spinning_writers));
+       atomic_inc(&eb->spinning_writers);
+}
+
+static void btrfs_assert_spinning_writers_put(struct extent_buffer *eb)
+{
+       WARN_ON(atomic_read(&eb->spinning_writers) != 1);
+       atomic_dec(&eb->spinning_writers);
+}
+
+static void btrfs_assert_no_spinning_writers(struct extent_buffer *eb)
+{
+       WARN_ON(atomic_read(&eb->spinning_writers));
+}
+
+static void btrfs_assert_spinning_readers_get(struct extent_buffer *eb)
+{
+       atomic_inc(&eb->spinning_readers);
+}
+
+static void btrfs_assert_spinning_readers_put(struct extent_buffer *eb)
+{
+       WARN_ON(atomic_read(&eb->spinning_readers) == 0);
+       atomic_dec(&eb->spinning_readers);
+}
+
+#else
+static void btrfs_assert_spinning_writers_get(struct extent_buffer *eb) { }
+static void btrfs_assert_spinning_writers_put(struct extent_buffer *eb) { }
+static void btrfs_assert_no_spinning_writers(struct extent_buffer *eb) { }
+static void btrfs_assert_spinning_readers_put(struct extent_buffer *eb) { }
+static void btrfs_assert_spinning_readers_get(struct extent_buffer *eb) { }
+#endif
+
 void btrfs_set_lock_blocking_read(struct extent_buffer *eb)
 {
        /*
@@ -25,8 +62,7 @@ void btrfs_set_lock_blocking_read(struct extent_buffer *eb)
                return;
        btrfs_assert_tree_read_locked(eb);
        atomic_inc(&eb->blocking_readers);
-       WARN_ON(atomic_read(&eb->spinning_readers) == 0);
-       atomic_dec(&eb->spinning_readers);
+       btrfs_assert_spinning_readers_put(eb);
        read_unlock(&eb->lock);
 }
 
@@ -40,8 +76,7 @@ void btrfs_set_lock_blocking_write(struct extent_buffer *eb)
        if (eb->lock_nested && current->pid == eb->lock_owner)
                return;
        if (atomic_read(&eb->blocking_writers) == 0) {
-               WARN_ON(atomic_read(&eb->spinning_writers) != 1);
-               atomic_dec(&eb->spinning_writers);
+               btrfs_assert_spinning_writers_put(eb);
                btrfs_assert_tree_locked(eb);
                atomic_inc(&eb->blocking_writers);
                write_unlock(&eb->lock);
@@ -59,7 +94,7 @@ void btrfs_clear_lock_blocking_read(struct extent_buffer *eb)
                return;
        BUG_ON(atomic_read(&eb->blocking_readers) == 0);
        read_lock(&eb->lock);
-       atomic_inc(&eb->spinning_readers);
+       btrfs_assert_spinning_readers_get(eb);
        /* atomic_dec_and_test implies a barrier */
        if (atomic_dec_and_test(&eb->blocking_readers))
                cond_wake_up_nomb(&eb->read_lock_wq);
@@ -77,8 +112,7 @@ void btrfs_clear_lock_blocking_write(struct extent_buffer *eb)
                return;
        BUG_ON(atomic_read(&eb->blocking_writers) != 1);
        write_lock(&eb->lock);
-       WARN_ON(atomic_read(&eb->spinning_writers));
-       atomic_inc(&eb->spinning_writers);
+       btrfs_assert_spinning_writers_get(eb);
        /* atomic_dec_and_test implies a barrier */
        if (atomic_dec_and_test(&eb->blocking_writers))
                cond_wake_up_nomb(&eb->write_lock_wq);
@@ -115,7 +149,7 @@ again:
                goto again;
        }
        atomic_inc(&eb->read_locks);
-       atomic_inc(&eb->spinning_readers);
+       btrfs_assert_spinning_readers_get(eb);
 }
 
 /*
@@ -134,7 +168,7 @@ int btrfs_tree_read_lock_atomic(struct extent_buffer *eb)
                return 0;
        }
        atomic_inc(&eb->read_locks);
-       atomic_inc(&eb->spinning_readers);
+       btrfs_assert_spinning_readers_get(eb);
        return 1;
 }
 
@@ -155,7 +189,7 @@ int btrfs_try_tree_read_lock(struct extent_buffer *eb)
                return 0;
        }
        atomic_inc(&eb->read_locks);
-       atomic_inc(&eb->spinning_readers);
+       btrfs_assert_spinning_readers_get(eb);
        return 1;
 }
 
@@ -176,7 +210,7 @@ int btrfs_try_tree_write_lock(struct extent_buffer *eb)
                return 0;
        }
        atomic_inc(&eb->write_locks);
-       atomic_inc(&eb->spinning_writers);
+       btrfs_assert_spinning_writers_get(eb);
        eb->lock_owner = current->pid;
        return 1;
 }
@@ -197,8 +231,7 @@ void btrfs_tree_read_unlock(struct extent_buffer *eb)
                return;
        }
        btrfs_assert_tree_read_locked(eb);
-       WARN_ON(atomic_read(&eb->spinning_readers) == 0);
-       atomic_dec(&eb->spinning_readers);
+       btrfs_assert_spinning_readers_put(eb);
        atomic_dec(&eb->read_locks);
        read_unlock(&eb->lock);
 }
@@ -242,8 +275,7 @@ again:
                write_unlock(&eb->lock);
                goto again;
        }
-       WARN_ON(atomic_read(&eb->spinning_writers));
-       atomic_inc(&eb->spinning_writers);
+       btrfs_assert_spinning_writers_get(eb);
        atomic_inc(&eb->write_locks);
        eb->lock_owner = current->pid;
 }
@@ -262,14 +294,13 @@ void btrfs_tree_unlock(struct extent_buffer *eb)
        atomic_dec(&eb->write_locks);
 
        if (blockers) {
-               WARN_ON(atomic_read(&eb->spinning_writers));
+               btrfs_assert_no_spinning_writers(eb);
                atomic_dec(&eb->blocking_writers);
                /* Use the lighter barrier after atomic */
                smp_mb__after_atomic();
                cond_wake_up_nomb(&eb->write_lock_wq);
        } else {
-               WARN_ON(atomic_read(&eb->spinning_writers) != 1);
-               atomic_dec(&eb->spinning_writers);
+               btrfs_assert_spinning_writers_put(eb);
                write_unlock(&eb->lock);
        }
 }