diff options
Diffstat (limited to 'fs/btrfs/delayed-ref.h')
-rw-r--r-- | fs/btrfs/delayed-ref.h | 52 |
1 files changed, 51 insertions, 1 deletions
diff --git a/fs/btrfs/delayed-ref.h b/fs/btrfs/delayed-ref.h index c9d703693df0..f75fcaf79aeb 100644 --- a/fs/btrfs/delayed-ref.h +++ b/fs/btrfs/delayed-ref.h | |||
@@ -132,6 +132,15 @@ struct btrfs_delayed_ref_root { | |||
132 | unsigned long num_heads_ready; | 132 | unsigned long num_heads_ready; |
133 | 133 | ||
134 | /* | 134 | /* |
135 | * bumped when someone is making progress on the delayed | ||
136 | * refs, so that other procs know they are just adding to | ||
137 | * contention intead of helping | ||
138 | */ | ||
139 | atomic_t procs_running_refs; | ||
140 | atomic_t ref_seq; | ||
141 | wait_queue_head_t wait; | ||
142 | |||
143 | /* | ||
135 | * set when the tree is flushing before a transaction commit, | 144 | * set when the tree is flushing before a transaction commit, |
136 | * used by the throttling code to decide if new updates need | 145 | * used by the throttling code to decide if new updates need |
137 | * to be run right away | 146 | * to be run right away |
@@ -141,12 +150,47 @@ struct btrfs_delayed_ref_root { | |||
141 | u64 run_delayed_start; | 150 | u64 run_delayed_start; |
142 | }; | 151 | }; |
143 | 152 | ||
153 | extern struct kmem_cache *btrfs_delayed_ref_head_cachep; | ||
154 | extern struct kmem_cache *btrfs_delayed_tree_ref_cachep; | ||
155 | extern struct kmem_cache *btrfs_delayed_data_ref_cachep; | ||
156 | extern struct kmem_cache *btrfs_delayed_extent_op_cachep; | ||
157 | |||
158 | int btrfs_delayed_ref_init(void); | ||
159 | void btrfs_delayed_ref_exit(void); | ||
160 | |||
161 | static inline struct btrfs_delayed_extent_op * | ||
162 | btrfs_alloc_delayed_extent_op(void) | ||
163 | { | ||
164 | return kmem_cache_alloc(btrfs_delayed_extent_op_cachep, GFP_NOFS); | ||
165 | } | ||
166 | |||
167 | static inline void | ||
168 | btrfs_free_delayed_extent_op(struct btrfs_delayed_extent_op *op) | ||
169 | { | ||
170 | if (op) | ||
171 | kmem_cache_free(btrfs_delayed_extent_op_cachep, op); | ||
172 | } | ||
173 | |||
144 | static inline void btrfs_put_delayed_ref(struct btrfs_delayed_ref_node *ref) | 174 | static inline void btrfs_put_delayed_ref(struct btrfs_delayed_ref_node *ref) |
145 | { | 175 | { |
146 | WARN_ON(atomic_read(&ref->refs) == 0); | 176 | WARN_ON(atomic_read(&ref->refs) == 0); |
147 | if (atomic_dec_and_test(&ref->refs)) { | 177 | if (atomic_dec_and_test(&ref->refs)) { |
148 | WARN_ON(ref->in_tree); | 178 | WARN_ON(ref->in_tree); |
149 | kfree(ref); | 179 | switch (ref->type) { |
180 | case BTRFS_TREE_BLOCK_REF_KEY: | ||
181 | case BTRFS_SHARED_BLOCK_REF_KEY: | ||
182 | kmem_cache_free(btrfs_delayed_tree_ref_cachep, ref); | ||
183 | break; | ||
184 | case BTRFS_EXTENT_DATA_REF_KEY: | ||
185 | case BTRFS_SHARED_DATA_REF_KEY: | ||
186 | kmem_cache_free(btrfs_delayed_data_ref_cachep, ref); | ||
187 | break; | ||
188 | case 0: | ||
189 | kmem_cache_free(btrfs_delayed_ref_head_cachep, ref); | ||
190 | break; | ||
191 | default: | ||
192 | BUG(); | ||
193 | } | ||
150 | } | 194 | } |
151 | } | 195 | } |
152 | 196 | ||
@@ -176,8 +220,14 @@ struct btrfs_delayed_ref_head * | |||
176 | btrfs_find_delayed_ref_head(struct btrfs_trans_handle *trans, u64 bytenr); | 220 | btrfs_find_delayed_ref_head(struct btrfs_trans_handle *trans, u64 bytenr); |
177 | int btrfs_delayed_ref_lock(struct btrfs_trans_handle *trans, | 221 | int btrfs_delayed_ref_lock(struct btrfs_trans_handle *trans, |
178 | struct btrfs_delayed_ref_head *head); | 222 | struct btrfs_delayed_ref_head *head); |
223 | static inline void btrfs_delayed_ref_unlock(struct btrfs_delayed_ref_head *head) | ||
224 | { | ||
225 | mutex_unlock(&head->mutex); | ||
226 | } | ||
227 | |||
179 | int btrfs_find_ref_cluster(struct btrfs_trans_handle *trans, | 228 | int btrfs_find_ref_cluster(struct btrfs_trans_handle *trans, |
180 | struct list_head *cluster, u64 search_start); | 229 | struct list_head *cluster, u64 search_start); |
230 | void btrfs_release_ref_cluster(struct list_head *cluster); | ||
181 | 231 | ||
182 | int btrfs_check_delayed_seq(struct btrfs_fs_info *fs_info, | 232 | int btrfs_check_delayed_seq(struct btrfs_fs_info *fs_info, |
183 | struct btrfs_delayed_ref_root *delayed_refs, | 233 | struct btrfs_delayed_ref_root *delayed_refs, |