1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18#ifndef __DELAYED_REF__
19#define __DELAYED_REF__
20
21#include <linux/refcount.h>
22
23
24#define BTRFS_ADD_DELAYED_REF 1
25#define BTRFS_DROP_DELAYED_REF 2
26#define BTRFS_ADD_DELAYED_EXTENT 3
27#define BTRFS_UPDATE_DELAYED_HEAD 4
28
29
30
31
32
33
34
35
36
37
38struct btrfs_delayed_ref_node {
39
40 struct list_head list;
41
42
43
44
45
46 struct list_head add_list;
47
48
49 u64 bytenr;
50
51
52 u64 num_bytes;
53
54
55 u64 seq;
56
57
58 refcount_t refs;
59
60
61
62
63
64
65
66
67
68
69 int ref_mod;
70
71 unsigned int action:8;
72 unsigned int type:8;
73
74 unsigned int is_head:1;
75 unsigned int in_tree:1;
76};
77
78struct btrfs_delayed_extent_op {
79 struct btrfs_disk_key key;
80 u8 level;
81 bool update_key;
82 bool update_flags;
83 bool is_data;
84 u64 flags_to_set;
85};
86
87
88
89
90
91
92
93struct btrfs_delayed_ref_head {
94 struct btrfs_delayed_ref_node node;
95
96
97
98
99
100 struct mutex mutex;
101
102 spinlock_t lock;
103 struct list_head ref_list;
104
105 struct list_head ref_add_list;
106
107 struct rb_node href_node;
108
109 struct btrfs_delayed_extent_op *extent_op;
110
111
112
113
114
115
116 int total_ref_mod;
117
118
119
120
121
122
123
124
125
126 u64 qgroup_ref_root;
127 u64 qgroup_reserved;
128
129
130
131
132
133
134
135
136
137
138
139
140
141 unsigned int must_insert_reserved:1;
142 unsigned int is_data:1;
143 unsigned int processing:1;
144};
145
146struct btrfs_delayed_tree_ref {
147 struct btrfs_delayed_ref_node node;
148 u64 root;
149 u64 parent;
150 int level;
151};
152
153struct btrfs_delayed_data_ref {
154 struct btrfs_delayed_ref_node node;
155 u64 root;
156 u64 parent;
157 u64 objectid;
158 u64 offset;
159};
160
161struct btrfs_delayed_ref_root {
162
163 struct rb_root href_root;
164
165
166 struct rb_root dirty_extent_root;
167
168
169 spinlock_t lock;
170
171
172
173
174 atomic_t num_entries;
175
176
177 unsigned long num_heads;
178
179
180 unsigned long num_heads_ready;
181
182 u64 pending_csums;
183
184
185
186
187
188
189 int flushing;
190
191 u64 run_delayed_start;
192
193
194
195
196
197
198
199 u64 qgroup_to_skip;
200};
201
202extern struct kmem_cache *btrfs_delayed_ref_head_cachep;
203extern struct kmem_cache *btrfs_delayed_tree_ref_cachep;
204extern struct kmem_cache *btrfs_delayed_data_ref_cachep;
205extern struct kmem_cache *btrfs_delayed_extent_op_cachep;
206
207int btrfs_delayed_ref_init(void);
208void btrfs_delayed_ref_exit(void);
209
210static inline struct btrfs_delayed_extent_op *
211btrfs_alloc_delayed_extent_op(void)
212{
213 return kmem_cache_alloc(btrfs_delayed_extent_op_cachep, GFP_NOFS);
214}
215
216static inline void
217btrfs_free_delayed_extent_op(struct btrfs_delayed_extent_op *op)
218{
219 if (op)
220 kmem_cache_free(btrfs_delayed_extent_op_cachep, op);
221}
222
223static inline void btrfs_put_delayed_ref(struct btrfs_delayed_ref_node *ref)
224{
225 WARN_ON(refcount_read(&ref->refs) == 0);
226 if (refcount_dec_and_test(&ref->refs)) {
227 WARN_ON(ref->in_tree);
228 switch (ref->type) {
229 case BTRFS_TREE_BLOCK_REF_KEY:
230 case BTRFS_SHARED_BLOCK_REF_KEY:
231 kmem_cache_free(btrfs_delayed_tree_ref_cachep, ref);
232 break;
233 case BTRFS_EXTENT_DATA_REF_KEY:
234 case BTRFS_SHARED_DATA_REF_KEY:
235 kmem_cache_free(btrfs_delayed_data_ref_cachep, ref);
236 break;
237 case 0:
238 kmem_cache_free(btrfs_delayed_ref_head_cachep, ref);
239 break;
240 default:
241 BUG();
242 }
243 }
244}
245
246int btrfs_add_delayed_tree_ref(struct btrfs_fs_info *fs_info,
247 struct btrfs_trans_handle *trans,
248 u64 bytenr, u64 num_bytes, u64 parent,
249 u64 ref_root, int level, int action,
250 struct btrfs_delayed_extent_op *extent_op,
251 int *old_ref_mod, int *new_ref_mod);
252int btrfs_add_delayed_data_ref(struct btrfs_fs_info *fs_info,
253 struct btrfs_trans_handle *trans,
254 u64 bytenr, u64 num_bytes,
255 u64 parent, u64 ref_root,
256 u64 owner, u64 offset, u64 reserved, int action,
257 int *old_ref_mod, int *new_ref_mod);
258int btrfs_add_delayed_extent_op(struct btrfs_fs_info *fs_info,
259 struct btrfs_trans_handle *trans,
260 u64 bytenr, u64 num_bytes,
261 struct btrfs_delayed_extent_op *extent_op);
262void btrfs_merge_delayed_refs(struct btrfs_trans_handle *trans,
263 struct btrfs_fs_info *fs_info,
264 struct btrfs_delayed_ref_root *delayed_refs,
265 struct btrfs_delayed_ref_head *head);
266
267struct btrfs_delayed_ref_head *
268btrfs_find_delayed_ref_head(struct btrfs_delayed_ref_root *delayed_refs,
269 u64 bytenr);
270int btrfs_delayed_ref_lock(struct btrfs_trans_handle *trans,
271 struct btrfs_delayed_ref_head *head);
272static inline void btrfs_delayed_ref_unlock(struct btrfs_delayed_ref_head *head)
273{
274 mutex_unlock(&head->mutex);
275}
276
277
278struct btrfs_delayed_ref_head *
279btrfs_select_ref_head(struct btrfs_trans_handle *trans);
280
281int btrfs_check_delayed_seq(struct btrfs_fs_info *fs_info,
282 struct btrfs_delayed_ref_root *delayed_refs,
283 u64 seq);
284
285
286
287
288
289static int btrfs_delayed_ref_is_head(struct btrfs_delayed_ref_node *node)
290{
291 return node->is_head;
292}
293
294
295
296
297static inline struct btrfs_delayed_tree_ref *
298btrfs_delayed_node_to_tree_ref(struct btrfs_delayed_ref_node *node)
299{
300 WARN_ON(btrfs_delayed_ref_is_head(node));
301 return container_of(node, struct btrfs_delayed_tree_ref, node);
302}
303
304static inline struct btrfs_delayed_data_ref *
305btrfs_delayed_node_to_data_ref(struct btrfs_delayed_ref_node *node)
306{
307 WARN_ON(btrfs_delayed_ref_is_head(node));
308 return container_of(node, struct btrfs_delayed_data_ref, node);
309}
310
311static inline struct btrfs_delayed_ref_head *
312btrfs_delayed_node_to_head(struct btrfs_delayed_ref_node *node)
313{
314 WARN_ON(!btrfs_delayed_ref_is_head(node));
315 return container_of(node, struct btrfs_delayed_ref_head, node);
316}
317#endif
318