0001
0002
0003
0004
0005
0006 #ifndef BTRFS_LOCKING_H
0007 #define BTRFS_LOCKING_H
0008
0009 #include <linux/atomic.h>
0010 #include <linux/wait.h>
0011 #include <linux/percpu_counter.h>
0012 #include "extent_io.h"
0013
0014 #define BTRFS_WRITE_LOCK 1
0015 #define BTRFS_READ_LOCK 2
0016
0017
0018
0019
0020
0021
0022 enum btrfs_lock_nesting {
0023 BTRFS_NESTING_NORMAL,
0024
0025
0026
0027
0028
0029
0030
0031 BTRFS_NESTING_COW,
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042 BTRFS_NESTING_LEFT,
0043 BTRFS_NESTING_RIGHT,
0044
0045
0046
0047
0048
0049
0050 BTRFS_NESTING_LEFT_COW,
0051 BTRFS_NESTING_RIGHT_COW,
0052
0053
0054
0055
0056
0057
0058
0059
0060 BTRFS_NESTING_SPLIT,
0061
0062
0063
0064
0065
0066
0067
0068
0069 BTRFS_NESTING_NEW_ROOT,
0070
0071
0072
0073
0074
0075
0076
0077
0078 BTRFS_NESTING_MAX,
0079 };
0080
0081 static_assert(BTRFS_NESTING_MAX <= MAX_LOCKDEP_SUBCLASSES,
0082 "too many lock subclasses defined");
0083
0084 struct btrfs_path;
0085
0086 void __btrfs_tree_lock(struct extent_buffer *eb, enum btrfs_lock_nesting nest);
0087 void btrfs_tree_lock(struct extent_buffer *eb);
0088 void btrfs_tree_unlock(struct extent_buffer *eb);
0089
0090 void __btrfs_tree_read_lock(struct extent_buffer *eb, enum btrfs_lock_nesting nest);
0091 void btrfs_tree_read_lock(struct extent_buffer *eb);
0092 void btrfs_tree_read_unlock(struct extent_buffer *eb);
0093 int btrfs_try_tree_read_lock(struct extent_buffer *eb);
0094 int btrfs_try_tree_write_lock(struct extent_buffer *eb);
0095 struct extent_buffer *btrfs_lock_root_node(struct btrfs_root *root);
0096 struct extent_buffer *btrfs_read_lock_root_node(struct btrfs_root *root);
0097
0098 #ifdef CONFIG_BTRFS_DEBUG
0099 static inline void btrfs_assert_tree_write_locked(struct extent_buffer *eb)
0100 {
0101 lockdep_assert_held_write(&eb->lock);
0102 }
0103 #else
0104 static inline void btrfs_assert_tree_write_locked(struct extent_buffer *eb) { }
0105 #endif
0106
0107 void btrfs_unlock_up_safe(struct btrfs_path *path, int level);
0108
0109 static inline void btrfs_tree_unlock_rw(struct extent_buffer *eb, int rw)
0110 {
0111 if (rw == BTRFS_WRITE_LOCK)
0112 btrfs_tree_unlock(eb);
0113 else if (rw == BTRFS_READ_LOCK)
0114 btrfs_tree_read_unlock(eb);
0115 else
0116 BUG();
0117 }
0118
0119 struct btrfs_drew_lock {
0120 atomic_t readers;
0121 struct percpu_counter writers;
0122 wait_queue_head_t pending_writers;
0123 wait_queue_head_t pending_readers;
0124 };
0125
0126 int btrfs_drew_lock_init(struct btrfs_drew_lock *lock);
0127 void btrfs_drew_lock_destroy(struct btrfs_drew_lock *lock);
0128 void btrfs_drew_write_lock(struct btrfs_drew_lock *lock);
0129 bool btrfs_drew_try_write_lock(struct btrfs_drew_lock *lock);
0130 void btrfs_drew_write_unlock(struct btrfs_drew_lock *lock);
0131 void btrfs_drew_read_lock(struct btrfs_drew_lock *lock);
0132 void btrfs_drew_read_unlock(struct btrfs_drew_lock *lock);
0133
0134 #ifdef CONFIG_DEBUG_LOCK_ALLOC
0135 void btrfs_set_buffer_lockdep_class(u64 objectid, struct extent_buffer *eb, int level);
0136 void btrfs_maybe_reset_lockdep_class(struct btrfs_root *root, struct extent_buffer *eb);
0137 #else
0138 static inline void btrfs_set_buffer_lockdep_class(u64 objectid,
0139 struct extent_buffer *eb, int level)
0140 {
0141 }
0142 static inline void btrfs_maybe_reset_lockdep_class(struct btrfs_root *root,
0143 struct extent_buffer *eb)
0144 {
0145 }
0146 #endif
0147
0148 #endif