void btrfs_tree_read_lock(struct extent_buffer *eb);
void btrfs_tree_read_unlock(struct extent_buffer *eb);
void btrfs_tree_read_unlock_blocking(struct extent_buffer *eb);
-void btrfs_set_lock_blocking_rw(struct extent_buffer *eb, int rw);
-void btrfs_clear_lock_blocking_rw(struct extent_buffer *eb, int rw);
+void btrfs_set_lock_blocking_read(struct extent_buffer *eb);
+void btrfs_set_lock_blocking_write(struct extent_buffer *eb);
+void btrfs_clear_lock_blocking_read(struct extent_buffer *eb);
+void btrfs_clear_lock_blocking_write(struct extent_buffer *eb);
void btrfs_assert_tree_locked(struct extent_buffer *eb);
int btrfs_try_tree_read_lock(struct extent_buffer *eb);
int btrfs_try_tree_write_lock(struct extent_buffer *eb);
BUG();
}
-static inline void btrfs_set_lock_blocking(struct extent_buffer *eb)
+/*
+ * If we currently have a spinning reader or writer lock (indicated by the rw
+ * flag) this will bump the count of blocking holders and drop the spinlock.
+ */
+static inline void btrfs_set_lock_blocking_rw(struct extent_buffer *eb, int rw)
{
- btrfs_set_lock_blocking_rw(eb, BTRFS_WRITE_LOCK);
+ if (rw == BTRFS_WRITE_LOCK)
+ btrfs_set_lock_blocking_write(eb);
+ else if (rw == BTRFS_READ_LOCK)
+ btrfs_set_lock_blocking_read(eb);
}
-static inline void btrfs_clear_lock_blocking(struct extent_buffer *eb)
+static inline void btrfs_set_lock_blocking(struct extent_buffer *eb)
{
- btrfs_clear_lock_blocking_rw(eb, BTRFS_WRITE_LOCK_BLOCKING);
+ btrfs_set_lock_blocking_write(eb);
}
+
#endif