diff options
Diffstat (limited to 'fs/btrfs/delayed-ref.h')
-rw-r--r-- | fs/btrfs/delayed-ref.h | 85 |
1 files changed, 53 insertions, 32 deletions
diff --git a/fs/btrfs/delayed-ref.h b/fs/btrfs/delayed-ref.h index 3bec2ff0b15c..f6fc67ddad36 100644 --- a/fs/btrfs/delayed-ref.h +++ b/fs/btrfs/delayed-ref.h | |||
@@ -30,9 +30,6 @@ struct btrfs_delayed_ref_node { | |||
30 | /* the starting bytenr of the extent */ | 30 | /* the starting bytenr of the extent */ |
31 | u64 bytenr; | 31 | u64 bytenr; |
32 | 32 | ||
33 | /* the parent our backref will point to */ | ||
34 | u64 parent; | ||
35 | |||
36 | /* the size of the extent */ | 33 | /* the size of the extent */ |
37 | u64 num_bytes; | 34 | u64 num_bytes; |
38 | 35 | ||
@@ -50,10 +47,21 @@ struct btrfs_delayed_ref_node { | |||
50 | */ | 47 | */ |
51 | int ref_mod; | 48 | int ref_mod; |
52 | 49 | ||
50 | unsigned int action:8; | ||
51 | unsigned int type:8; | ||
53 | /* is this node still in the rbtree? */ | 52 | /* is this node still in the rbtree? */ |
53 | unsigned int is_head:1; | ||
54 | unsigned int in_tree:1; | 54 | unsigned int in_tree:1; |
55 | }; | 55 | }; |
56 | 56 | ||
57 | struct btrfs_delayed_extent_op { | ||
58 | struct btrfs_disk_key key; | ||
59 | u64 flags_to_set; | ||
60 | unsigned int update_key:1; | ||
61 | unsigned int update_flags:1; | ||
62 | unsigned int is_data:1; | ||
63 | }; | ||
64 | |||
57 | /* | 65 | /* |
58 | * the head refs are used to hold a lock on a given extent, which allows us | 66 | * the head refs are used to hold a lock on a given extent, which allows us |
59 | * to make sure that only one process is running the delayed refs | 67 | * to make sure that only one process is running the delayed refs |
@@ -71,6 +79,7 @@ struct btrfs_delayed_ref_head { | |||
71 | 79 | ||
72 | struct list_head cluster; | 80 | struct list_head cluster; |
73 | 81 | ||
82 | struct btrfs_delayed_extent_op *extent_op; | ||
74 | /* | 83 | /* |
75 | * when a new extent is allocated, it is just reserved in memory | 84 | * when a new extent is allocated, it is just reserved in memory |
76 | * The actual extent isn't inserted into the extent allocation tree | 85 | * The actual extent isn't inserted into the extent allocation tree |
@@ -84,27 +93,26 @@ struct btrfs_delayed_ref_head { | |||
84 | * the free has happened. | 93 | * the free has happened. |
85 | */ | 94 | */ |
86 | unsigned int must_insert_reserved:1; | 95 | unsigned int must_insert_reserved:1; |
96 | unsigned int is_data:1; | ||
87 | }; | 97 | }; |
88 | 98 | ||
89 | struct btrfs_delayed_ref { | 99 | struct btrfs_delayed_tree_ref { |
90 | struct btrfs_delayed_ref_node node; | 100 | struct btrfs_delayed_ref_node node; |
101 | union { | ||
102 | u64 root; | ||
103 | u64 parent; | ||
104 | }; | ||
105 | int level; | ||
106 | }; | ||
91 | 107 | ||
92 | /* the root objectid our ref will point to */ | 108 | struct btrfs_delayed_data_ref { |
93 | u64 root; | 109 | struct btrfs_delayed_ref_node node; |
94 | 110 | union { | |
95 | /* the generation for the backref */ | 111 | u64 root; |
96 | u64 generation; | 112 | u64 parent; |
97 | 113 | }; | |
98 | /* owner_objectid of the backref */ | 114 | u64 objectid; |
99 | u64 owner_objectid; | 115 | u64 offset; |
100 | |||
101 | /* operation done by this entry in the rbtree */ | ||
102 | u8 action; | ||
103 | |||
104 | /* if pin == 1, when the extent is freed it will be pinned until | ||
105 | * transaction commit | ||
106 | */ | ||
107 | unsigned int pin:1; | ||
108 | }; | 116 | }; |
109 | 117 | ||
110 | struct btrfs_delayed_ref_root { | 118 | struct btrfs_delayed_ref_root { |
@@ -143,17 +151,25 @@ static inline void btrfs_put_delayed_ref(struct btrfs_delayed_ref_node *ref) | |||
143 | } | 151 | } |
144 | } | 152 | } |
145 | 153 | ||
146 | int btrfs_add_delayed_ref(struct btrfs_trans_handle *trans, | 154 | int btrfs_add_delayed_tree_ref(struct btrfs_trans_handle *trans, |
147 | u64 bytenr, u64 num_bytes, u64 parent, u64 ref_root, | 155 | u64 bytenr, u64 num_bytes, u64 parent, |
148 | u64 ref_generation, u64 owner_objectid, int action, | 156 | u64 ref_root, int level, int action, |
149 | int pin); | 157 | struct btrfs_delayed_extent_op *extent_op); |
158 | int btrfs_add_delayed_data_ref(struct btrfs_trans_handle *trans, | ||
159 | u64 bytenr, u64 num_bytes, | ||
160 | u64 parent, u64 ref_root, | ||
161 | u64 owner, u64 offset, int action, | ||
162 | struct btrfs_delayed_extent_op *extent_op); | ||
163 | int btrfs_add_delayed_extent_op(struct btrfs_trans_handle *trans, | ||
164 | u64 bytenr, u64 num_bytes, | ||
165 | struct btrfs_delayed_extent_op *extent_op); | ||
150 | 166 | ||
151 | struct btrfs_delayed_ref_head * | 167 | struct btrfs_delayed_ref_head * |
152 | btrfs_find_delayed_ref_head(struct btrfs_trans_handle *trans, u64 bytenr); | 168 | btrfs_find_delayed_ref_head(struct btrfs_trans_handle *trans, u64 bytenr); |
153 | int btrfs_delayed_ref_pending(struct btrfs_trans_handle *trans, u64 bytenr); | 169 | int btrfs_delayed_ref_pending(struct btrfs_trans_handle *trans, u64 bytenr); |
154 | int btrfs_lookup_extent_ref(struct btrfs_trans_handle *trans, | 170 | int btrfs_lookup_extent_info(struct btrfs_trans_handle *trans, |
155 | struct btrfs_root *root, u64 bytenr, | 171 | struct btrfs_root *root, u64 bytenr, |
156 | u64 num_bytes, u32 *refs); | 172 | u64 num_bytes, u64 *refs, u64 *flags); |
157 | int btrfs_update_delayed_ref(struct btrfs_trans_handle *trans, | 173 | int btrfs_update_delayed_ref(struct btrfs_trans_handle *trans, |
158 | u64 bytenr, u64 num_bytes, u64 orig_parent, | 174 | u64 bytenr, u64 num_bytes, u64 orig_parent, |
159 | u64 parent, u64 orig_ref_root, u64 ref_root, | 175 | u64 parent, u64 orig_ref_root, u64 ref_root, |
@@ -169,18 +185,24 @@ int btrfs_find_ref_cluster(struct btrfs_trans_handle *trans, | |||
169 | */ | 185 | */ |
170 | static int btrfs_delayed_ref_is_head(struct btrfs_delayed_ref_node *node) | 186 | static int btrfs_delayed_ref_is_head(struct btrfs_delayed_ref_node *node) |
171 | { | 187 | { |
172 | return node->parent == (u64)-1; | 188 | return node->is_head; |
173 | } | 189 | } |
174 | 190 | ||
175 | /* | 191 | /* |
176 | * helper functions to cast a node into its container | 192 | * helper functions to cast a node into its container |
177 | */ | 193 | */ |
178 | static inline struct btrfs_delayed_ref * | 194 | static inline struct btrfs_delayed_tree_ref * |
179 | btrfs_delayed_node_to_ref(struct btrfs_delayed_ref_node *node) | 195 | btrfs_delayed_node_to_tree_ref(struct btrfs_delayed_ref_node *node) |
180 | { | 196 | { |
181 | WARN_ON(btrfs_delayed_ref_is_head(node)); | 197 | WARN_ON(btrfs_delayed_ref_is_head(node)); |
182 | return container_of(node, struct btrfs_delayed_ref, node); | 198 | return container_of(node, struct btrfs_delayed_tree_ref, node); |
199 | } | ||
183 | 200 | ||
201 | static inline struct btrfs_delayed_data_ref * | ||
202 | btrfs_delayed_node_to_data_ref(struct btrfs_delayed_ref_node *node) | ||
203 | { | ||
204 | WARN_ON(btrfs_delayed_ref_is_head(node)); | ||
205 | return container_of(node, struct btrfs_delayed_data_ref, node); | ||
184 | } | 206 | } |
185 | 207 | ||
186 | static inline struct btrfs_delayed_ref_head * | 208 | static inline struct btrfs_delayed_ref_head * |
@@ -188,6 +210,5 @@ btrfs_delayed_node_to_head(struct btrfs_delayed_ref_node *node) | |||
188 | { | 210 | { |
189 | WARN_ON(!btrfs_delayed_ref_is_head(node)); | 211 | WARN_ON(!btrfs_delayed_ref_is_head(node)); |
190 | return container_of(node, struct btrfs_delayed_ref_head, node); | 212 | return container_of(node, struct btrfs_delayed_ref_head, node); |
191 | |||
192 | } | 213 | } |
193 | #endif | 214 | #endif |