diff options
Diffstat (limited to 'fs/nilfs2/btree.c')
-rw-r--r-- | fs/nilfs2/btree.c | 625 |
1 files changed, 295 insertions, 330 deletions
diff --git a/fs/nilfs2/btree.c b/fs/nilfs2/btree.c index aa412724b64e..e25b507a474f 100644 --- a/fs/nilfs2/btree.c +++ b/fs/nilfs2/btree.c | |||
@@ -71,21 +71,17 @@ void nilfs_btree_path_cache_destroy(void) | |||
71 | kmem_cache_destroy(nilfs_btree_path_cache); | 71 | kmem_cache_destroy(nilfs_btree_path_cache); |
72 | } | 72 | } |
73 | 73 | ||
74 | static inline struct nilfs_btree_path * | 74 | static inline struct nilfs_btree_path *nilfs_btree_alloc_path(void) |
75 | nilfs_btree_alloc_path(const struct nilfs_btree *btree) | ||
76 | { | 75 | { |
77 | return (struct nilfs_btree_path *) | 76 | return kmem_cache_alloc(nilfs_btree_path_cache, GFP_NOFS); |
78 | kmem_cache_alloc(nilfs_btree_path_cache, GFP_NOFS); | ||
79 | } | 77 | } |
80 | 78 | ||
81 | static inline void nilfs_btree_free_path(const struct nilfs_btree *btree, | 79 | static inline void nilfs_btree_free_path(struct nilfs_btree_path *path) |
82 | struct nilfs_btree_path *path) | ||
83 | { | 80 | { |
84 | kmem_cache_free(nilfs_btree_path_cache, path); | 81 | kmem_cache_free(nilfs_btree_path_cache, path); |
85 | } | 82 | } |
86 | 83 | ||
87 | static void nilfs_btree_init_path(const struct nilfs_btree *btree, | 84 | static void nilfs_btree_init_path(struct nilfs_btree_path *path) |
88 | struct nilfs_btree_path *path) | ||
89 | { | 85 | { |
90 | int level; | 86 | int level; |
91 | 87 | ||
@@ -101,26 +97,13 @@ static void nilfs_btree_init_path(const struct nilfs_btree *btree, | |||
101 | } | 97 | } |
102 | } | 98 | } |
103 | 99 | ||
104 | static void nilfs_btree_clear_path(const struct nilfs_btree *btree, | 100 | static void nilfs_btree_release_path(struct nilfs_btree_path *path) |
105 | struct nilfs_btree_path *path) | ||
106 | { | 101 | { |
107 | int level; | 102 | int level; |
108 | 103 | ||
109 | for (level = NILFS_BTREE_LEVEL_DATA; | 104 | for (level = NILFS_BTREE_LEVEL_DATA; level < NILFS_BTREE_LEVEL_MAX; |
110 | level < NILFS_BTREE_LEVEL_MAX; | 105 | level++) |
111 | level++) { | 106 | brelse(path[level].bp_bh); |
112 | if (path[level].bp_bh != NULL) { | ||
113 | brelse(path[level].bp_bh); | ||
114 | path[level].bp_bh = NULL; | ||
115 | } | ||
116 | /* sib_bh is released or deleted by prepare or commit | ||
117 | * operations. */ | ||
118 | path[level].bp_sib_bh = NULL; | ||
119 | path[level].bp_index = 0; | ||
120 | path[level].bp_oldreq.bpr_ptr = NILFS_BMAP_INVALID_PTR; | ||
121 | path[level].bp_newreq.bpr_ptr = NILFS_BMAP_INVALID_PTR; | ||
122 | path[level].bp_op = NULL; | ||
123 | } | ||
124 | } | 107 | } |
125 | 108 | ||
126 | /* | 109 | /* |
@@ -148,129 +131,110 @@ static int nilfs_btree_get_new_block(const struct nilfs_btree *btree, | |||
148 | } | 131 | } |
149 | 132 | ||
150 | static inline int | 133 | static inline int |
151 | nilfs_btree_node_get_flags(const struct nilfs_btree *btree, | 134 | nilfs_btree_node_get_flags(const struct nilfs_btree_node *node) |
152 | const struct nilfs_btree_node *node) | ||
153 | { | 135 | { |
154 | return node->bn_flags; | 136 | return node->bn_flags; |
155 | } | 137 | } |
156 | 138 | ||
157 | static inline void | 139 | static inline void |
158 | nilfs_btree_node_set_flags(struct nilfs_btree *btree, | 140 | nilfs_btree_node_set_flags(struct nilfs_btree_node *node, int flags) |
159 | struct nilfs_btree_node *node, | ||
160 | int flags) | ||
161 | { | 141 | { |
162 | node->bn_flags = flags; | 142 | node->bn_flags = flags; |
163 | } | 143 | } |
164 | 144 | ||
165 | static inline int nilfs_btree_node_root(const struct nilfs_btree *btree, | 145 | static inline int nilfs_btree_node_root(const struct nilfs_btree_node *node) |
166 | const struct nilfs_btree_node *node) | ||
167 | { | 146 | { |
168 | return nilfs_btree_node_get_flags(btree, node) & NILFS_BTREE_NODE_ROOT; | 147 | return nilfs_btree_node_get_flags(node) & NILFS_BTREE_NODE_ROOT; |
169 | } | 148 | } |
170 | 149 | ||
171 | static inline int | 150 | static inline int |
172 | nilfs_btree_node_get_level(const struct nilfs_btree *btree, | 151 | nilfs_btree_node_get_level(const struct nilfs_btree_node *node) |
173 | const struct nilfs_btree_node *node) | ||
174 | { | 152 | { |
175 | return node->bn_level; | 153 | return node->bn_level; |
176 | } | 154 | } |
177 | 155 | ||
178 | static inline void | 156 | static inline void |
179 | nilfs_btree_node_set_level(struct nilfs_btree *btree, | 157 | nilfs_btree_node_set_level(struct nilfs_btree_node *node, int level) |
180 | struct nilfs_btree_node *node, | ||
181 | int level) | ||
182 | { | 158 | { |
183 | node->bn_level = level; | 159 | node->bn_level = level; |
184 | } | 160 | } |
185 | 161 | ||
186 | static inline int | 162 | static inline int |
187 | nilfs_btree_node_get_nchildren(const struct nilfs_btree *btree, | 163 | nilfs_btree_node_get_nchildren(const struct nilfs_btree_node *node) |
188 | const struct nilfs_btree_node *node) | ||
189 | { | 164 | { |
190 | return le16_to_cpu(node->bn_nchildren); | 165 | return le16_to_cpu(node->bn_nchildren); |
191 | } | 166 | } |
192 | 167 | ||
193 | static inline void | 168 | static inline void |
194 | nilfs_btree_node_set_nchildren(struct nilfs_btree *btree, | 169 | nilfs_btree_node_set_nchildren(struct nilfs_btree_node *node, int nchildren) |
195 | struct nilfs_btree_node *node, | ||
196 | int nchildren) | ||
197 | { | 170 | { |
198 | node->bn_nchildren = cpu_to_le16(nchildren); | 171 | node->bn_nchildren = cpu_to_le16(nchildren); |
199 | } | 172 | } |
200 | 173 | ||
201 | static inline int | 174 | static inline int nilfs_btree_node_size(const struct nilfs_btree *btree) |
202 | nilfs_btree_node_size(const struct nilfs_btree *btree) | ||
203 | { | 175 | { |
204 | return 1 << btree->bt_bmap.b_inode->i_blkbits; | 176 | return 1 << btree->bt_bmap.b_inode->i_blkbits; |
205 | } | 177 | } |
206 | 178 | ||
207 | static inline int | 179 | static inline int |
208 | nilfs_btree_node_nchildren_min(const struct nilfs_btree *btree, | 180 | nilfs_btree_node_nchildren_min(const struct nilfs_btree_node *node, |
209 | const struct nilfs_btree_node *node) | 181 | const struct nilfs_btree *btree) |
210 | { | 182 | { |
211 | return nilfs_btree_node_root(btree, node) ? | 183 | return nilfs_btree_node_root(node) ? |
212 | NILFS_BTREE_ROOT_NCHILDREN_MIN : | 184 | NILFS_BTREE_ROOT_NCHILDREN_MIN : |
213 | NILFS_BTREE_NODE_NCHILDREN_MIN(nilfs_btree_node_size(btree)); | 185 | NILFS_BTREE_NODE_NCHILDREN_MIN(nilfs_btree_node_size(btree)); |
214 | } | 186 | } |
215 | 187 | ||
216 | static inline int | 188 | static inline int |
217 | nilfs_btree_node_nchildren_max(const struct nilfs_btree *btree, | 189 | nilfs_btree_node_nchildren_max(const struct nilfs_btree_node *node, |
218 | const struct nilfs_btree_node *node) | 190 | const struct nilfs_btree *btree) |
219 | { | 191 | { |
220 | return nilfs_btree_node_root(btree, node) ? | 192 | return nilfs_btree_node_root(node) ? |
221 | NILFS_BTREE_ROOT_NCHILDREN_MAX : | 193 | NILFS_BTREE_ROOT_NCHILDREN_MAX : |
222 | NILFS_BTREE_NODE_NCHILDREN_MAX(nilfs_btree_node_size(btree)); | 194 | NILFS_BTREE_NODE_NCHILDREN_MAX(nilfs_btree_node_size(btree)); |
223 | } | 195 | } |
224 | 196 | ||
225 | static inline __le64 * | 197 | static inline __le64 * |
226 | nilfs_btree_node_dkeys(const struct nilfs_btree *btree, | 198 | nilfs_btree_node_dkeys(const struct nilfs_btree_node *node) |
227 | const struct nilfs_btree_node *node) | ||
228 | { | 199 | { |
229 | return (__le64 *)((char *)(node + 1) + | 200 | return (__le64 *)((char *)(node + 1) + |
230 | (nilfs_btree_node_root(btree, node) ? | 201 | (nilfs_btree_node_root(node) ? |
231 | 0 : NILFS_BTREE_NODE_EXTRA_PAD_SIZE)); | 202 | 0 : NILFS_BTREE_NODE_EXTRA_PAD_SIZE)); |
232 | } | 203 | } |
233 | 204 | ||
234 | static inline __le64 * | 205 | static inline __le64 * |
235 | nilfs_btree_node_dptrs(const struct nilfs_btree *btree, | 206 | nilfs_btree_node_dptrs(const struct nilfs_btree_node *node, |
236 | const struct nilfs_btree_node *node) | 207 | const struct nilfs_btree *btree) |
237 | { | 208 | { |
238 | return (__le64 *)(nilfs_btree_node_dkeys(btree, node) + | 209 | return (__le64 *)(nilfs_btree_node_dkeys(node) + |
239 | nilfs_btree_node_nchildren_max(btree, node)); | 210 | nilfs_btree_node_nchildren_max(node, btree)); |
240 | } | 211 | } |
241 | 212 | ||
242 | static inline __u64 | 213 | static inline __u64 |
243 | nilfs_btree_node_get_key(const struct nilfs_btree *btree, | 214 | nilfs_btree_node_get_key(const struct nilfs_btree_node *node, int index) |
244 | const struct nilfs_btree_node *node, int index) | ||
245 | { | 215 | { |
246 | return nilfs_bmap_dkey_to_key(*(nilfs_btree_node_dkeys(btree, node) + | 216 | return nilfs_bmap_dkey_to_key(*(nilfs_btree_node_dkeys(node) + index)); |
247 | index)); | ||
248 | } | 217 | } |
249 | 218 | ||
250 | static inline void | 219 | static inline void |
251 | nilfs_btree_node_set_key(struct nilfs_btree *btree, | 220 | nilfs_btree_node_set_key(struct nilfs_btree_node *node, int index, __u64 key) |
252 | struct nilfs_btree_node *node, int index, __u64 key) | ||
253 | { | 221 | { |
254 | *(nilfs_btree_node_dkeys(btree, node) + index) = | 222 | *(nilfs_btree_node_dkeys(node) + index) = nilfs_bmap_key_to_dkey(key); |
255 | nilfs_bmap_key_to_dkey(key); | ||
256 | } | 223 | } |
257 | 224 | ||
258 | static inline __u64 | 225 | static inline __u64 |
259 | nilfs_btree_node_get_ptr(const struct nilfs_btree *btree, | 226 | nilfs_btree_node_get_ptr(const struct nilfs_btree *btree, |
260 | const struct nilfs_btree_node *node, | 227 | const struct nilfs_btree_node *node, int index) |
261 | int index) | ||
262 | { | 228 | { |
263 | return nilfs_bmap_dptr_to_ptr(*(nilfs_btree_node_dptrs(btree, node) + | 229 | return nilfs_bmap_dptr_to_ptr(*(nilfs_btree_node_dptrs(node, btree) + |
264 | index)); | 230 | index)); |
265 | } | 231 | } |
266 | 232 | ||
267 | static inline void | 233 | static inline void |
268 | nilfs_btree_node_set_ptr(struct nilfs_btree *btree, | 234 | nilfs_btree_node_set_ptr(struct nilfs_btree *btree, |
269 | struct nilfs_btree_node *node, | 235 | struct nilfs_btree_node *node, int index, __u64 ptr) |
270 | int index, | ||
271 | __u64 ptr) | ||
272 | { | 236 | { |
273 | *(nilfs_btree_node_dptrs(btree, node) + index) = | 237 | *(nilfs_btree_node_dptrs(node, btree) + index) = |
274 | nilfs_bmap_ptr_to_dptr(ptr); | 238 | nilfs_bmap_ptr_to_dptr(ptr); |
275 | } | 239 | } |
276 | 240 | ||
@@ -283,12 +247,12 @@ static void nilfs_btree_node_init(struct nilfs_btree *btree, | |||
283 | __le64 *dptrs; | 247 | __le64 *dptrs; |
284 | int i; | 248 | int i; |
285 | 249 | ||
286 | nilfs_btree_node_set_flags(btree, node, flags); | 250 | nilfs_btree_node_set_flags(node, flags); |
287 | nilfs_btree_node_set_level(btree, node, level); | 251 | nilfs_btree_node_set_level(node, level); |
288 | nilfs_btree_node_set_nchildren(btree, node, nchildren); | 252 | nilfs_btree_node_set_nchildren(node, nchildren); |
289 | 253 | ||
290 | dkeys = nilfs_btree_node_dkeys(btree, node); | 254 | dkeys = nilfs_btree_node_dkeys(node); |
291 | dptrs = nilfs_btree_node_dptrs(btree, node); | 255 | dptrs = nilfs_btree_node_dptrs(node, btree); |
292 | for (i = 0; i < nchildren; i++) { | 256 | for (i = 0; i < nchildren; i++) { |
293 | dkeys[i] = nilfs_bmap_key_to_dkey(keys[i]); | 257 | dkeys[i] = nilfs_bmap_key_to_dkey(keys[i]); |
294 | dptrs[i] = nilfs_bmap_ptr_to_dptr(ptrs[i]); | 258 | dptrs[i] = nilfs_bmap_ptr_to_dptr(ptrs[i]); |
@@ -305,13 +269,13 @@ static void nilfs_btree_node_move_left(struct nilfs_btree *btree, | |||
305 | __le64 *ldptrs, *rdptrs; | 269 | __le64 *ldptrs, *rdptrs; |
306 | int lnchildren, rnchildren; | 270 | int lnchildren, rnchildren; |
307 | 271 | ||
308 | ldkeys = nilfs_btree_node_dkeys(btree, left); | 272 | ldkeys = nilfs_btree_node_dkeys(left); |
309 | ldptrs = nilfs_btree_node_dptrs(btree, left); | 273 | ldptrs = nilfs_btree_node_dptrs(left, btree); |
310 | lnchildren = nilfs_btree_node_get_nchildren(btree, left); | 274 | lnchildren = nilfs_btree_node_get_nchildren(left); |
311 | 275 | ||
312 | rdkeys = nilfs_btree_node_dkeys(btree, right); | 276 | rdkeys = nilfs_btree_node_dkeys(right); |
313 | rdptrs = nilfs_btree_node_dptrs(btree, right); | 277 | rdptrs = nilfs_btree_node_dptrs(right, btree); |
314 | rnchildren = nilfs_btree_node_get_nchildren(btree, right); | 278 | rnchildren = nilfs_btree_node_get_nchildren(right); |
315 | 279 | ||
316 | memcpy(ldkeys + lnchildren, rdkeys, n * sizeof(*rdkeys)); | 280 | memcpy(ldkeys + lnchildren, rdkeys, n * sizeof(*rdkeys)); |
317 | memcpy(ldptrs + lnchildren, rdptrs, n * sizeof(*rdptrs)); | 281 | memcpy(ldptrs + lnchildren, rdptrs, n * sizeof(*rdptrs)); |
@@ -320,8 +284,8 @@ static void nilfs_btree_node_move_left(struct nilfs_btree *btree, | |||
320 | 284 | ||
321 | lnchildren += n; | 285 | lnchildren += n; |
322 | rnchildren -= n; | 286 | rnchildren -= n; |
323 | nilfs_btree_node_set_nchildren(btree, left, lnchildren); | 287 | nilfs_btree_node_set_nchildren(left, lnchildren); |
324 | nilfs_btree_node_set_nchildren(btree, right, rnchildren); | 288 | nilfs_btree_node_set_nchildren(right, rnchildren); |
325 | } | 289 | } |
326 | 290 | ||
327 | /* Assume that the buffer heads corresponding to left and right are locked. */ | 291 | /* Assume that the buffer heads corresponding to left and right are locked. */ |
@@ -334,13 +298,13 @@ static void nilfs_btree_node_move_right(struct nilfs_btree *btree, | |||
334 | __le64 *ldptrs, *rdptrs; | 298 | __le64 *ldptrs, *rdptrs; |
335 | int lnchildren, rnchildren; | 299 | int lnchildren, rnchildren; |
336 | 300 | ||
337 | ldkeys = nilfs_btree_node_dkeys(btree, left); | 301 | ldkeys = nilfs_btree_node_dkeys(left); |
338 | ldptrs = nilfs_btree_node_dptrs(btree, left); | 302 | ldptrs = nilfs_btree_node_dptrs(left, btree); |
339 | lnchildren = nilfs_btree_node_get_nchildren(btree, left); | 303 | lnchildren = nilfs_btree_node_get_nchildren(left); |
340 | 304 | ||
341 | rdkeys = nilfs_btree_node_dkeys(btree, right); | 305 | rdkeys = nilfs_btree_node_dkeys(right); |
342 | rdptrs = nilfs_btree_node_dptrs(btree, right); | 306 | rdptrs = nilfs_btree_node_dptrs(right, btree); |
343 | rnchildren = nilfs_btree_node_get_nchildren(btree, right); | 307 | rnchildren = nilfs_btree_node_get_nchildren(right); |
344 | 308 | ||
345 | memmove(rdkeys + n, rdkeys, rnchildren * sizeof(*rdkeys)); | 309 | memmove(rdkeys + n, rdkeys, rnchildren * sizeof(*rdkeys)); |
346 | memmove(rdptrs + n, rdptrs, rnchildren * sizeof(*rdptrs)); | 310 | memmove(rdptrs + n, rdptrs, rnchildren * sizeof(*rdptrs)); |
@@ -349,8 +313,8 @@ static void nilfs_btree_node_move_right(struct nilfs_btree *btree, | |||
349 | 313 | ||
350 | lnchildren -= n; | 314 | lnchildren -= n; |
351 | rnchildren += n; | 315 | rnchildren += n; |
352 | nilfs_btree_node_set_nchildren(btree, left, lnchildren); | 316 | nilfs_btree_node_set_nchildren(left, lnchildren); |
353 | nilfs_btree_node_set_nchildren(btree, right, rnchildren); | 317 | nilfs_btree_node_set_nchildren(right, rnchildren); |
354 | } | 318 | } |
355 | 319 | ||
356 | /* Assume that the buffer head corresponding to node is locked. */ | 320 | /* Assume that the buffer head corresponding to node is locked. */ |
@@ -362,9 +326,9 @@ static void nilfs_btree_node_insert(struct nilfs_btree *btree, | |||
362 | __le64 *dptrs; | 326 | __le64 *dptrs; |
363 | int nchildren; | 327 | int nchildren; |
364 | 328 | ||
365 | dkeys = nilfs_btree_node_dkeys(btree, node); | 329 | dkeys = nilfs_btree_node_dkeys(node); |
366 | dptrs = nilfs_btree_node_dptrs(btree, node); | 330 | dptrs = nilfs_btree_node_dptrs(node, btree); |
367 | nchildren = nilfs_btree_node_get_nchildren(btree, node); | 331 | nchildren = nilfs_btree_node_get_nchildren(node); |
368 | if (index < nchildren) { | 332 | if (index < nchildren) { |
369 | memmove(dkeys + index + 1, dkeys + index, | 333 | memmove(dkeys + index + 1, dkeys + index, |
370 | (nchildren - index) * sizeof(*dkeys)); | 334 | (nchildren - index) * sizeof(*dkeys)); |
@@ -374,7 +338,7 @@ static void nilfs_btree_node_insert(struct nilfs_btree *btree, | |||
374 | dkeys[index] = nilfs_bmap_key_to_dkey(key); | 338 | dkeys[index] = nilfs_bmap_key_to_dkey(key); |
375 | dptrs[index] = nilfs_bmap_ptr_to_dptr(ptr); | 339 | dptrs[index] = nilfs_bmap_ptr_to_dptr(ptr); |
376 | nchildren++; | 340 | nchildren++; |
377 | nilfs_btree_node_set_nchildren(btree, node, nchildren); | 341 | nilfs_btree_node_set_nchildren(node, nchildren); |
378 | } | 342 | } |
379 | 343 | ||
380 | /* Assume that the buffer head corresponding to node is locked. */ | 344 | /* Assume that the buffer head corresponding to node is locked. */ |
@@ -388,11 +352,11 @@ static void nilfs_btree_node_delete(struct nilfs_btree *btree, | |||
388 | __le64 *dptrs; | 352 | __le64 *dptrs; |
389 | int nchildren; | 353 | int nchildren; |
390 | 354 | ||
391 | dkeys = nilfs_btree_node_dkeys(btree, node); | 355 | dkeys = nilfs_btree_node_dkeys(node); |
392 | dptrs = nilfs_btree_node_dptrs(btree, node); | 356 | dptrs = nilfs_btree_node_dptrs(node, btree); |
393 | key = nilfs_bmap_dkey_to_key(dkeys[index]); | 357 | key = nilfs_bmap_dkey_to_key(dkeys[index]); |
394 | ptr = nilfs_bmap_dptr_to_ptr(dptrs[index]); | 358 | ptr = nilfs_bmap_dptr_to_ptr(dptrs[index]); |
395 | nchildren = nilfs_btree_node_get_nchildren(btree, node); | 359 | nchildren = nilfs_btree_node_get_nchildren(node); |
396 | if (keyp != NULL) | 360 | if (keyp != NULL) |
397 | *keyp = key; | 361 | *keyp = key; |
398 | if (ptrp != NULL) | 362 | if (ptrp != NULL) |
@@ -405,11 +369,10 @@ static void nilfs_btree_node_delete(struct nilfs_btree *btree, | |||
405 | (nchildren - index - 1) * sizeof(*dptrs)); | 369 | (nchildren - index - 1) * sizeof(*dptrs)); |
406 | } | 370 | } |
407 | nchildren--; | 371 | nchildren--; |
408 | nilfs_btree_node_set_nchildren(btree, node, nchildren); | 372 | nilfs_btree_node_set_nchildren(node, nchildren); |
409 | } | 373 | } |
410 | 374 | ||
411 | static int nilfs_btree_node_lookup(const struct nilfs_btree *btree, | 375 | static int nilfs_btree_node_lookup(const struct nilfs_btree_node *node, |
412 | const struct nilfs_btree_node *node, | ||
413 | __u64 key, int *indexp) | 376 | __u64 key, int *indexp) |
414 | { | 377 | { |
415 | __u64 nkey; | 378 | __u64 nkey; |
@@ -417,12 +380,12 @@ static int nilfs_btree_node_lookup(const struct nilfs_btree *btree, | |||
417 | 380 | ||
418 | /* binary search */ | 381 | /* binary search */ |
419 | low = 0; | 382 | low = 0; |
420 | high = nilfs_btree_node_get_nchildren(btree, node) - 1; | 383 | high = nilfs_btree_node_get_nchildren(node) - 1; |
421 | index = 0; | 384 | index = 0; |
422 | s = 0; | 385 | s = 0; |
423 | while (low <= high) { | 386 | while (low <= high) { |
424 | index = (low + high) / 2; | 387 | index = (low + high) / 2; |
425 | nkey = nilfs_btree_node_get_key(btree, node, index); | 388 | nkey = nilfs_btree_node_get_key(node, index); |
426 | if (nkey == key) { | 389 | if (nkey == key) { |
427 | s = 0; | 390 | s = 0; |
428 | goto out; | 391 | goto out; |
@@ -436,9 +399,8 @@ static int nilfs_btree_node_lookup(const struct nilfs_btree *btree, | |||
436 | } | 399 | } |
437 | 400 | ||
438 | /* adjust index */ | 401 | /* adjust index */ |
439 | if (nilfs_btree_node_get_level(btree, node) > | 402 | if (nilfs_btree_node_get_level(node) > NILFS_BTREE_LEVEL_NODE_MIN) { |
440 | NILFS_BTREE_LEVEL_NODE_MIN) { | 403 | if (s > 0 && index > 0) |
441 | if ((s > 0) && (index > 0)) | ||
442 | index--; | 404 | index--; |
443 | } else if (s < 0) | 405 | } else if (s < 0) |
444 | index++; | 406 | index++; |
@@ -456,25 +418,20 @@ nilfs_btree_get_root(const struct nilfs_btree *btree) | |||
456 | } | 418 | } |
457 | 419 | ||
458 | static inline struct nilfs_btree_node * | 420 | static inline struct nilfs_btree_node * |
459 | nilfs_btree_get_nonroot_node(const struct nilfs_btree *btree, | 421 | nilfs_btree_get_nonroot_node(const struct nilfs_btree_path *path, int level) |
460 | const struct nilfs_btree_path *path, | ||
461 | int level) | ||
462 | { | 422 | { |
463 | return (struct nilfs_btree_node *)path[level].bp_bh->b_data; | 423 | return (struct nilfs_btree_node *)path[level].bp_bh->b_data; |
464 | } | 424 | } |
465 | 425 | ||
466 | static inline struct nilfs_btree_node * | 426 | static inline struct nilfs_btree_node * |
467 | nilfs_btree_get_sib_node(const struct nilfs_btree *btree, | 427 | nilfs_btree_get_sib_node(const struct nilfs_btree_path *path, int level) |
468 | const struct nilfs_btree_path *path, | ||
469 | int level) | ||
470 | { | 428 | { |
471 | return (struct nilfs_btree_node *)path[level].bp_sib_bh->b_data; | 429 | return (struct nilfs_btree_node *)path[level].bp_sib_bh->b_data; |
472 | } | 430 | } |
473 | 431 | ||
474 | static inline int nilfs_btree_height(const struct nilfs_btree *btree) | 432 | static inline int nilfs_btree_height(const struct nilfs_btree *btree) |
475 | { | 433 | { |
476 | return nilfs_btree_node_get_level(btree, nilfs_btree_get_root(btree)) | 434 | return nilfs_btree_node_get_level(nilfs_btree_get_root(btree)) + 1; |
477 | + 1; | ||
478 | } | 435 | } |
479 | 436 | ||
480 | static inline struct nilfs_btree_node * | 437 | static inline struct nilfs_btree_node * |
@@ -484,7 +441,7 @@ nilfs_btree_get_node(const struct nilfs_btree *btree, | |||
484 | { | 441 | { |
485 | return (level == nilfs_btree_height(btree) - 1) ? | 442 | return (level == nilfs_btree_height(btree) - 1) ? |
486 | nilfs_btree_get_root(btree) : | 443 | nilfs_btree_get_root(btree) : |
487 | nilfs_btree_get_nonroot_node(btree, path, level); | 444 | nilfs_btree_get_nonroot_node(path, level); |
488 | } | 445 | } |
489 | 446 | ||
490 | static int nilfs_btree_do_lookup(const struct nilfs_btree *btree, | 447 | static int nilfs_btree_do_lookup(const struct nilfs_btree *btree, |
@@ -496,12 +453,11 @@ static int nilfs_btree_do_lookup(const struct nilfs_btree *btree, | |||
496 | int level, index, found, ret; | 453 | int level, index, found, ret; |
497 | 454 | ||
498 | node = nilfs_btree_get_root(btree); | 455 | node = nilfs_btree_get_root(btree); |
499 | level = nilfs_btree_node_get_level(btree, node); | 456 | level = nilfs_btree_node_get_level(node); |
500 | if ((level < minlevel) || | 457 | if (level < minlevel || nilfs_btree_node_get_nchildren(node) <= 0) |
501 | (nilfs_btree_node_get_nchildren(btree, node) <= 0)) | ||
502 | return -ENOENT; | 458 | return -ENOENT; |
503 | 459 | ||
504 | found = nilfs_btree_node_lookup(btree, node, key, &index); | 460 | found = nilfs_btree_node_lookup(node, key, &index); |
505 | ptr = nilfs_btree_node_get_ptr(btree, node, index); | 461 | ptr = nilfs_btree_node_get_ptr(btree, node, index); |
506 | path[level].bp_bh = NULL; | 462 | path[level].bp_bh = NULL; |
507 | path[level].bp_index = index; | 463 | path[level].bp_index = index; |
@@ -510,14 +466,13 @@ static int nilfs_btree_do_lookup(const struct nilfs_btree *btree, | |||
510 | ret = nilfs_btree_get_block(btree, ptr, &path[level].bp_bh); | 466 | ret = nilfs_btree_get_block(btree, ptr, &path[level].bp_bh); |
511 | if (ret < 0) | 467 | if (ret < 0) |
512 | return ret; | 468 | return ret; |
513 | node = nilfs_btree_get_nonroot_node(btree, path, level); | 469 | node = nilfs_btree_get_nonroot_node(path, level); |
514 | BUG_ON(level != nilfs_btree_node_get_level(btree, node)); | 470 | BUG_ON(level != nilfs_btree_node_get_level(node)); |
515 | if (!found) | 471 | if (!found) |
516 | found = nilfs_btree_node_lookup(btree, node, key, | 472 | found = nilfs_btree_node_lookup(node, key, &index); |
517 | &index); | ||
518 | else | 473 | else |
519 | index = 0; | 474 | index = 0; |
520 | if (index < nilfs_btree_node_nchildren_max(btree, node)) | 475 | if (index < nilfs_btree_node_nchildren_max(node, btree)) |
521 | ptr = nilfs_btree_node_get_ptr(btree, node, index); | 476 | ptr = nilfs_btree_node_get_ptr(btree, node, index); |
522 | else { | 477 | else { |
523 | WARN_ON(found || level != NILFS_BTREE_LEVEL_NODE_MIN); | 478 | WARN_ON(found || level != NILFS_BTREE_LEVEL_NODE_MIN); |
@@ -544,10 +499,10 @@ static int nilfs_btree_do_lookup_last(const struct nilfs_btree *btree, | |||
544 | int index, level, ret; | 499 | int index, level, ret; |
545 | 500 | ||
546 | node = nilfs_btree_get_root(btree); | 501 | node = nilfs_btree_get_root(btree); |
547 | index = nilfs_btree_node_get_nchildren(btree, node) - 1; | 502 | index = nilfs_btree_node_get_nchildren(node) - 1; |
548 | if (index < 0) | 503 | if (index < 0) |
549 | return -ENOENT; | 504 | return -ENOENT; |
550 | level = nilfs_btree_node_get_level(btree, node); | 505 | level = nilfs_btree_node_get_level(node); |
551 | ptr = nilfs_btree_node_get_ptr(btree, node, index); | 506 | ptr = nilfs_btree_node_get_ptr(btree, node, index); |
552 | path[level].bp_bh = NULL; | 507 | path[level].bp_bh = NULL; |
553 | path[level].bp_index = index; | 508 | path[level].bp_index = index; |
@@ -556,15 +511,15 @@ static int nilfs_btree_do_lookup_last(const struct nilfs_btree *btree, | |||
556 | ret = nilfs_btree_get_block(btree, ptr, &path[level].bp_bh); | 511 | ret = nilfs_btree_get_block(btree, ptr, &path[level].bp_bh); |
557 | if (ret < 0) | 512 | if (ret < 0) |
558 | return ret; | 513 | return ret; |
559 | node = nilfs_btree_get_nonroot_node(btree, path, level); | 514 | node = nilfs_btree_get_nonroot_node(path, level); |
560 | BUG_ON(level != nilfs_btree_node_get_level(btree, node)); | 515 | BUG_ON(level != nilfs_btree_node_get_level(node)); |
561 | index = nilfs_btree_node_get_nchildren(btree, node) - 1; | 516 | index = nilfs_btree_node_get_nchildren(node) - 1; |
562 | ptr = nilfs_btree_node_get_ptr(btree, node, index); | 517 | ptr = nilfs_btree_node_get_ptr(btree, node, index); |
563 | path[level].bp_index = index; | 518 | path[level].bp_index = index; |
564 | } | 519 | } |
565 | 520 | ||
566 | if (keyp != NULL) | 521 | if (keyp != NULL) |
567 | *keyp = nilfs_btree_node_get_key(btree, node, index); | 522 | *keyp = nilfs_btree_node_get_key(node, index); |
568 | if (ptrp != NULL) | 523 | if (ptrp != NULL) |
569 | *ptrp = ptr; | 524 | *ptrp = ptr; |
570 | 525 | ||
@@ -580,18 +535,18 @@ static int nilfs_btree_lookup(const struct nilfs_bmap *bmap, | |||
580 | int ret; | 535 | int ret; |
581 | 536 | ||
582 | btree = (struct nilfs_btree *)bmap; | 537 | btree = (struct nilfs_btree *)bmap; |
583 | path = nilfs_btree_alloc_path(btree); | 538 | path = nilfs_btree_alloc_path(); |
584 | if (path == NULL) | 539 | if (path == NULL) |
585 | return -ENOMEM; | 540 | return -ENOMEM; |
586 | nilfs_btree_init_path(btree, path); | 541 | nilfs_btree_init_path(path); |
587 | 542 | ||
588 | ret = nilfs_btree_do_lookup(btree, path, key, &ptr, level); | 543 | ret = nilfs_btree_do_lookup(btree, path, key, &ptr, level); |
589 | 544 | ||
590 | if (ptrp != NULL) | 545 | if (ptrp != NULL) |
591 | *ptrp = ptr; | 546 | *ptrp = ptr; |
592 | 547 | ||
593 | nilfs_btree_clear_path(btree, path); | 548 | nilfs_btree_release_path(path); |
594 | nilfs_btree_free_path(btree, path); | 549 | nilfs_btree_free_path(path); |
595 | 550 | ||
596 | return ret; | 551 | return ret; |
597 | } | 552 | } |
@@ -608,10 +563,10 @@ static int nilfs_btree_lookup_contig(const struct nilfs_bmap *bmap, | |||
608 | int level = NILFS_BTREE_LEVEL_NODE_MIN; | 563 | int level = NILFS_BTREE_LEVEL_NODE_MIN; |
609 | int ret, cnt, index, maxlevel; | 564 | int ret, cnt, index, maxlevel; |
610 | 565 | ||
611 | path = nilfs_btree_alloc_path(btree); | 566 | path = nilfs_btree_alloc_path(); |
612 | if (path == NULL) | 567 | if (path == NULL) |
613 | return -ENOMEM; | 568 | return -ENOMEM; |
614 | nilfs_btree_init_path(btree, path); | 569 | nilfs_btree_init_path(path); |
615 | ret = nilfs_btree_do_lookup(btree, path, key, &ptr, level); | 570 | ret = nilfs_btree_do_lookup(btree, path, key, &ptr, level); |
616 | if (ret < 0) | 571 | if (ret < 0) |
617 | goto out; | 572 | goto out; |
@@ -631,8 +586,8 @@ static int nilfs_btree_lookup_contig(const struct nilfs_bmap *bmap, | |||
631 | node = nilfs_btree_get_node(btree, path, level); | 586 | node = nilfs_btree_get_node(btree, path, level); |
632 | index = path[level].bp_index + 1; | 587 | index = path[level].bp_index + 1; |
633 | for (;;) { | 588 | for (;;) { |
634 | while (index < nilfs_btree_node_get_nchildren(btree, node)) { | 589 | while (index < nilfs_btree_node_get_nchildren(node)) { |
635 | if (nilfs_btree_node_get_key(btree, node, index) != | 590 | if (nilfs_btree_node_get_key(node, index) != |
636 | key + cnt) | 591 | key + cnt) |
637 | goto end; | 592 | goto end; |
638 | ptr2 = nilfs_btree_node_get_ptr(btree, node, index); | 593 | ptr2 = nilfs_btree_node_get_ptr(btree, node, index); |
@@ -653,8 +608,8 @@ static int nilfs_btree_lookup_contig(const struct nilfs_bmap *bmap, | |||
653 | /* look-up right sibling node */ | 608 | /* look-up right sibling node */ |
654 | node = nilfs_btree_get_node(btree, path, level + 1); | 609 | node = nilfs_btree_get_node(btree, path, level + 1); |
655 | index = path[level + 1].bp_index + 1; | 610 | index = path[level + 1].bp_index + 1; |
656 | if (index >= nilfs_btree_node_get_nchildren(btree, node) || | 611 | if (index >= nilfs_btree_node_get_nchildren(node) || |
657 | nilfs_btree_node_get_key(btree, node, index) != key + cnt) | 612 | nilfs_btree_node_get_key(node, index) != key + cnt) |
658 | break; | 613 | break; |
659 | ptr2 = nilfs_btree_node_get_ptr(btree, node, index); | 614 | ptr2 = nilfs_btree_node_get_ptr(btree, node, index); |
660 | path[level + 1].bp_index = index; | 615 | path[level + 1].bp_index = index; |
@@ -664,7 +619,7 @@ static int nilfs_btree_lookup_contig(const struct nilfs_bmap *bmap, | |||
664 | ret = nilfs_btree_get_block(btree, ptr2, &path[level].bp_bh); | 619 | ret = nilfs_btree_get_block(btree, ptr2, &path[level].bp_bh); |
665 | if (ret < 0) | 620 | if (ret < 0) |
666 | goto out; | 621 | goto out; |
667 | node = nilfs_btree_get_nonroot_node(btree, path, level); | 622 | node = nilfs_btree_get_nonroot_node(path, level); |
668 | index = 0; | 623 | index = 0; |
669 | path[level].bp_index = index; | 624 | path[level].bp_index = index; |
670 | } | 625 | } |
@@ -672,8 +627,8 @@ static int nilfs_btree_lookup_contig(const struct nilfs_bmap *bmap, | |||
672 | *ptrp = ptr; | 627 | *ptrp = ptr; |
673 | ret = cnt; | 628 | ret = cnt; |
674 | out: | 629 | out: |
675 | nilfs_btree_clear_path(btree, path); | 630 | nilfs_btree_release_path(path); |
676 | nilfs_btree_free_path(btree, path); | 631 | nilfs_btree_free_path(path); |
677 | return ret; | 632 | return ret; |
678 | } | 633 | } |
679 | 634 | ||
@@ -685,9 +640,7 @@ static void nilfs_btree_promote_key(struct nilfs_btree *btree, | |||
685 | do { | 640 | do { |
686 | lock_buffer(path[level].bp_bh); | 641 | lock_buffer(path[level].bp_bh); |
687 | nilfs_btree_node_set_key( | 642 | nilfs_btree_node_set_key( |
688 | btree, | 643 | nilfs_btree_get_nonroot_node(path, level), |
689 | nilfs_btree_get_nonroot_node( | ||
690 | btree, path, level), | ||
691 | path[level].bp_index, key); | 644 | path[level].bp_index, key); |
692 | if (!buffer_dirty(path[level].bp_bh)) | 645 | if (!buffer_dirty(path[level].bp_bh)) |
693 | nilfs_btnode_mark_dirty(path[level].bp_bh); | 646 | nilfs_btnode_mark_dirty(path[level].bp_bh); |
@@ -698,8 +651,7 @@ static void nilfs_btree_promote_key(struct nilfs_btree *btree, | |||
698 | 651 | ||
699 | /* root */ | 652 | /* root */ |
700 | if (level == nilfs_btree_height(btree) - 1) { | 653 | if (level == nilfs_btree_height(btree) - 1) { |
701 | nilfs_btree_node_set_key(btree, | 654 | nilfs_btree_node_set_key(nilfs_btree_get_root(btree), |
702 | nilfs_btree_get_root(btree), | ||
703 | path[level].bp_index, key); | 655 | path[level].bp_index, key); |
704 | } | 656 | } |
705 | } | 657 | } |
@@ -712,7 +664,7 @@ static void nilfs_btree_do_insert(struct nilfs_btree *btree, | |||
712 | 664 | ||
713 | if (level < nilfs_btree_height(btree) - 1) { | 665 | if (level < nilfs_btree_height(btree) - 1) { |
714 | lock_buffer(path[level].bp_bh); | 666 | lock_buffer(path[level].bp_bh); |
715 | node = nilfs_btree_get_nonroot_node(btree, path, level); | 667 | node = nilfs_btree_get_nonroot_node(path, level); |
716 | nilfs_btree_node_insert(btree, node, *keyp, *ptrp, | 668 | nilfs_btree_node_insert(btree, node, *keyp, *ptrp, |
717 | path[level].bp_index); | 669 | path[level].bp_index); |
718 | if (!buffer_dirty(path[level].bp_bh)) | 670 | if (!buffer_dirty(path[level].bp_bh)) |
@@ -721,8 +673,8 @@ static void nilfs_btree_do_insert(struct nilfs_btree *btree, | |||
721 | 673 | ||
722 | if (path[level].bp_index == 0) | 674 | if (path[level].bp_index == 0) |
723 | nilfs_btree_promote_key(btree, path, level + 1, | 675 | nilfs_btree_promote_key(btree, path, level + 1, |
724 | nilfs_btree_node_get_key( | 676 | nilfs_btree_node_get_key(node, |
725 | btree, node, 0)); | 677 | 0)); |
726 | } else { | 678 | } else { |
727 | node = nilfs_btree_get_root(btree); | 679 | node = nilfs_btree_get_root(btree); |
728 | nilfs_btree_node_insert(btree, node, *keyp, *ptrp, | 680 | nilfs_btree_node_insert(btree, node, *keyp, *ptrp, |
@@ -740,10 +692,10 @@ static void nilfs_btree_carry_left(struct nilfs_btree *btree, | |||
740 | lock_buffer(path[level].bp_bh); | 692 | lock_buffer(path[level].bp_bh); |
741 | lock_buffer(path[level].bp_sib_bh); | 693 | lock_buffer(path[level].bp_sib_bh); |
742 | 694 | ||
743 | node = nilfs_btree_get_nonroot_node(btree, path, level); | 695 | node = nilfs_btree_get_nonroot_node(path, level); |
744 | left = nilfs_btree_get_sib_node(btree, path, level); | 696 | left = nilfs_btree_get_sib_node(path, level); |
745 | nchildren = nilfs_btree_node_get_nchildren(btree, node); | 697 | nchildren = nilfs_btree_node_get_nchildren(node); |
746 | lnchildren = nilfs_btree_node_get_nchildren(btree, left); | 698 | lnchildren = nilfs_btree_node_get_nchildren(left); |
747 | move = 0; | 699 | move = 0; |
748 | 700 | ||
749 | n = (nchildren + lnchildren + 1) / 2 - lnchildren; | 701 | n = (nchildren + lnchildren + 1) / 2 - lnchildren; |
@@ -764,7 +716,7 @@ static void nilfs_btree_carry_left(struct nilfs_btree *btree, | |||
764 | unlock_buffer(path[level].bp_sib_bh); | 716 | unlock_buffer(path[level].bp_sib_bh); |
765 | 717 | ||
766 | nilfs_btree_promote_key(btree, path, level + 1, | 718 | nilfs_btree_promote_key(btree, path, level + 1, |
767 | nilfs_btree_node_get_key(btree, node, 0)); | 719 | nilfs_btree_node_get_key(node, 0)); |
768 | 720 | ||
769 | if (move) { | 721 | if (move) { |
770 | brelse(path[level].bp_bh); | 722 | brelse(path[level].bp_bh); |
@@ -791,10 +743,10 @@ static void nilfs_btree_carry_right(struct nilfs_btree *btree, | |||
791 | lock_buffer(path[level].bp_bh); | 743 | lock_buffer(path[level].bp_bh); |
792 | lock_buffer(path[level].bp_sib_bh); | 744 | lock_buffer(path[level].bp_sib_bh); |
793 | 745 | ||
794 | node = nilfs_btree_get_nonroot_node(btree, path, level); | 746 | node = nilfs_btree_get_nonroot_node(path, level); |
795 | right = nilfs_btree_get_sib_node(btree, path, level); | 747 | right = nilfs_btree_get_sib_node(path, level); |
796 | nchildren = nilfs_btree_node_get_nchildren(btree, node); | 748 | nchildren = nilfs_btree_node_get_nchildren(node); |
797 | rnchildren = nilfs_btree_node_get_nchildren(btree, right); | 749 | rnchildren = nilfs_btree_node_get_nchildren(right); |
798 | move = 0; | 750 | move = 0; |
799 | 751 | ||
800 | n = (nchildren + rnchildren + 1) / 2 - rnchildren; | 752 | n = (nchildren + rnchildren + 1) / 2 - rnchildren; |
@@ -816,15 +768,14 @@ static void nilfs_btree_carry_right(struct nilfs_btree *btree, | |||
816 | 768 | ||
817 | path[level + 1].bp_index++; | 769 | path[level + 1].bp_index++; |
818 | nilfs_btree_promote_key(btree, path, level + 1, | 770 | nilfs_btree_promote_key(btree, path, level + 1, |
819 | nilfs_btree_node_get_key(btree, right, 0)); | 771 | nilfs_btree_node_get_key(right, 0)); |
820 | path[level + 1].bp_index--; | 772 | path[level + 1].bp_index--; |
821 | 773 | ||
822 | if (move) { | 774 | if (move) { |
823 | brelse(path[level].bp_bh); | 775 | brelse(path[level].bp_bh); |
824 | path[level].bp_bh = path[level].bp_sib_bh; | 776 | path[level].bp_bh = path[level].bp_sib_bh; |
825 | path[level].bp_sib_bh = NULL; | 777 | path[level].bp_sib_bh = NULL; |
826 | path[level].bp_index -= | 778 | path[level].bp_index -= nilfs_btree_node_get_nchildren(node); |
827 | nilfs_btree_node_get_nchildren(btree, node); | ||
828 | path[level + 1].bp_index++; | 779 | path[level + 1].bp_index++; |
829 | } else { | 780 | } else { |
830 | brelse(path[level].bp_sib_bh); | 781 | brelse(path[level].bp_sib_bh); |
@@ -846,9 +797,9 @@ static void nilfs_btree_split(struct nilfs_btree *btree, | |||
846 | lock_buffer(path[level].bp_bh); | 797 | lock_buffer(path[level].bp_bh); |
847 | lock_buffer(path[level].bp_sib_bh); | 798 | lock_buffer(path[level].bp_sib_bh); |
848 | 799 | ||
849 | node = nilfs_btree_get_nonroot_node(btree, path, level); | 800 | node = nilfs_btree_get_nonroot_node(path, level); |
850 | right = nilfs_btree_get_sib_node(btree, path, level); | 801 | right = nilfs_btree_get_sib_node(path, level); |
851 | nchildren = nilfs_btree_node_get_nchildren(btree, node); | 802 | nchildren = nilfs_btree_node_get_nchildren(node); |
852 | move = 0; | 803 | move = 0; |
853 | 804 | ||
854 | n = (nchildren + 1) / 2; | 805 | n = (nchildren + 1) / 2; |
@@ -867,16 +818,15 @@ static void nilfs_btree_split(struct nilfs_btree *btree, | |||
867 | unlock_buffer(path[level].bp_bh); | 818 | unlock_buffer(path[level].bp_bh); |
868 | unlock_buffer(path[level].bp_sib_bh); | 819 | unlock_buffer(path[level].bp_sib_bh); |
869 | 820 | ||
870 | newkey = nilfs_btree_node_get_key(btree, right, 0); | 821 | newkey = nilfs_btree_node_get_key(right, 0); |
871 | newptr = path[level].bp_newreq.bpr_ptr; | 822 | newptr = path[level].bp_newreq.bpr_ptr; |
872 | 823 | ||
873 | if (move) { | 824 | if (move) { |
874 | path[level].bp_index -= | 825 | path[level].bp_index -= nilfs_btree_node_get_nchildren(node); |
875 | nilfs_btree_node_get_nchildren(btree, node); | ||
876 | nilfs_btree_node_insert(btree, right, *keyp, *ptrp, | 826 | nilfs_btree_node_insert(btree, right, *keyp, *ptrp, |
877 | path[level].bp_index); | 827 | path[level].bp_index); |
878 | 828 | ||
879 | *keyp = nilfs_btree_node_get_key(btree, right, 0); | 829 | *keyp = nilfs_btree_node_get_key(right, 0); |
880 | *ptrp = path[level].bp_newreq.bpr_ptr; | 830 | *ptrp = path[level].bp_newreq.bpr_ptr; |
881 | 831 | ||
882 | brelse(path[level].bp_bh); | 832 | brelse(path[level].bp_bh); |
@@ -885,7 +835,7 @@ static void nilfs_btree_split(struct nilfs_btree *btree, | |||
885 | } else { | 835 | } else { |
886 | nilfs_btree_do_insert(btree, path, level, keyp, ptrp); | 836 | nilfs_btree_do_insert(btree, path, level, keyp, ptrp); |
887 | 837 | ||
888 | *keyp = nilfs_btree_node_get_key(btree, right, 0); | 838 | *keyp = nilfs_btree_node_get_key(right, 0); |
889 | *ptrp = path[level].bp_newreq.bpr_ptr; | 839 | *ptrp = path[level].bp_newreq.bpr_ptr; |
890 | 840 | ||
891 | brelse(path[level].bp_sib_bh); | 841 | brelse(path[level].bp_sib_bh); |
@@ -905,12 +855,12 @@ static void nilfs_btree_grow(struct nilfs_btree *btree, | |||
905 | lock_buffer(path[level].bp_sib_bh); | 855 | lock_buffer(path[level].bp_sib_bh); |
906 | 856 | ||
907 | root = nilfs_btree_get_root(btree); | 857 | root = nilfs_btree_get_root(btree); |
908 | child = nilfs_btree_get_sib_node(btree, path, level); | 858 | child = nilfs_btree_get_sib_node(path, level); |
909 | 859 | ||
910 | n = nilfs_btree_node_get_nchildren(btree, root); | 860 | n = nilfs_btree_node_get_nchildren(root); |
911 | 861 | ||
912 | nilfs_btree_node_move_right(btree, root, child, n); | 862 | nilfs_btree_node_move_right(btree, root, child, n); |
913 | nilfs_btree_node_set_level(btree, root, level + 1); | 863 | nilfs_btree_node_set_level(root, level + 1); |
914 | 864 | ||
915 | if (!buffer_dirty(path[level].bp_sib_bh)) | 865 | if (!buffer_dirty(path[level].bp_sib_bh)) |
916 | nilfs_btnode_mark_dirty(path[level].bp_sib_bh); | 866 | nilfs_btnode_mark_dirty(path[level].bp_sib_bh); |
@@ -922,7 +872,7 @@ static void nilfs_btree_grow(struct nilfs_btree *btree, | |||
922 | 872 | ||
923 | nilfs_btree_do_insert(btree, path, level, keyp, ptrp); | 873 | nilfs_btree_do_insert(btree, path, level, keyp, ptrp); |
924 | 874 | ||
925 | *keyp = nilfs_btree_node_get_key(btree, child, 0); | 875 | *keyp = nilfs_btree_node_get_key(child, 0); |
926 | *ptrp = path[level].bp_newreq.bpr_ptr; | 876 | *ptrp = path[level].bp_newreq.bpr_ptr; |
927 | } | 877 | } |
928 | 878 | ||
@@ -990,26 +940,29 @@ static int nilfs_btree_prepare_insert(struct nilfs_btree *btree, | |||
990 | struct nilfs_btree_node *node, *parent, *sib; | 940 | struct nilfs_btree_node *node, *parent, *sib; |
991 | __u64 sibptr; | 941 | __u64 sibptr; |
992 | int pindex, level, ret; | 942 | int pindex, level, ret; |
943 | struct inode *dat = NULL; | ||
993 | 944 | ||
994 | stats->bs_nblocks = 0; | 945 | stats->bs_nblocks = 0; |
995 | level = NILFS_BTREE_LEVEL_DATA; | 946 | level = NILFS_BTREE_LEVEL_DATA; |
996 | 947 | ||
997 | /* allocate a new ptr for data block */ | 948 | /* allocate a new ptr for data block */ |
998 | if (NILFS_BMAP_USE_VBN(&btree->bt_bmap)) | 949 | if (NILFS_BMAP_USE_VBN(&btree->bt_bmap)) { |
999 | path[level].bp_newreq.bpr_ptr = | 950 | path[level].bp_newreq.bpr_ptr = |
1000 | nilfs_btree_find_target_v(btree, path, key); | 951 | nilfs_btree_find_target_v(btree, path, key); |
952 | dat = nilfs_bmap_get_dat(&btree->bt_bmap); | ||
953 | } | ||
1001 | 954 | ||
1002 | ret = nilfs_bmap_prepare_alloc_ptr(&btree->bt_bmap, | 955 | ret = nilfs_bmap_prepare_alloc_ptr(&btree->bt_bmap, |
1003 | &path[level].bp_newreq); | 956 | &path[level].bp_newreq, dat); |
1004 | if (ret < 0) | 957 | if (ret < 0) |
1005 | goto err_out_data; | 958 | goto err_out_data; |
1006 | 959 | ||
1007 | for (level = NILFS_BTREE_LEVEL_NODE_MIN; | 960 | for (level = NILFS_BTREE_LEVEL_NODE_MIN; |
1008 | level < nilfs_btree_height(btree) - 1; | 961 | level < nilfs_btree_height(btree) - 1; |
1009 | level++) { | 962 | level++) { |
1010 | node = nilfs_btree_get_nonroot_node(btree, path, level); | 963 | node = nilfs_btree_get_nonroot_node(path, level); |
1011 | if (nilfs_btree_node_get_nchildren(btree, node) < | 964 | if (nilfs_btree_node_get_nchildren(node) < |
1012 | nilfs_btree_node_nchildren_max(btree, node)) { | 965 | nilfs_btree_node_nchildren_max(node, btree)) { |
1013 | path[level].bp_op = nilfs_btree_do_insert; | 966 | path[level].bp_op = nilfs_btree_do_insert; |
1014 | stats->bs_nblocks++; | 967 | stats->bs_nblocks++; |
1015 | goto out; | 968 | goto out; |
@@ -1026,8 +979,8 @@ static int nilfs_btree_prepare_insert(struct nilfs_btree *btree, | |||
1026 | if (ret < 0) | 979 | if (ret < 0) |
1027 | goto err_out_child_node; | 980 | goto err_out_child_node; |
1028 | sib = (struct nilfs_btree_node *)bh->b_data; | 981 | sib = (struct nilfs_btree_node *)bh->b_data; |
1029 | if (nilfs_btree_node_get_nchildren(btree, sib) < | 982 | if (nilfs_btree_node_get_nchildren(sib) < |
1030 | nilfs_btree_node_nchildren_max(btree, sib)) { | 983 | nilfs_btree_node_nchildren_max(sib, btree)) { |
1031 | path[level].bp_sib_bh = bh; | 984 | path[level].bp_sib_bh = bh; |
1032 | path[level].bp_op = nilfs_btree_carry_left; | 985 | path[level].bp_op = nilfs_btree_carry_left; |
1033 | stats->bs_nblocks++; | 986 | stats->bs_nblocks++; |
@@ -1038,15 +991,15 @@ static int nilfs_btree_prepare_insert(struct nilfs_btree *btree, | |||
1038 | 991 | ||
1039 | /* right sibling */ | 992 | /* right sibling */ |
1040 | if (pindex < | 993 | if (pindex < |
1041 | nilfs_btree_node_get_nchildren(btree, parent) - 1) { | 994 | nilfs_btree_node_get_nchildren(parent) - 1) { |
1042 | sibptr = nilfs_btree_node_get_ptr(btree, parent, | 995 | sibptr = nilfs_btree_node_get_ptr(btree, parent, |
1043 | pindex + 1); | 996 | pindex + 1); |
1044 | ret = nilfs_btree_get_block(btree, sibptr, &bh); | 997 | ret = nilfs_btree_get_block(btree, sibptr, &bh); |
1045 | if (ret < 0) | 998 | if (ret < 0) |
1046 | goto err_out_child_node; | 999 | goto err_out_child_node; |
1047 | sib = (struct nilfs_btree_node *)bh->b_data; | 1000 | sib = (struct nilfs_btree_node *)bh->b_data; |
1048 | if (nilfs_btree_node_get_nchildren(btree, sib) < | 1001 | if (nilfs_btree_node_get_nchildren(sib) < |
1049 | nilfs_btree_node_nchildren_max(btree, sib)) { | 1002 | nilfs_btree_node_nchildren_max(sib, btree)) { |
1050 | path[level].bp_sib_bh = bh; | 1003 | path[level].bp_sib_bh = bh; |
1051 | path[level].bp_op = nilfs_btree_carry_right; | 1004 | path[level].bp_op = nilfs_btree_carry_right; |
1052 | stats->bs_nblocks++; | 1005 | stats->bs_nblocks++; |
@@ -1059,7 +1012,7 @@ static int nilfs_btree_prepare_insert(struct nilfs_btree *btree, | |||
1059 | path[level].bp_newreq.bpr_ptr = | 1012 | path[level].bp_newreq.bpr_ptr = |
1060 | path[level - 1].bp_newreq.bpr_ptr + 1; | 1013 | path[level - 1].bp_newreq.bpr_ptr + 1; |
1061 | ret = nilfs_bmap_prepare_alloc_ptr(&btree->bt_bmap, | 1014 | ret = nilfs_bmap_prepare_alloc_ptr(&btree->bt_bmap, |
1062 | &path[level].bp_newreq); | 1015 | &path[level].bp_newreq, dat); |
1063 | if (ret < 0) | 1016 | if (ret < 0) |
1064 | goto err_out_child_node; | 1017 | goto err_out_child_node; |
1065 | ret = nilfs_btree_get_new_block(btree, | 1018 | ret = nilfs_btree_get_new_block(btree, |
@@ -1081,8 +1034,8 @@ static int nilfs_btree_prepare_insert(struct nilfs_btree *btree, | |||
1081 | 1034 | ||
1082 | /* root */ | 1035 | /* root */ |
1083 | node = nilfs_btree_get_root(btree); | 1036 | node = nilfs_btree_get_root(btree); |
1084 | if (nilfs_btree_node_get_nchildren(btree, node) < | 1037 | if (nilfs_btree_node_get_nchildren(node) < |
1085 | nilfs_btree_node_nchildren_max(btree, node)) { | 1038 | nilfs_btree_node_nchildren_max(node, btree)) { |
1086 | path[level].bp_op = nilfs_btree_do_insert; | 1039 | path[level].bp_op = nilfs_btree_do_insert; |
1087 | stats->bs_nblocks++; | 1040 | stats->bs_nblocks++; |
1088 | goto out; | 1041 | goto out; |
@@ -1091,7 +1044,7 @@ static int nilfs_btree_prepare_insert(struct nilfs_btree *btree, | |||
1091 | /* grow */ | 1044 | /* grow */ |
1092 | path[level].bp_newreq.bpr_ptr = path[level - 1].bp_newreq.bpr_ptr + 1; | 1045 | path[level].bp_newreq.bpr_ptr = path[level - 1].bp_newreq.bpr_ptr + 1; |
1093 | ret = nilfs_bmap_prepare_alloc_ptr(&btree->bt_bmap, | 1046 | ret = nilfs_bmap_prepare_alloc_ptr(&btree->bt_bmap, |
1094 | &path[level].bp_newreq); | 1047 | &path[level].bp_newreq, dat); |
1095 | if (ret < 0) | 1048 | if (ret < 0) |
1096 | goto err_out_child_node; | 1049 | goto err_out_child_node; |
1097 | ret = nilfs_btree_get_new_block(btree, path[level].bp_newreq.bpr_ptr, | 1050 | ret = nilfs_btree_get_new_block(btree, path[level].bp_newreq.bpr_ptr, |
@@ -1119,16 +1072,18 @@ static int nilfs_btree_prepare_insert(struct nilfs_btree *btree, | |||
1119 | 1072 | ||
1120 | /* error */ | 1073 | /* error */ |
1121 | err_out_curr_node: | 1074 | err_out_curr_node: |
1122 | nilfs_bmap_abort_alloc_ptr(&btree->bt_bmap, &path[level].bp_newreq); | 1075 | nilfs_bmap_abort_alloc_ptr(&btree->bt_bmap, &path[level].bp_newreq, |
1076 | dat); | ||
1123 | err_out_child_node: | 1077 | err_out_child_node: |
1124 | for (level--; level > NILFS_BTREE_LEVEL_DATA; level--) { | 1078 | for (level--; level > NILFS_BTREE_LEVEL_DATA; level--) { |
1125 | nilfs_btnode_delete(path[level].bp_sib_bh); | 1079 | nilfs_btnode_delete(path[level].bp_sib_bh); |
1126 | nilfs_bmap_abort_alloc_ptr(&btree->bt_bmap, | 1080 | nilfs_bmap_abort_alloc_ptr(&btree->bt_bmap, |
1127 | &path[level].bp_newreq); | 1081 | &path[level].bp_newreq, dat); |
1128 | 1082 | ||
1129 | } | 1083 | } |
1130 | 1084 | ||
1131 | nilfs_bmap_abort_alloc_ptr(&btree->bt_bmap, &path[level].bp_newreq); | 1085 | nilfs_bmap_abort_alloc_ptr(&btree->bt_bmap, &path[level].bp_newreq, |
1086 | dat); | ||
1132 | err_out_data: | 1087 | err_out_data: |
1133 | *levelp = level; | 1088 | *levelp = level; |
1134 | stats->bs_nblocks = 0; | 1089 | stats->bs_nblocks = 0; |
@@ -1139,16 +1094,19 @@ static void nilfs_btree_commit_insert(struct nilfs_btree *btree, | |||
1139 | struct nilfs_btree_path *path, | 1094 | struct nilfs_btree_path *path, |
1140 | int maxlevel, __u64 key, __u64 ptr) | 1095 | int maxlevel, __u64 key, __u64 ptr) |
1141 | { | 1096 | { |
1097 | struct inode *dat = NULL; | ||
1142 | int level; | 1098 | int level; |
1143 | 1099 | ||
1144 | set_buffer_nilfs_volatile((struct buffer_head *)((unsigned long)ptr)); | 1100 | set_buffer_nilfs_volatile((struct buffer_head *)((unsigned long)ptr)); |
1145 | ptr = path[NILFS_BTREE_LEVEL_DATA].bp_newreq.bpr_ptr; | 1101 | ptr = path[NILFS_BTREE_LEVEL_DATA].bp_newreq.bpr_ptr; |
1146 | if (NILFS_BMAP_USE_VBN(&btree->bt_bmap)) | 1102 | if (NILFS_BMAP_USE_VBN(&btree->bt_bmap)) { |
1147 | nilfs_btree_set_target_v(btree, key, ptr); | 1103 | nilfs_btree_set_target_v(btree, key, ptr); |
1104 | dat = nilfs_bmap_get_dat(&btree->bt_bmap); | ||
1105 | } | ||
1148 | 1106 | ||
1149 | for (level = NILFS_BTREE_LEVEL_NODE_MIN; level <= maxlevel; level++) { | 1107 | for (level = NILFS_BTREE_LEVEL_NODE_MIN; level <= maxlevel; level++) { |
1150 | nilfs_bmap_commit_alloc_ptr(&btree->bt_bmap, | 1108 | nilfs_bmap_commit_alloc_ptr(&btree->bt_bmap, |
1151 | &path[level - 1].bp_newreq); | 1109 | &path[level - 1].bp_newreq, dat); |
1152 | path[level].bp_op(btree, path, level, &key, &ptr); | 1110 | path[level].bp_op(btree, path, level, &key, &ptr); |
1153 | } | 1111 | } |
1154 | 1112 | ||
@@ -1164,10 +1122,10 @@ static int nilfs_btree_insert(struct nilfs_bmap *bmap, __u64 key, __u64 ptr) | |||
1164 | int level, ret; | 1122 | int level, ret; |
1165 | 1123 | ||
1166 | btree = (struct nilfs_btree *)bmap; | 1124 | btree = (struct nilfs_btree *)bmap; |
1167 | path = nilfs_btree_alloc_path(btree); | 1125 | path = nilfs_btree_alloc_path(); |
1168 | if (path == NULL) | 1126 | if (path == NULL) |
1169 | return -ENOMEM; | 1127 | return -ENOMEM; |
1170 | nilfs_btree_init_path(btree, path); | 1128 | nilfs_btree_init_path(path); |
1171 | 1129 | ||
1172 | ret = nilfs_btree_do_lookup(btree, path, key, NULL, | 1130 | ret = nilfs_btree_do_lookup(btree, path, key, NULL, |
1173 | NILFS_BTREE_LEVEL_NODE_MIN); | 1131 | NILFS_BTREE_LEVEL_NODE_MIN); |
@@ -1184,8 +1142,8 @@ static int nilfs_btree_insert(struct nilfs_bmap *bmap, __u64 key, __u64 ptr) | |||
1184 | nilfs_bmap_add_blocks(bmap, stats.bs_nblocks); | 1142 | nilfs_bmap_add_blocks(bmap, stats.bs_nblocks); |
1185 | 1143 | ||
1186 | out: | 1144 | out: |
1187 | nilfs_btree_clear_path(btree, path); | 1145 | nilfs_btree_release_path(path); |
1188 | nilfs_btree_free_path(btree, path); | 1146 | nilfs_btree_free_path(path); |
1189 | return ret; | 1147 | return ret; |
1190 | } | 1148 | } |
1191 | 1149 | ||
@@ -1197,7 +1155,7 @@ static void nilfs_btree_do_delete(struct nilfs_btree *btree, | |||
1197 | 1155 | ||
1198 | if (level < nilfs_btree_height(btree) - 1) { | 1156 | if (level < nilfs_btree_height(btree) - 1) { |
1199 | lock_buffer(path[level].bp_bh); | 1157 | lock_buffer(path[level].bp_bh); |
1200 | node = nilfs_btree_get_nonroot_node(btree, path, level); | 1158 | node = nilfs_btree_get_nonroot_node(path, level); |
1201 | nilfs_btree_node_delete(btree, node, keyp, ptrp, | 1159 | nilfs_btree_node_delete(btree, node, keyp, ptrp, |
1202 | path[level].bp_index); | 1160 | path[level].bp_index); |
1203 | if (!buffer_dirty(path[level].bp_bh)) | 1161 | if (!buffer_dirty(path[level].bp_bh)) |
@@ -1205,7 +1163,7 @@ static void nilfs_btree_do_delete(struct nilfs_btree *btree, | |||
1205 | unlock_buffer(path[level].bp_bh); | 1163 | unlock_buffer(path[level].bp_bh); |
1206 | if (path[level].bp_index == 0) | 1164 | if (path[level].bp_index == 0) |
1207 | nilfs_btree_promote_key(btree, path, level + 1, | 1165 | nilfs_btree_promote_key(btree, path, level + 1, |
1208 | nilfs_btree_node_get_key(btree, node, 0)); | 1166 | nilfs_btree_node_get_key(node, 0)); |
1209 | } else { | 1167 | } else { |
1210 | node = nilfs_btree_get_root(btree); | 1168 | node = nilfs_btree_get_root(btree); |
1211 | nilfs_btree_node_delete(btree, node, keyp, ptrp, | 1169 | nilfs_btree_node_delete(btree, node, keyp, ptrp, |
@@ -1225,10 +1183,10 @@ static void nilfs_btree_borrow_left(struct nilfs_btree *btree, | |||
1225 | lock_buffer(path[level].bp_bh); | 1183 | lock_buffer(path[level].bp_bh); |
1226 | lock_buffer(path[level].bp_sib_bh); | 1184 | lock_buffer(path[level].bp_sib_bh); |
1227 | 1185 | ||
1228 | node = nilfs_btree_get_nonroot_node(btree, path, level); | 1186 | node = nilfs_btree_get_nonroot_node(path, level); |
1229 | left = nilfs_btree_get_sib_node(btree, path, level); | 1187 | left = nilfs_btree_get_sib_node(path, level); |
1230 | nchildren = nilfs_btree_node_get_nchildren(btree, node); | 1188 | nchildren = nilfs_btree_node_get_nchildren(node); |
1231 | lnchildren = nilfs_btree_node_get_nchildren(btree, left); | 1189 | lnchildren = nilfs_btree_node_get_nchildren(left); |
1232 | 1190 | ||
1233 | n = (nchildren + lnchildren) / 2 - nchildren; | 1191 | n = (nchildren + lnchildren) / 2 - nchildren; |
1234 | 1192 | ||
@@ -1243,7 +1201,7 @@ static void nilfs_btree_borrow_left(struct nilfs_btree *btree, | |||
1243 | unlock_buffer(path[level].bp_sib_bh); | 1201 | unlock_buffer(path[level].bp_sib_bh); |
1244 | 1202 | ||
1245 | nilfs_btree_promote_key(btree, path, level + 1, | 1203 | nilfs_btree_promote_key(btree, path, level + 1, |
1246 | nilfs_btree_node_get_key(btree, node, 0)); | 1204 | nilfs_btree_node_get_key(node, 0)); |
1247 | 1205 | ||
1248 | brelse(path[level].bp_sib_bh); | 1206 | brelse(path[level].bp_sib_bh); |
1249 | path[level].bp_sib_bh = NULL; | 1207 | path[level].bp_sib_bh = NULL; |
@@ -1262,10 +1220,10 @@ static void nilfs_btree_borrow_right(struct nilfs_btree *btree, | |||
1262 | lock_buffer(path[level].bp_bh); | 1220 | lock_buffer(path[level].bp_bh); |
1263 | lock_buffer(path[level].bp_sib_bh); | 1221 | lock_buffer(path[level].bp_sib_bh); |
1264 | 1222 | ||
1265 | node = nilfs_btree_get_nonroot_node(btree, path, level); | 1223 | node = nilfs_btree_get_nonroot_node(path, level); |
1266 | right = nilfs_btree_get_sib_node(btree, path, level); | 1224 | right = nilfs_btree_get_sib_node(path, level); |
1267 | nchildren = nilfs_btree_node_get_nchildren(btree, node); | 1225 | nchildren = nilfs_btree_node_get_nchildren(node); |
1268 | rnchildren = nilfs_btree_node_get_nchildren(btree, right); | 1226 | rnchildren = nilfs_btree_node_get_nchildren(right); |
1269 | 1227 | ||
1270 | n = (nchildren + rnchildren) / 2 - nchildren; | 1228 | n = (nchildren + rnchildren) / 2 - nchildren; |
1271 | 1229 | ||
@@ -1281,7 +1239,7 @@ static void nilfs_btree_borrow_right(struct nilfs_btree *btree, | |||
1281 | 1239 | ||
1282 | path[level + 1].bp_index++; | 1240 | path[level + 1].bp_index++; |
1283 | nilfs_btree_promote_key(btree, path, level + 1, | 1241 | nilfs_btree_promote_key(btree, path, level + 1, |
1284 | nilfs_btree_node_get_key(btree, right, 0)); | 1242 | nilfs_btree_node_get_key(right, 0)); |
1285 | path[level + 1].bp_index--; | 1243 | path[level + 1].bp_index--; |
1286 | 1244 | ||
1287 | brelse(path[level].bp_sib_bh); | 1245 | brelse(path[level].bp_sib_bh); |
@@ -1300,10 +1258,10 @@ static void nilfs_btree_concat_left(struct nilfs_btree *btree, | |||
1300 | lock_buffer(path[level].bp_bh); | 1258 | lock_buffer(path[level].bp_bh); |
1301 | lock_buffer(path[level].bp_sib_bh); | 1259 | lock_buffer(path[level].bp_sib_bh); |
1302 | 1260 | ||
1303 | node = nilfs_btree_get_nonroot_node(btree, path, level); | 1261 | node = nilfs_btree_get_nonroot_node(path, level); |
1304 | left = nilfs_btree_get_sib_node(btree, path, level); | 1262 | left = nilfs_btree_get_sib_node(path, level); |
1305 | 1263 | ||
1306 | n = nilfs_btree_node_get_nchildren(btree, node); | 1264 | n = nilfs_btree_node_get_nchildren(node); |
1307 | 1265 | ||
1308 | nilfs_btree_node_move_left(btree, left, node, n); | 1266 | nilfs_btree_node_move_left(btree, left, node, n); |
1309 | 1267 | ||
@@ -1316,7 +1274,7 @@ static void nilfs_btree_concat_left(struct nilfs_btree *btree, | |||
1316 | nilfs_btnode_delete(path[level].bp_bh); | 1274 | nilfs_btnode_delete(path[level].bp_bh); |
1317 | path[level].bp_bh = path[level].bp_sib_bh; | 1275 | path[level].bp_bh = path[level].bp_sib_bh; |
1318 | path[level].bp_sib_bh = NULL; | 1276 | path[level].bp_sib_bh = NULL; |
1319 | path[level].bp_index += nilfs_btree_node_get_nchildren(btree, left); | 1277 | path[level].bp_index += nilfs_btree_node_get_nchildren(left); |
1320 | } | 1278 | } |
1321 | 1279 | ||
1322 | static void nilfs_btree_concat_right(struct nilfs_btree *btree, | 1280 | static void nilfs_btree_concat_right(struct nilfs_btree *btree, |
@@ -1331,10 +1289,10 @@ static void nilfs_btree_concat_right(struct nilfs_btree *btree, | |||
1331 | lock_buffer(path[level].bp_bh); | 1289 | lock_buffer(path[level].bp_bh); |
1332 | lock_buffer(path[level].bp_sib_bh); | 1290 | lock_buffer(path[level].bp_sib_bh); |
1333 | 1291 | ||
1334 | node = nilfs_btree_get_nonroot_node(btree, path, level); | 1292 | node = nilfs_btree_get_nonroot_node(path, level); |
1335 | right = nilfs_btree_get_sib_node(btree, path, level); | 1293 | right = nilfs_btree_get_sib_node(path, level); |
1336 | 1294 | ||
1337 | n = nilfs_btree_node_get_nchildren(btree, right); | 1295 | n = nilfs_btree_node_get_nchildren(right); |
1338 | 1296 | ||
1339 | nilfs_btree_node_move_left(btree, node, right, n); | 1297 | nilfs_btree_node_move_left(btree, node, right, n); |
1340 | 1298 | ||
@@ -1360,11 +1318,11 @@ static void nilfs_btree_shrink(struct nilfs_btree *btree, | |||
1360 | 1318 | ||
1361 | lock_buffer(path[level].bp_bh); | 1319 | lock_buffer(path[level].bp_bh); |
1362 | root = nilfs_btree_get_root(btree); | 1320 | root = nilfs_btree_get_root(btree); |
1363 | child = nilfs_btree_get_nonroot_node(btree, path, level); | 1321 | child = nilfs_btree_get_nonroot_node(path, level); |
1364 | 1322 | ||
1365 | nilfs_btree_node_delete(btree, root, NULL, NULL, 0); | 1323 | nilfs_btree_node_delete(btree, root, NULL, NULL, 0); |
1366 | nilfs_btree_node_set_level(btree, root, level); | 1324 | nilfs_btree_node_set_level(root, level); |
1367 | n = nilfs_btree_node_get_nchildren(btree, child); | 1325 | n = nilfs_btree_node_get_nchildren(child); |
1368 | nilfs_btree_node_move_left(btree, root, child, n); | 1326 | nilfs_btree_node_move_left(btree, root, child, n); |
1369 | unlock_buffer(path[level].bp_bh); | 1327 | unlock_buffer(path[level].bp_bh); |
1370 | 1328 | ||
@@ -1376,7 +1334,8 @@ static void nilfs_btree_shrink(struct nilfs_btree *btree, | |||
1376 | static int nilfs_btree_prepare_delete(struct nilfs_btree *btree, | 1334 | static int nilfs_btree_prepare_delete(struct nilfs_btree *btree, |
1377 | struct nilfs_btree_path *path, | 1335 | struct nilfs_btree_path *path, |
1378 | int *levelp, | 1336 | int *levelp, |
1379 | struct nilfs_bmap_stats *stats) | 1337 | struct nilfs_bmap_stats *stats, |
1338 | struct inode *dat) | ||
1380 | { | 1339 | { |
1381 | struct buffer_head *bh; | 1340 | struct buffer_head *bh; |
1382 | struct nilfs_btree_node *node, *parent, *sib; | 1341 | struct nilfs_btree_node *node, *parent, *sib; |
@@ -1388,17 +1347,17 @@ static int nilfs_btree_prepare_delete(struct nilfs_btree *btree, | |||
1388 | for (level = NILFS_BTREE_LEVEL_NODE_MIN; | 1347 | for (level = NILFS_BTREE_LEVEL_NODE_MIN; |
1389 | level < nilfs_btree_height(btree) - 1; | 1348 | level < nilfs_btree_height(btree) - 1; |
1390 | level++) { | 1349 | level++) { |
1391 | node = nilfs_btree_get_nonroot_node(btree, path, level); | 1350 | node = nilfs_btree_get_nonroot_node(path, level); |
1392 | path[level].bp_oldreq.bpr_ptr = | 1351 | path[level].bp_oldreq.bpr_ptr = |
1393 | nilfs_btree_node_get_ptr(btree, node, | 1352 | nilfs_btree_node_get_ptr(btree, node, |
1394 | path[level].bp_index); | 1353 | path[level].bp_index); |
1395 | ret = nilfs_bmap_prepare_end_ptr(&btree->bt_bmap, | 1354 | ret = nilfs_bmap_prepare_end_ptr(&btree->bt_bmap, |
1396 | &path[level].bp_oldreq); | 1355 | &path[level].bp_oldreq, dat); |
1397 | if (ret < 0) | 1356 | if (ret < 0) |
1398 | goto err_out_child_node; | 1357 | goto err_out_child_node; |
1399 | 1358 | ||
1400 | if (nilfs_btree_node_get_nchildren(btree, node) > | 1359 | if (nilfs_btree_node_get_nchildren(node) > |
1401 | nilfs_btree_node_nchildren_min(btree, node)) { | 1360 | nilfs_btree_node_nchildren_min(node, btree)) { |
1402 | path[level].bp_op = nilfs_btree_do_delete; | 1361 | path[level].bp_op = nilfs_btree_do_delete; |
1403 | stats->bs_nblocks++; | 1362 | stats->bs_nblocks++; |
1404 | goto out; | 1363 | goto out; |
@@ -1415,8 +1374,8 @@ static int nilfs_btree_prepare_delete(struct nilfs_btree *btree, | |||
1415 | if (ret < 0) | 1374 | if (ret < 0) |
1416 | goto err_out_curr_node; | 1375 | goto err_out_curr_node; |
1417 | sib = (struct nilfs_btree_node *)bh->b_data; | 1376 | sib = (struct nilfs_btree_node *)bh->b_data; |
1418 | if (nilfs_btree_node_get_nchildren(btree, sib) > | 1377 | if (nilfs_btree_node_get_nchildren(sib) > |
1419 | nilfs_btree_node_nchildren_min(btree, sib)) { | 1378 | nilfs_btree_node_nchildren_min(sib, btree)) { |
1420 | path[level].bp_sib_bh = bh; | 1379 | path[level].bp_sib_bh = bh; |
1421 | path[level].bp_op = nilfs_btree_borrow_left; | 1380 | path[level].bp_op = nilfs_btree_borrow_left; |
1422 | stats->bs_nblocks++; | 1381 | stats->bs_nblocks++; |
@@ -1428,7 +1387,7 @@ static int nilfs_btree_prepare_delete(struct nilfs_btree *btree, | |||
1428 | /* continue; */ | 1387 | /* continue; */ |
1429 | } | 1388 | } |
1430 | } else if (pindex < | 1389 | } else if (pindex < |
1431 | nilfs_btree_node_get_nchildren(btree, parent) - 1) { | 1390 | nilfs_btree_node_get_nchildren(parent) - 1) { |
1432 | /* right sibling */ | 1391 | /* right sibling */ |
1433 | sibptr = nilfs_btree_node_get_ptr(btree, parent, | 1392 | sibptr = nilfs_btree_node_get_ptr(btree, parent, |
1434 | pindex + 1); | 1393 | pindex + 1); |
@@ -1436,8 +1395,8 @@ static int nilfs_btree_prepare_delete(struct nilfs_btree *btree, | |||
1436 | if (ret < 0) | 1395 | if (ret < 0) |
1437 | goto err_out_curr_node; | 1396 | goto err_out_curr_node; |
1438 | sib = (struct nilfs_btree_node *)bh->b_data; | 1397 | sib = (struct nilfs_btree_node *)bh->b_data; |
1439 | if (nilfs_btree_node_get_nchildren(btree, sib) > | 1398 | if (nilfs_btree_node_get_nchildren(sib) > |
1440 | nilfs_btree_node_nchildren_min(btree, sib)) { | 1399 | nilfs_btree_node_nchildren_min(sib, btree)) { |
1441 | path[level].bp_sib_bh = bh; | 1400 | path[level].bp_sib_bh = bh; |
1442 | path[level].bp_op = nilfs_btree_borrow_right; | 1401 | path[level].bp_op = nilfs_btree_borrow_right; |
1443 | stats->bs_nblocks++; | 1402 | stats->bs_nblocks++; |
@@ -1452,7 +1411,7 @@ static int nilfs_btree_prepare_delete(struct nilfs_btree *btree, | |||
1452 | /* no siblings */ | 1411 | /* no siblings */ |
1453 | /* the only child of the root node */ | 1412 | /* the only child of the root node */ |
1454 | WARN_ON(level != nilfs_btree_height(btree) - 2); | 1413 | WARN_ON(level != nilfs_btree_height(btree) - 2); |
1455 | if (nilfs_btree_node_get_nchildren(btree, node) - 1 <= | 1414 | if (nilfs_btree_node_get_nchildren(node) - 1 <= |
1456 | NILFS_BTREE_ROOT_NCHILDREN_MAX) { | 1415 | NILFS_BTREE_ROOT_NCHILDREN_MAX) { |
1457 | path[level].bp_op = nilfs_btree_shrink; | 1416 | path[level].bp_op = nilfs_btree_shrink; |
1458 | stats->bs_nblocks += 2; | 1417 | stats->bs_nblocks += 2; |
@@ -1471,7 +1430,7 @@ static int nilfs_btree_prepare_delete(struct nilfs_btree *btree, | |||
1471 | nilfs_btree_node_get_ptr(btree, node, path[level].bp_index); | 1430 | nilfs_btree_node_get_ptr(btree, node, path[level].bp_index); |
1472 | 1431 | ||
1473 | ret = nilfs_bmap_prepare_end_ptr(&btree->bt_bmap, | 1432 | ret = nilfs_bmap_prepare_end_ptr(&btree->bt_bmap, |
1474 | &path[level].bp_oldreq); | 1433 | &path[level].bp_oldreq, dat); |
1475 | if (ret < 0) | 1434 | if (ret < 0) |
1476 | goto err_out_child_node; | 1435 | goto err_out_child_node; |
1477 | 1436 | ||
@@ -1486,12 +1445,12 @@ static int nilfs_btree_prepare_delete(struct nilfs_btree *btree, | |||
1486 | 1445 | ||
1487 | /* error */ | 1446 | /* error */ |
1488 | err_out_curr_node: | 1447 | err_out_curr_node: |
1489 | nilfs_bmap_abort_end_ptr(&btree->bt_bmap, &path[level].bp_oldreq); | 1448 | nilfs_bmap_abort_end_ptr(&btree->bt_bmap, &path[level].bp_oldreq, dat); |
1490 | err_out_child_node: | 1449 | err_out_child_node: |
1491 | for (level--; level >= NILFS_BTREE_LEVEL_NODE_MIN; level--) { | 1450 | for (level--; level >= NILFS_BTREE_LEVEL_NODE_MIN; level--) { |
1492 | brelse(path[level].bp_sib_bh); | 1451 | brelse(path[level].bp_sib_bh); |
1493 | nilfs_bmap_abort_end_ptr(&btree->bt_bmap, | 1452 | nilfs_bmap_abort_end_ptr(&btree->bt_bmap, |
1494 | &path[level].bp_oldreq); | 1453 | &path[level].bp_oldreq, dat); |
1495 | } | 1454 | } |
1496 | *levelp = level; | 1455 | *levelp = level; |
1497 | stats->bs_nblocks = 0; | 1456 | stats->bs_nblocks = 0; |
@@ -1500,13 +1459,13 @@ static int nilfs_btree_prepare_delete(struct nilfs_btree *btree, | |||
1500 | 1459 | ||
1501 | static void nilfs_btree_commit_delete(struct nilfs_btree *btree, | 1460 | static void nilfs_btree_commit_delete(struct nilfs_btree *btree, |
1502 | struct nilfs_btree_path *path, | 1461 | struct nilfs_btree_path *path, |
1503 | int maxlevel) | 1462 | int maxlevel, struct inode *dat) |
1504 | { | 1463 | { |
1505 | int level; | 1464 | int level; |
1506 | 1465 | ||
1507 | for (level = NILFS_BTREE_LEVEL_NODE_MIN; level <= maxlevel; level++) { | 1466 | for (level = NILFS_BTREE_LEVEL_NODE_MIN; level <= maxlevel; level++) { |
1508 | nilfs_bmap_commit_end_ptr(&btree->bt_bmap, | 1467 | nilfs_bmap_commit_end_ptr(&btree->bt_bmap, |
1509 | &path[level].bp_oldreq); | 1468 | &path[level].bp_oldreq, dat); |
1510 | path[level].bp_op(btree, path, level, NULL, NULL); | 1469 | path[level].bp_op(btree, path, level, NULL, NULL); |
1511 | } | 1470 | } |
1512 | 1471 | ||
@@ -1520,27 +1479,32 @@ static int nilfs_btree_delete(struct nilfs_bmap *bmap, __u64 key) | |||
1520 | struct nilfs_btree *btree; | 1479 | struct nilfs_btree *btree; |
1521 | struct nilfs_btree_path *path; | 1480 | struct nilfs_btree_path *path; |
1522 | struct nilfs_bmap_stats stats; | 1481 | struct nilfs_bmap_stats stats; |
1482 | struct inode *dat; | ||
1523 | int level, ret; | 1483 | int level, ret; |
1524 | 1484 | ||
1525 | btree = (struct nilfs_btree *)bmap; | 1485 | btree = (struct nilfs_btree *)bmap; |
1526 | path = nilfs_btree_alloc_path(btree); | 1486 | path = nilfs_btree_alloc_path(); |
1527 | if (path == NULL) | 1487 | if (path == NULL) |
1528 | return -ENOMEM; | 1488 | return -ENOMEM; |
1529 | nilfs_btree_init_path(btree, path); | 1489 | nilfs_btree_init_path(path); |
1530 | ret = nilfs_btree_do_lookup(btree, path, key, NULL, | 1490 | ret = nilfs_btree_do_lookup(btree, path, key, NULL, |
1531 | NILFS_BTREE_LEVEL_NODE_MIN); | 1491 | NILFS_BTREE_LEVEL_NODE_MIN); |
1532 | if (ret < 0) | 1492 | if (ret < 0) |
1533 | goto out; | 1493 | goto out; |
1534 | 1494 | ||
1535 | ret = nilfs_btree_prepare_delete(btree, path, &level, &stats); | 1495 | |
1496 | dat = NILFS_BMAP_USE_VBN(&btree->bt_bmap) ? | ||
1497 | nilfs_bmap_get_dat(&btree->bt_bmap) : NULL; | ||
1498 | |||
1499 | ret = nilfs_btree_prepare_delete(btree, path, &level, &stats, dat); | ||
1536 | if (ret < 0) | 1500 | if (ret < 0) |
1537 | goto out; | 1501 | goto out; |
1538 | nilfs_btree_commit_delete(btree, path, level); | 1502 | nilfs_btree_commit_delete(btree, path, level, dat); |
1539 | nilfs_bmap_sub_blocks(bmap, stats.bs_nblocks); | 1503 | nilfs_bmap_sub_blocks(bmap, stats.bs_nblocks); |
1540 | 1504 | ||
1541 | out: | 1505 | out: |
1542 | nilfs_btree_clear_path(btree, path); | 1506 | nilfs_btree_release_path(path); |
1543 | nilfs_btree_free_path(btree, path); | 1507 | nilfs_btree_free_path(path); |
1544 | return ret; | 1508 | return ret; |
1545 | } | 1509 | } |
1546 | 1510 | ||
@@ -1551,15 +1515,15 @@ static int nilfs_btree_last_key(const struct nilfs_bmap *bmap, __u64 *keyp) | |||
1551 | int ret; | 1515 | int ret; |
1552 | 1516 | ||
1553 | btree = (struct nilfs_btree *)bmap; | 1517 | btree = (struct nilfs_btree *)bmap; |
1554 | path = nilfs_btree_alloc_path(btree); | 1518 | path = nilfs_btree_alloc_path(); |
1555 | if (path == NULL) | 1519 | if (path == NULL) |
1556 | return -ENOMEM; | 1520 | return -ENOMEM; |
1557 | nilfs_btree_init_path(btree, path); | 1521 | nilfs_btree_init_path(path); |
1558 | 1522 | ||
1559 | ret = nilfs_btree_do_lookup_last(btree, path, keyp, NULL); | 1523 | ret = nilfs_btree_do_lookup_last(btree, path, keyp, NULL); |
1560 | 1524 | ||
1561 | nilfs_btree_clear_path(btree, path); | 1525 | nilfs_btree_release_path(path); |
1562 | nilfs_btree_free_path(btree, path); | 1526 | nilfs_btree_free_path(path); |
1563 | 1527 | ||
1564 | return ret; | 1528 | return ret; |
1565 | } | 1529 | } |
@@ -1581,7 +1545,7 @@ static int nilfs_btree_check_delete(struct nilfs_bmap *bmap, __u64 key) | |||
1581 | node = root; | 1545 | node = root; |
1582 | break; | 1546 | break; |
1583 | case 3: | 1547 | case 3: |
1584 | nchildren = nilfs_btree_node_get_nchildren(btree, root); | 1548 | nchildren = nilfs_btree_node_get_nchildren(root); |
1585 | if (nchildren > 1) | 1549 | if (nchildren > 1) |
1586 | return 0; | 1550 | return 0; |
1587 | ptr = nilfs_btree_node_get_ptr(btree, root, nchildren - 1); | 1551 | ptr = nilfs_btree_node_get_ptr(btree, root, nchildren - 1); |
@@ -1594,10 +1558,10 @@ static int nilfs_btree_check_delete(struct nilfs_bmap *bmap, __u64 key) | |||
1594 | return 0; | 1558 | return 0; |
1595 | } | 1559 | } |
1596 | 1560 | ||
1597 | nchildren = nilfs_btree_node_get_nchildren(btree, node); | 1561 | nchildren = nilfs_btree_node_get_nchildren(node); |
1598 | maxkey = nilfs_btree_node_get_key(btree, node, nchildren - 1); | 1562 | maxkey = nilfs_btree_node_get_key(node, nchildren - 1); |
1599 | nextmaxkey = (nchildren > 1) ? | 1563 | nextmaxkey = (nchildren > 1) ? |
1600 | nilfs_btree_node_get_key(btree, node, nchildren - 2) : 0; | 1564 | nilfs_btree_node_get_key(node, nchildren - 2) : 0; |
1601 | if (bh != NULL) | 1565 | if (bh != NULL) |
1602 | brelse(bh); | 1566 | brelse(bh); |
1603 | 1567 | ||
@@ -1623,7 +1587,7 @@ static int nilfs_btree_gather_data(struct nilfs_bmap *bmap, | |||
1623 | node = root; | 1587 | node = root; |
1624 | break; | 1588 | break; |
1625 | case 3: | 1589 | case 3: |
1626 | nchildren = nilfs_btree_node_get_nchildren(btree, root); | 1590 | nchildren = nilfs_btree_node_get_nchildren(root); |
1627 | WARN_ON(nchildren > 1); | 1591 | WARN_ON(nchildren > 1); |
1628 | ptr = nilfs_btree_node_get_ptr(btree, root, nchildren - 1); | 1592 | ptr = nilfs_btree_node_get_ptr(btree, root, nchildren - 1); |
1629 | ret = nilfs_btree_get_block(btree, ptr, &bh); | 1593 | ret = nilfs_btree_get_block(btree, ptr, &bh); |
@@ -1636,11 +1600,11 @@ static int nilfs_btree_gather_data(struct nilfs_bmap *bmap, | |||
1636 | return -EINVAL; | 1600 | return -EINVAL; |
1637 | } | 1601 | } |
1638 | 1602 | ||
1639 | nchildren = nilfs_btree_node_get_nchildren(btree, node); | 1603 | nchildren = nilfs_btree_node_get_nchildren(node); |
1640 | if (nchildren < nitems) | 1604 | if (nchildren < nitems) |
1641 | nitems = nchildren; | 1605 | nitems = nchildren; |
1642 | dkeys = nilfs_btree_node_dkeys(btree, node); | 1606 | dkeys = nilfs_btree_node_dkeys(node); |
1643 | dptrs = nilfs_btree_node_dptrs(btree, node); | 1607 | dptrs = nilfs_btree_node_dptrs(node, btree); |
1644 | for (i = 0; i < nitems; i++) { | 1608 | for (i = 0; i < nitems; i++) { |
1645 | keys[i] = nilfs_bmap_dkey_to_key(dkeys[i]); | 1609 | keys[i] = nilfs_bmap_dkey_to_key(dkeys[i]); |
1646 | ptrs[i] = nilfs_bmap_dptr_to_ptr(dptrs[i]); | 1610 | ptrs[i] = nilfs_bmap_dptr_to_ptr(dptrs[i]); |
@@ -1660,18 +1624,20 @@ nilfs_btree_prepare_convert_and_insert(struct nilfs_bmap *bmap, __u64 key, | |||
1660 | struct nilfs_bmap_stats *stats) | 1624 | struct nilfs_bmap_stats *stats) |
1661 | { | 1625 | { |
1662 | struct buffer_head *bh; | 1626 | struct buffer_head *bh; |
1663 | struct nilfs_btree *btree; | 1627 | struct nilfs_btree *btree = (struct nilfs_btree *)bmap; |
1628 | struct inode *dat = NULL; | ||
1664 | int ret; | 1629 | int ret; |
1665 | 1630 | ||
1666 | btree = (struct nilfs_btree *)bmap; | ||
1667 | stats->bs_nblocks = 0; | 1631 | stats->bs_nblocks = 0; |
1668 | 1632 | ||
1669 | /* for data */ | 1633 | /* for data */ |
1670 | /* cannot find near ptr */ | 1634 | /* cannot find near ptr */ |
1671 | if (NILFS_BMAP_USE_VBN(bmap)) | 1635 | if (NILFS_BMAP_USE_VBN(bmap)) { |
1672 | dreq->bpr_ptr = nilfs_btree_find_target_v(btree, NULL, key); | 1636 | dreq->bpr_ptr = nilfs_btree_find_target_v(btree, NULL, key); |
1637 | dat = nilfs_bmap_get_dat(bmap); | ||
1638 | } | ||
1673 | 1639 | ||
1674 | ret = nilfs_bmap_prepare_alloc_ptr(bmap, dreq); | 1640 | ret = nilfs_bmap_prepare_alloc_ptr(bmap, dreq, dat); |
1675 | if (ret < 0) | 1641 | if (ret < 0) |
1676 | return ret; | 1642 | return ret; |
1677 | 1643 | ||
@@ -1679,7 +1645,7 @@ nilfs_btree_prepare_convert_and_insert(struct nilfs_bmap *bmap, __u64 key, | |||
1679 | stats->bs_nblocks++; | 1645 | stats->bs_nblocks++; |
1680 | if (nreq != NULL) { | 1646 | if (nreq != NULL) { |
1681 | nreq->bpr_ptr = dreq->bpr_ptr + 1; | 1647 | nreq->bpr_ptr = dreq->bpr_ptr + 1; |
1682 | ret = nilfs_bmap_prepare_alloc_ptr(bmap, nreq); | 1648 | ret = nilfs_bmap_prepare_alloc_ptr(bmap, nreq, dat); |
1683 | if (ret < 0) | 1649 | if (ret < 0) |
1684 | goto err_out_dreq; | 1650 | goto err_out_dreq; |
1685 | 1651 | ||
@@ -1696,9 +1662,9 @@ nilfs_btree_prepare_convert_and_insert(struct nilfs_bmap *bmap, __u64 key, | |||
1696 | 1662 | ||
1697 | /* error */ | 1663 | /* error */ |
1698 | err_out_nreq: | 1664 | err_out_nreq: |
1699 | nilfs_bmap_abort_alloc_ptr(bmap, nreq); | 1665 | nilfs_bmap_abort_alloc_ptr(bmap, nreq, dat); |
1700 | err_out_dreq: | 1666 | err_out_dreq: |
1701 | nilfs_bmap_abort_alloc_ptr(bmap, dreq); | 1667 | nilfs_bmap_abort_alloc_ptr(bmap, dreq, dat); |
1702 | stats->bs_nblocks = 0; | 1668 | stats->bs_nblocks = 0; |
1703 | return ret; | 1669 | return ret; |
1704 | 1670 | ||
@@ -1713,8 +1679,9 @@ nilfs_btree_commit_convert_and_insert(struct nilfs_bmap *bmap, | |||
1713 | union nilfs_bmap_ptr_req *nreq, | 1679 | union nilfs_bmap_ptr_req *nreq, |
1714 | struct buffer_head *bh) | 1680 | struct buffer_head *bh) |
1715 | { | 1681 | { |
1716 | struct nilfs_btree *btree; | 1682 | struct nilfs_btree *btree = (struct nilfs_btree *)bmap; |
1717 | struct nilfs_btree_node *node; | 1683 | struct nilfs_btree_node *node; |
1684 | struct inode *dat; | ||
1718 | __u64 tmpptr; | 1685 | __u64 tmpptr; |
1719 | 1686 | ||
1720 | /* free resources */ | 1687 | /* free resources */ |
@@ -1725,11 +1692,11 @@ nilfs_btree_commit_convert_and_insert(struct nilfs_bmap *bmap, | |||
1725 | set_buffer_nilfs_volatile((struct buffer_head *)((unsigned long)ptr)); | 1692 | set_buffer_nilfs_volatile((struct buffer_head *)((unsigned long)ptr)); |
1726 | 1693 | ||
1727 | /* convert and insert */ | 1694 | /* convert and insert */ |
1728 | btree = (struct nilfs_btree *)bmap; | 1695 | dat = NILFS_BMAP_USE_VBN(bmap) ? nilfs_bmap_get_dat(bmap) : NULL; |
1729 | nilfs_btree_init(bmap); | 1696 | nilfs_btree_init(bmap); |
1730 | if (nreq != NULL) { | 1697 | if (nreq != NULL) { |
1731 | nilfs_bmap_commit_alloc_ptr(bmap, dreq); | 1698 | nilfs_bmap_commit_alloc_ptr(bmap, dreq, dat); |
1732 | nilfs_bmap_commit_alloc_ptr(bmap, nreq); | 1699 | nilfs_bmap_commit_alloc_ptr(bmap, nreq, dat); |
1733 | 1700 | ||
1734 | /* create child node at level 1 */ | 1701 | /* create child node at level 1 */ |
1735 | lock_buffer(bh); | 1702 | lock_buffer(bh); |
@@ -1751,7 +1718,7 @@ nilfs_btree_commit_convert_and_insert(struct nilfs_bmap *bmap, | |||
1751 | nilfs_btree_node_init(btree, node, NILFS_BTREE_NODE_ROOT, | 1718 | nilfs_btree_node_init(btree, node, NILFS_BTREE_NODE_ROOT, |
1752 | 2, 1, &keys[0], &tmpptr); | 1719 | 2, 1, &keys[0], &tmpptr); |
1753 | } else { | 1720 | } else { |
1754 | nilfs_bmap_commit_alloc_ptr(bmap, dreq); | 1721 | nilfs_bmap_commit_alloc_ptr(bmap, dreq, dat); |
1755 | 1722 | ||
1756 | /* create root node at level 1 */ | 1723 | /* create root node at level 1 */ |
1757 | node = nilfs_btree_get_root(btree); | 1724 | node = nilfs_btree_get_root(btree); |
@@ -1822,7 +1789,7 @@ static int nilfs_btree_propagate_p(struct nilfs_btree *btree, | |||
1822 | 1789 | ||
1823 | static int nilfs_btree_prepare_update_v(struct nilfs_btree *btree, | 1790 | static int nilfs_btree_prepare_update_v(struct nilfs_btree *btree, |
1824 | struct nilfs_btree_path *path, | 1791 | struct nilfs_btree_path *path, |
1825 | int level) | 1792 | int level, struct inode *dat) |
1826 | { | 1793 | { |
1827 | struct nilfs_btree_node *parent; | 1794 | struct nilfs_btree_node *parent; |
1828 | int ret; | 1795 | int ret; |
@@ -1832,9 +1799,8 @@ static int nilfs_btree_prepare_update_v(struct nilfs_btree *btree, | |||
1832 | nilfs_btree_node_get_ptr(btree, parent, | 1799 | nilfs_btree_node_get_ptr(btree, parent, |
1833 | path[level + 1].bp_index); | 1800 | path[level + 1].bp_index); |
1834 | path[level].bp_newreq.bpr_ptr = path[level].bp_oldreq.bpr_ptr + 1; | 1801 | path[level].bp_newreq.bpr_ptr = path[level].bp_oldreq.bpr_ptr + 1; |
1835 | ret = nilfs_bmap_prepare_update_v(&btree->bt_bmap, | 1802 | ret = nilfs_dat_prepare_update(dat, &path[level].bp_oldreq.bpr_req, |
1836 | &path[level].bp_oldreq, | 1803 | &path[level].bp_newreq.bpr_req); |
1837 | &path[level].bp_newreq); | ||
1838 | if (ret < 0) | 1804 | if (ret < 0) |
1839 | return ret; | 1805 | return ret; |
1840 | 1806 | ||
@@ -1846,9 +1812,9 @@ static int nilfs_btree_prepare_update_v(struct nilfs_btree *btree, | |||
1846 | &NILFS_BMAP_I(&btree->bt_bmap)->i_btnode_cache, | 1812 | &NILFS_BMAP_I(&btree->bt_bmap)->i_btnode_cache, |
1847 | &path[level].bp_ctxt); | 1813 | &path[level].bp_ctxt); |
1848 | if (ret < 0) { | 1814 | if (ret < 0) { |
1849 | nilfs_bmap_abort_update_v(&btree->bt_bmap, | 1815 | nilfs_dat_abort_update(dat, |
1850 | &path[level].bp_oldreq, | 1816 | &path[level].bp_oldreq.bpr_req, |
1851 | &path[level].bp_newreq); | 1817 | &path[level].bp_newreq.bpr_req); |
1852 | return ret; | 1818 | return ret; |
1853 | } | 1819 | } |
1854 | } | 1820 | } |
@@ -1858,13 +1824,13 @@ static int nilfs_btree_prepare_update_v(struct nilfs_btree *btree, | |||
1858 | 1824 | ||
1859 | static void nilfs_btree_commit_update_v(struct nilfs_btree *btree, | 1825 | static void nilfs_btree_commit_update_v(struct nilfs_btree *btree, |
1860 | struct nilfs_btree_path *path, | 1826 | struct nilfs_btree_path *path, |
1861 | int level) | 1827 | int level, struct inode *dat) |
1862 | { | 1828 | { |
1863 | struct nilfs_btree_node *parent; | 1829 | struct nilfs_btree_node *parent; |
1864 | 1830 | ||
1865 | nilfs_bmap_commit_update_v(&btree->bt_bmap, | 1831 | nilfs_dat_commit_update(dat, &path[level].bp_oldreq.bpr_req, |
1866 | &path[level].bp_oldreq, | 1832 | &path[level].bp_newreq.bpr_req, |
1867 | &path[level].bp_newreq); | 1833 | btree->bt_bmap.b_ptr_type == NILFS_BMAP_PTR_VS); |
1868 | 1834 | ||
1869 | if (buffer_nilfs_node(path[level].bp_bh)) { | 1835 | if (buffer_nilfs_node(path[level].bp_bh)) { |
1870 | nilfs_btnode_commit_change_key( | 1836 | nilfs_btnode_commit_change_key( |
@@ -1881,11 +1847,10 @@ static void nilfs_btree_commit_update_v(struct nilfs_btree *btree, | |||
1881 | 1847 | ||
1882 | static void nilfs_btree_abort_update_v(struct nilfs_btree *btree, | 1848 | static void nilfs_btree_abort_update_v(struct nilfs_btree *btree, |
1883 | struct nilfs_btree_path *path, | 1849 | struct nilfs_btree_path *path, |
1884 | int level) | 1850 | int level, struct inode *dat) |
1885 | { | 1851 | { |
1886 | nilfs_bmap_abort_update_v(&btree->bt_bmap, | 1852 | nilfs_dat_abort_update(dat, &path[level].bp_oldreq.bpr_req, |
1887 | &path[level].bp_oldreq, | 1853 | &path[level].bp_newreq.bpr_req); |
1888 | &path[level].bp_newreq); | ||
1889 | if (buffer_nilfs_node(path[level].bp_bh)) | 1854 | if (buffer_nilfs_node(path[level].bp_bh)) |
1890 | nilfs_btnode_abort_change_key( | 1855 | nilfs_btnode_abort_change_key( |
1891 | &NILFS_BMAP_I(&btree->bt_bmap)->i_btnode_cache, | 1856 | &NILFS_BMAP_I(&btree->bt_bmap)->i_btnode_cache, |
@@ -1894,14 +1859,14 @@ static void nilfs_btree_abort_update_v(struct nilfs_btree *btree, | |||
1894 | 1859 | ||
1895 | static int nilfs_btree_prepare_propagate_v(struct nilfs_btree *btree, | 1860 | static int nilfs_btree_prepare_propagate_v(struct nilfs_btree *btree, |
1896 | struct nilfs_btree_path *path, | 1861 | struct nilfs_btree_path *path, |
1897 | int minlevel, | 1862 | int minlevel, int *maxlevelp, |
1898 | int *maxlevelp) | 1863 | struct inode *dat) |
1899 | { | 1864 | { |
1900 | int level, ret; | 1865 | int level, ret; |
1901 | 1866 | ||
1902 | level = minlevel; | 1867 | level = minlevel; |
1903 | if (!buffer_nilfs_volatile(path[level].bp_bh)) { | 1868 | if (!buffer_nilfs_volatile(path[level].bp_bh)) { |
1904 | ret = nilfs_btree_prepare_update_v(btree, path, level); | 1869 | ret = nilfs_btree_prepare_update_v(btree, path, level, dat); |
1905 | if (ret < 0) | 1870 | if (ret < 0) |
1906 | return ret; | 1871 | return ret; |
1907 | } | 1872 | } |
@@ -1909,7 +1874,7 @@ static int nilfs_btree_prepare_propagate_v(struct nilfs_btree *btree, | |||
1909 | !buffer_dirty(path[level].bp_bh)) { | 1874 | !buffer_dirty(path[level].bp_bh)) { |
1910 | 1875 | ||
1911 | WARN_ON(buffer_nilfs_volatile(path[level].bp_bh)); | 1876 | WARN_ON(buffer_nilfs_volatile(path[level].bp_bh)); |
1912 | ret = nilfs_btree_prepare_update_v(btree, path, level); | 1877 | ret = nilfs_btree_prepare_update_v(btree, path, level, dat); |
1913 | if (ret < 0) | 1878 | if (ret < 0) |
1914 | goto out; | 1879 | goto out; |
1915 | } | 1880 | } |
@@ -1921,39 +1886,40 @@ static int nilfs_btree_prepare_propagate_v(struct nilfs_btree *btree, | |||
1921 | /* error */ | 1886 | /* error */ |
1922 | out: | 1887 | out: |
1923 | while (--level > minlevel) | 1888 | while (--level > minlevel) |
1924 | nilfs_btree_abort_update_v(btree, path, level); | 1889 | nilfs_btree_abort_update_v(btree, path, level, dat); |
1925 | if (!buffer_nilfs_volatile(path[level].bp_bh)) | 1890 | if (!buffer_nilfs_volatile(path[level].bp_bh)) |
1926 | nilfs_btree_abort_update_v(btree, path, level); | 1891 | nilfs_btree_abort_update_v(btree, path, level, dat); |
1927 | return ret; | 1892 | return ret; |
1928 | } | 1893 | } |
1929 | 1894 | ||
1930 | static void nilfs_btree_commit_propagate_v(struct nilfs_btree *btree, | 1895 | static void nilfs_btree_commit_propagate_v(struct nilfs_btree *btree, |
1931 | struct nilfs_btree_path *path, | 1896 | struct nilfs_btree_path *path, |
1932 | int minlevel, | 1897 | int minlevel, int maxlevel, |
1933 | int maxlevel, | 1898 | struct buffer_head *bh, |
1934 | struct buffer_head *bh) | 1899 | struct inode *dat) |
1935 | { | 1900 | { |
1936 | int level; | 1901 | int level; |
1937 | 1902 | ||
1938 | if (!buffer_nilfs_volatile(path[minlevel].bp_bh)) | 1903 | if (!buffer_nilfs_volatile(path[minlevel].bp_bh)) |
1939 | nilfs_btree_commit_update_v(btree, path, minlevel); | 1904 | nilfs_btree_commit_update_v(btree, path, minlevel, dat); |
1940 | 1905 | ||
1941 | for (level = minlevel + 1; level <= maxlevel; level++) | 1906 | for (level = minlevel + 1; level <= maxlevel; level++) |
1942 | nilfs_btree_commit_update_v(btree, path, level); | 1907 | nilfs_btree_commit_update_v(btree, path, level, dat); |
1943 | } | 1908 | } |
1944 | 1909 | ||
1945 | static int nilfs_btree_propagate_v(struct nilfs_btree *btree, | 1910 | static int nilfs_btree_propagate_v(struct nilfs_btree *btree, |
1946 | struct nilfs_btree_path *path, | 1911 | struct nilfs_btree_path *path, |
1947 | int level, | 1912 | int level, struct buffer_head *bh) |
1948 | struct buffer_head *bh) | ||
1949 | { | 1913 | { |
1950 | int maxlevel, ret; | 1914 | int maxlevel, ret; |
1951 | struct nilfs_btree_node *parent; | 1915 | struct nilfs_btree_node *parent; |
1916 | struct inode *dat = nilfs_bmap_get_dat(&btree->bt_bmap); | ||
1952 | __u64 ptr; | 1917 | __u64 ptr; |
1953 | 1918 | ||
1954 | get_bh(bh); | 1919 | get_bh(bh); |
1955 | path[level].bp_bh = bh; | 1920 | path[level].bp_bh = bh; |
1956 | ret = nilfs_btree_prepare_propagate_v(btree, path, level, &maxlevel); | 1921 | ret = nilfs_btree_prepare_propagate_v(btree, path, level, &maxlevel, |
1922 | dat); | ||
1957 | if (ret < 0) | 1923 | if (ret < 0) |
1958 | goto out; | 1924 | goto out; |
1959 | 1925 | ||
@@ -1961,12 +1927,12 @@ static int nilfs_btree_propagate_v(struct nilfs_btree *btree, | |||
1961 | parent = nilfs_btree_get_node(btree, path, level + 1); | 1927 | parent = nilfs_btree_get_node(btree, path, level + 1); |
1962 | ptr = nilfs_btree_node_get_ptr(btree, parent, | 1928 | ptr = nilfs_btree_node_get_ptr(btree, parent, |
1963 | path[level + 1].bp_index); | 1929 | path[level + 1].bp_index); |
1964 | ret = nilfs_bmap_mark_dirty(&btree->bt_bmap, ptr); | 1930 | ret = nilfs_dat_mark_dirty(dat, ptr); |
1965 | if (ret < 0) | 1931 | if (ret < 0) |
1966 | goto out; | 1932 | goto out; |
1967 | } | 1933 | } |
1968 | 1934 | ||
1969 | nilfs_btree_commit_propagate_v(btree, path, level, maxlevel, bh); | 1935 | nilfs_btree_commit_propagate_v(btree, path, level, maxlevel, bh, dat); |
1970 | 1936 | ||
1971 | out: | 1937 | out: |
1972 | brelse(path[level].bp_bh); | 1938 | brelse(path[level].bp_bh); |
@@ -1986,15 +1952,15 @@ static int nilfs_btree_propagate(const struct nilfs_bmap *bmap, | |||
1986 | WARN_ON(!buffer_dirty(bh)); | 1952 | WARN_ON(!buffer_dirty(bh)); |
1987 | 1953 | ||
1988 | btree = (struct nilfs_btree *)bmap; | 1954 | btree = (struct nilfs_btree *)bmap; |
1989 | path = nilfs_btree_alloc_path(btree); | 1955 | path = nilfs_btree_alloc_path(); |
1990 | if (path == NULL) | 1956 | if (path == NULL) |
1991 | return -ENOMEM; | 1957 | return -ENOMEM; |
1992 | nilfs_btree_init_path(btree, path); | 1958 | nilfs_btree_init_path(path); |
1993 | 1959 | ||
1994 | if (buffer_nilfs_node(bh)) { | 1960 | if (buffer_nilfs_node(bh)) { |
1995 | node = (struct nilfs_btree_node *)bh->b_data; | 1961 | node = (struct nilfs_btree_node *)bh->b_data; |
1996 | key = nilfs_btree_node_get_key(btree, node, 0); | 1962 | key = nilfs_btree_node_get_key(node, 0); |
1997 | level = nilfs_btree_node_get_level(btree, node); | 1963 | level = nilfs_btree_node_get_level(node); |
1998 | } else { | 1964 | } else { |
1999 | key = nilfs_bmap_data_get_key(bmap, bh); | 1965 | key = nilfs_bmap_data_get_key(bmap, bh); |
2000 | level = NILFS_BTREE_LEVEL_DATA; | 1966 | level = NILFS_BTREE_LEVEL_DATA; |
@@ -2013,8 +1979,8 @@ static int nilfs_btree_propagate(const struct nilfs_bmap *bmap, | |||
2013 | nilfs_btree_propagate_p(btree, path, level, bh); | 1979 | nilfs_btree_propagate_p(btree, path, level, bh); |
2014 | 1980 | ||
2015 | out: | 1981 | out: |
2016 | nilfs_btree_clear_path(btree, path); | 1982 | nilfs_btree_release_path(path); |
2017 | nilfs_btree_free_path(btree, path); | 1983 | nilfs_btree_free_path(path); |
2018 | 1984 | ||
2019 | return ret; | 1985 | return ret; |
2020 | } | 1986 | } |
@@ -2022,7 +1988,7 @@ static int nilfs_btree_propagate(const struct nilfs_bmap *bmap, | |||
2022 | static int nilfs_btree_propagate_gc(const struct nilfs_bmap *bmap, | 1988 | static int nilfs_btree_propagate_gc(const struct nilfs_bmap *bmap, |
2023 | struct buffer_head *bh) | 1989 | struct buffer_head *bh) |
2024 | { | 1990 | { |
2025 | return nilfs_bmap_mark_dirty(bmap, bh->b_blocknr); | 1991 | return nilfs_dat_mark_dirty(nilfs_bmap_get_dat(bmap), bh->b_blocknr); |
2026 | } | 1992 | } |
2027 | 1993 | ||
2028 | static void nilfs_btree_add_dirty_buffer(struct nilfs_btree *btree, | 1994 | static void nilfs_btree_add_dirty_buffer(struct nilfs_btree *btree, |
@@ -2037,12 +2003,12 @@ static void nilfs_btree_add_dirty_buffer(struct nilfs_btree *btree, | |||
2037 | 2003 | ||
2038 | get_bh(bh); | 2004 | get_bh(bh); |
2039 | node = (struct nilfs_btree_node *)bh->b_data; | 2005 | node = (struct nilfs_btree_node *)bh->b_data; |
2040 | key = nilfs_btree_node_get_key(btree, node, 0); | 2006 | key = nilfs_btree_node_get_key(node, 0); |
2041 | level = nilfs_btree_node_get_level(btree, node); | 2007 | level = nilfs_btree_node_get_level(node); |
2042 | list_for_each(head, &lists[level]) { | 2008 | list_for_each(head, &lists[level]) { |
2043 | cbh = list_entry(head, struct buffer_head, b_assoc_buffers); | 2009 | cbh = list_entry(head, struct buffer_head, b_assoc_buffers); |
2044 | cnode = (struct nilfs_btree_node *)cbh->b_data; | 2010 | cnode = (struct nilfs_btree_node *)cbh->b_data; |
2045 | ckey = nilfs_btree_node_get_key(btree, cnode, 0); | 2011 | ckey = nilfs_btree_node_get_key(cnode, 0); |
2046 | if (key < ckey) | 2012 | if (key < ckey) |
2047 | break; | 2013 | break; |
2048 | } | 2014 | } |
@@ -2120,8 +2086,7 @@ static int nilfs_btree_assign_p(struct nilfs_btree *btree, | |||
2120 | nilfs_btree_node_set_ptr(btree, parent, | 2086 | nilfs_btree_node_set_ptr(btree, parent, |
2121 | path[level + 1].bp_index, blocknr); | 2087 | path[level + 1].bp_index, blocknr); |
2122 | 2088 | ||
2123 | key = nilfs_btree_node_get_key(btree, parent, | 2089 | key = nilfs_btree_node_get_key(parent, path[level + 1].bp_index); |
2124 | path[level + 1].bp_index); | ||
2125 | /* on-disk format */ | 2090 | /* on-disk format */ |
2126 | binfo->bi_dat.bi_blkoff = nilfs_bmap_key_to_dkey(key); | 2091 | binfo->bi_dat.bi_blkoff = nilfs_bmap_key_to_dkey(key); |
2127 | binfo->bi_dat.bi_level = level; | 2092 | binfo->bi_dat.bi_level = level; |
@@ -2137,6 +2102,7 @@ static int nilfs_btree_assign_v(struct nilfs_btree *btree, | |||
2137 | union nilfs_binfo *binfo) | 2102 | union nilfs_binfo *binfo) |
2138 | { | 2103 | { |
2139 | struct nilfs_btree_node *parent; | 2104 | struct nilfs_btree_node *parent; |
2105 | struct inode *dat = nilfs_bmap_get_dat(&btree->bt_bmap); | ||
2140 | __u64 key; | 2106 | __u64 key; |
2141 | __u64 ptr; | 2107 | __u64 ptr; |
2142 | union nilfs_bmap_ptr_req req; | 2108 | union nilfs_bmap_ptr_req req; |
@@ -2146,12 +2112,12 @@ static int nilfs_btree_assign_v(struct nilfs_btree *btree, | |||
2146 | ptr = nilfs_btree_node_get_ptr(btree, parent, | 2112 | ptr = nilfs_btree_node_get_ptr(btree, parent, |
2147 | path[level + 1].bp_index); | 2113 | path[level + 1].bp_index); |
2148 | req.bpr_ptr = ptr; | 2114 | req.bpr_ptr = ptr; |
2149 | ret = nilfs_bmap_start_v(&btree->bt_bmap, &req, blocknr); | 2115 | ret = nilfs_dat_prepare_start(dat, &req.bpr_req); |
2150 | if (unlikely(ret < 0)) | 2116 | if (ret < 0) |
2151 | return ret; | 2117 | return ret; |
2118 | nilfs_dat_commit_start(dat, &req.bpr_req, blocknr); | ||
2152 | 2119 | ||
2153 | key = nilfs_btree_node_get_key(btree, parent, | 2120 | key = nilfs_btree_node_get_key(parent, path[level + 1].bp_index); |
2154 | path[level + 1].bp_index); | ||
2155 | /* on-disk format */ | 2121 | /* on-disk format */ |
2156 | binfo->bi_v.bi_vblocknr = nilfs_bmap_ptr_to_dptr(ptr); | 2122 | binfo->bi_v.bi_vblocknr = nilfs_bmap_ptr_to_dptr(ptr); |
2157 | binfo->bi_v.bi_blkoff = nilfs_bmap_key_to_dkey(key); | 2123 | binfo->bi_v.bi_blkoff = nilfs_bmap_key_to_dkey(key); |
@@ -2171,15 +2137,15 @@ static int nilfs_btree_assign(struct nilfs_bmap *bmap, | |||
2171 | int level, ret; | 2137 | int level, ret; |
2172 | 2138 | ||
2173 | btree = (struct nilfs_btree *)bmap; | 2139 | btree = (struct nilfs_btree *)bmap; |
2174 | path = nilfs_btree_alloc_path(btree); | 2140 | path = nilfs_btree_alloc_path(); |
2175 | if (path == NULL) | 2141 | if (path == NULL) |
2176 | return -ENOMEM; | 2142 | return -ENOMEM; |
2177 | nilfs_btree_init_path(btree, path); | 2143 | nilfs_btree_init_path(path); |
2178 | 2144 | ||
2179 | if (buffer_nilfs_node(*bh)) { | 2145 | if (buffer_nilfs_node(*bh)) { |
2180 | node = (struct nilfs_btree_node *)(*bh)->b_data; | 2146 | node = (struct nilfs_btree_node *)(*bh)->b_data; |
2181 | key = nilfs_btree_node_get_key(btree, node, 0); | 2147 | key = nilfs_btree_node_get_key(node, 0); |
2182 | level = nilfs_btree_node_get_level(btree, node); | 2148 | level = nilfs_btree_node_get_level(node); |
2183 | } else { | 2149 | } else { |
2184 | key = nilfs_bmap_data_get_key(bmap, *bh); | 2150 | key = nilfs_bmap_data_get_key(bmap, *bh); |
2185 | level = NILFS_BTREE_LEVEL_DATA; | 2151 | level = NILFS_BTREE_LEVEL_DATA; |
@@ -2196,8 +2162,8 @@ static int nilfs_btree_assign(struct nilfs_bmap *bmap, | |||
2196 | nilfs_btree_assign_p(btree, path, level, bh, blocknr, binfo); | 2162 | nilfs_btree_assign_p(btree, path, level, bh, blocknr, binfo); |
2197 | 2163 | ||
2198 | out: | 2164 | out: |
2199 | nilfs_btree_clear_path(btree, path); | 2165 | nilfs_btree_release_path(path); |
2200 | nilfs_btree_free_path(btree, path); | 2166 | nilfs_btree_free_path(path); |
2201 | 2167 | ||
2202 | return ret; | 2168 | return ret; |
2203 | } | 2169 | } |
@@ -2207,19 +2173,18 @@ static int nilfs_btree_assign_gc(struct nilfs_bmap *bmap, | |||
2207 | sector_t blocknr, | 2173 | sector_t blocknr, |
2208 | union nilfs_binfo *binfo) | 2174 | union nilfs_binfo *binfo) |
2209 | { | 2175 | { |
2210 | struct nilfs_btree *btree; | ||
2211 | struct nilfs_btree_node *node; | 2176 | struct nilfs_btree_node *node; |
2212 | __u64 key; | 2177 | __u64 key; |
2213 | int ret; | 2178 | int ret; |
2214 | 2179 | ||
2215 | btree = (struct nilfs_btree *)bmap; | 2180 | ret = nilfs_dat_move(nilfs_bmap_get_dat(bmap), (*bh)->b_blocknr, |
2216 | ret = nilfs_bmap_move_v(bmap, (*bh)->b_blocknr, blocknr); | 2181 | blocknr); |
2217 | if (ret < 0) | 2182 | if (ret < 0) |
2218 | return ret; | 2183 | return ret; |
2219 | 2184 | ||
2220 | if (buffer_nilfs_node(*bh)) { | 2185 | if (buffer_nilfs_node(*bh)) { |
2221 | node = (struct nilfs_btree_node *)(*bh)->b_data; | 2186 | node = (struct nilfs_btree_node *)(*bh)->b_data; |
2222 | key = nilfs_btree_node_get_key(btree, node, 0); | 2187 | key = nilfs_btree_node_get_key(node, 0); |
2223 | } else | 2188 | } else |
2224 | key = nilfs_bmap_data_get_key(bmap, *bh); | 2189 | key = nilfs_bmap_data_get_key(bmap, *bh); |
2225 | 2190 | ||
@@ -2239,10 +2204,10 @@ static int nilfs_btree_mark(struct nilfs_bmap *bmap, __u64 key, int level) | |||
2239 | int ret; | 2204 | int ret; |
2240 | 2205 | ||
2241 | btree = (struct nilfs_btree *)bmap; | 2206 | btree = (struct nilfs_btree *)bmap; |
2242 | path = nilfs_btree_alloc_path(btree); | 2207 | path = nilfs_btree_alloc_path(); |
2243 | if (path == NULL) | 2208 | if (path == NULL) |
2244 | return -ENOMEM; | 2209 | return -ENOMEM; |
2245 | nilfs_btree_init_path(btree, path); | 2210 | nilfs_btree_init_path(path); |
2246 | 2211 | ||
2247 | ret = nilfs_btree_do_lookup(btree, path, key, &ptr, level + 1); | 2212 | ret = nilfs_btree_do_lookup(btree, path, key, &ptr, level + 1); |
2248 | if (ret < 0) { | 2213 | if (ret < 0) { |
@@ -2262,8 +2227,8 @@ static int nilfs_btree_mark(struct nilfs_bmap *bmap, __u64 key, int level) | |||
2262 | nilfs_bmap_set_dirty(&btree->bt_bmap); | 2227 | nilfs_bmap_set_dirty(&btree->bt_bmap); |
2263 | 2228 | ||
2264 | out: | 2229 | out: |
2265 | nilfs_btree_clear_path(btree, path); | 2230 | nilfs_btree_release_path(path); |
2266 | nilfs_btree_free_path(btree, path); | 2231 | nilfs_btree_free_path(path); |
2267 | return ret; | 2232 | return ret; |
2268 | } | 2233 | } |
2269 | 2234 | ||