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
22#define BTRFS_ADD_DELAYED_REF 1
23#define BTRFS_DROP_DELAYED_REF 2
24#define BTRFS_ADD_DELAYED_EXTENT 3
25#define BTRFS_UPDATE_DELAYED_HEAD 4
26
27struct btrfs_delayed_ref_node {
28 struct rb_node rb_node;
29
30
31 u64 bytenr;
32
33
34 u64 num_bytes;
35
36
37 u64 seq;
38
39
40 atomic_t refs;
41
42
43
44
45
46
47
48
49
50
51 int ref_mod;
52
53 unsigned int action:8;
54 unsigned int type:8;
55
56 unsigned int is_head:1;
57 unsigned int in_tree:1;
58};
59
60struct btrfs_delayed_extent_op {
61 struct btrfs_disk_key key;
62 u64 flags_to_set;
63 unsigned int update_key:1;
64 unsigned int update_flags:1;
65 unsigned int is_data:1;
66};
67
68
69
70
71
72
73
74struct btrfs_delayed_ref_head {
75 struct btrfs_delayed_ref_node node;
76
77
78
79
80
81 struct mutex mutex;
82
83 struct list_head cluster;
84
85 struct btrfs_delayed_extent_op *extent_op;
86
87
88
89
90
91
92
93
94
95
96
97
98 unsigned int must_insert_reserved:1;
99 unsigned int is_data:1;
100};
101
102struct btrfs_delayed_tree_ref {
103 struct btrfs_delayed_ref_node node;
104 u64 root;
105 u64 parent;
106 int level;
107};
108
109struct btrfs_delayed_data_ref {
110 struct btrfs_delayed_ref_node node;
111 u64 root;
112 u64 parent;
113 u64 objectid;
114 u64 offset;
115};
116
117struct btrfs_delayed_ref_root {
118 struct rb_root root;
119
120
121 spinlock_t lock;
122
123
124
125
126 unsigned long num_entries;
127
128
129 unsigned long num_heads;
130
131
132 unsigned long num_heads_ready;
133
134
135
136
137
138
139 int flushing;
140
141 u64 run_delayed_start;
142};
143
144static inline void btrfs_put_delayed_ref(struct btrfs_delayed_ref_node *ref)
145{
146 WARN_ON(atomic_read(&ref->refs) == 0);
147 if (atomic_dec_and_test(&ref->refs)) {
148 WARN_ON(ref->in_tree);
149 kfree(ref);
150 }
151}
152
153int btrfs_add_delayed_tree_ref(struct btrfs_fs_info *fs_info,
154 struct btrfs_trans_handle *trans,
155 u64 bytenr, u64 num_bytes, u64 parent,
156 u64 ref_root, int level, int action,
157 struct btrfs_delayed_extent_op *extent_op,
158 int for_cow);
159int btrfs_add_delayed_data_ref(struct btrfs_fs_info *fs_info,
160 struct btrfs_trans_handle *trans,
161 u64 bytenr, u64 num_bytes,
162 u64 parent, u64 ref_root,
163 u64 owner, u64 offset, int action,
164 struct btrfs_delayed_extent_op *extent_op,
165 int for_cow);
166int btrfs_add_delayed_extent_op(struct btrfs_fs_info *fs_info,
167 struct btrfs_trans_handle *trans,
168 u64 bytenr, u64 num_bytes,
169 struct btrfs_delayed_extent_op *extent_op);
170void btrfs_merge_delayed_refs(struct btrfs_trans_handle *trans,
171 struct btrfs_fs_info *fs_info,
172 struct btrfs_delayed_ref_root *delayed_refs,
173 struct btrfs_delayed_ref_head *head);
174
175struct btrfs_delayed_ref_head *
176btrfs_find_delayed_ref_head(struct btrfs_trans_handle *trans, u64 bytenr);
177int btrfs_delayed_ref_lock(struct btrfs_trans_handle *trans,
178 struct btrfs_delayed_ref_head *head);
179int btrfs_find_ref_cluster(struct btrfs_trans_handle *trans,
180 struct list_head *cluster, u64 search_start);
181
182int btrfs_check_delayed_seq(struct btrfs_fs_info *fs_info,
183 struct btrfs_delayed_ref_root *delayed_refs,
184 u64 seq);
185
186
187
188
189
190
191static inline int need_ref_seq(int for_cow, u64 rootid)
192{
193 if (for_cow)
194 return 0;
195
196 if (rootid == BTRFS_FS_TREE_OBJECTID)
197 return 1;
198
199 if ((s64)rootid >= (s64)BTRFS_FIRST_FREE_OBJECTID)
200 return 1;
201
202 return 0;
203}
204
205
206
207
208
209static int btrfs_delayed_ref_is_head(struct btrfs_delayed_ref_node *node)
210{
211 return node->is_head;
212}
213
214
215
216
217static inline struct btrfs_delayed_tree_ref *
218btrfs_delayed_node_to_tree_ref(struct btrfs_delayed_ref_node *node)
219{
220 WARN_ON(btrfs_delayed_ref_is_head(node));
221 return container_of(node, struct btrfs_delayed_tree_ref, node);
222}
223
224static inline struct btrfs_delayed_data_ref *
225btrfs_delayed_node_to_data_ref(struct btrfs_delayed_ref_node *node)
226{
227 WARN_ON(btrfs_delayed_ref_is_head(node));
228 return container_of(node, struct btrfs_delayed_data_ref, node);
229}
230
231static inline struct btrfs_delayed_ref_head *
232btrfs_delayed_node_to_head(struct btrfs_delayed_ref_node *node)
233{
234 WARN_ON(!btrfs_delayed_ref_is_head(node));
235 return container_of(node, struct btrfs_delayed_ref_head, node);
236}
237#endif
238