2 * btree.c - NILFS B-tree.
4 * Copyright (C) 2005-2008 Nippon Telegraph and Telephone Corporation.
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20 * Written by Koji Sato <koji@osrg.net>.
23 #include <linux/slab.h>
24 #include <linux/string.h>
25 #include <linux/errno.h>
26 #include <linux/pagevec.h>
35 * struct nilfs_btree_path - A path on which B-tree operations are executed
36 * @bp_bh: buffer head of node block
37 * @bp_sib_bh: buffer head of sibling node block
38 * @bp_index: index of child node
39 * @bp_oldreq: ptr end request for old ptr
40 * @bp_newreq: ptr alloc request for new ptr
41 * @bp_op: rebalance operation
43 struct nilfs_btree_path
{
44 struct buffer_head
*bp_bh
;
45 struct buffer_head
*bp_sib_bh
;
47 union nilfs_bmap_ptr_req bp_oldreq
;
48 union nilfs_bmap_ptr_req bp_newreq
;
49 struct nilfs_btnode_chkey_ctxt bp_ctxt
;
50 void (*bp_op
)(struct nilfs_btree
*, struct nilfs_btree_path
*,
51 int, __u64
*, __u64
*);
55 * B-tree path operations
58 static struct kmem_cache
*nilfs_btree_path_cache
;
60 int __init
nilfs_btree_path_cache_init(void)
62 nilfs_btree_path_cache
=
63 kmem_cache_create("nilfs2_btree_path_cache",
64 sizeof(struct nilfs_btree_path
) *
65 NILFS_BTREE_LEVEL_MAX
, 0, 0, NULL
);
66 return (nilfs_btree_path_cache
!= NULL
) ? 0 : -ENOMEM
;
69 void nilfs_btree_path_cache_destroy(void)
71 kmem_cache_destroy(nilfs_btree_path_cache
);
74 static inline struct nilfs_btree_path
*nilfs_btree_alloc_path(void)
76 return kmem_cache_alloc(nilfs_btree_path_cache
, GFP_NOFS
);
79 static inline void nilfs_btree_free_path(struct nilfs_btree_path
*path
)
81 kmem_cache_free(nilfs_btree_path_cache
, path
);
84 static void nilfs_btree_init_path(struct nilfs_btree_path
*path
)
88 for (level
= NILFS_BTREE_LEVEL_DATA
;
89 level
< NILFS_BTREE_LEVEL_MAX
;
91 path
[level
].bp_bh
= NULL
;
92 path
[level
].bp_sib_bh
= NULL
;
93 path
[level
].bp_index
= 0;
94 path
[level
].bp_oldreq
.bpr_ptr
= NILFS_BMAP_INVALID_PTR
;
95 path
[level
].bp_newreq
.bpr_ptr
= NILFS_BMAP_INVALID_PTR
;
96 path
[level
].bp_op
= NULL
;
100 static void nilfs_btree_release_path(struct nilfs_btree_path
*path
)
104 for (level
= NILFS_BTREE_LEVEL_DATA
; level
< NILFS_BTREE_LEVEL_MAX
;
106 brelse(path
[level
].bp_bh
);
110 * B-tree node operations
112 static int nilfs_btree_get_block(const struct nilfs_btree
*btree
, __u64 ptr
,
113 struct buffer_head
**bhp
)
115 struct address_space
*btnc
=
116 &NILFS_BMAP_I((struct nilfs_bmap
*)btree
)->i_btnode_cache
;
117 return nilfs_btnode_get(btnc
, ptr
, 0, bhp
, 0);
120 static int nilfs_btree_get_new_block(const struct nilfs_btree
*btree
,
121 __u64 ptr
, struct buffer_head
**bhp
)
123 struct address_space
*btnc
=
124 &NILFS_BMAP_I((struct nilfs_bmap
*)btree
)->i_btnode_cache
;
127 ret
= nilfs_btnode_get(btnc
, ptr
, 0, bhp
, 1);
129 set_buffer_nilfs_volatile(*bhp
);
134 nilfs_btree_node_get_flags(const struct nilfs_btree_node
*node
)
136 return node
->bn_flags
;
140 nilfs_btree_node_set_flags(struct nilfs_btree_node
*node
, int flags
)
142 node
->bn_flags
= flags
;
145 static inline int nilfs_btree_node_root(const struct nilfs_btree_node
*node
)
147 return nilfs_btree_node_get_flags(node
) & NILFS_BTREE_NODE_ROOT
;
151 nilfs_btree_node_get_level(const struct nilfs_btree_node
*node
)
153 return node
->bn_level
;
157 nilfs_btree_node_set_level(struct nilfs_btree_node
*node
, int level
)
159 node
->bn_level
= level
;
163 nilfs_btree_node_get_nchildren(const struct nilfs_btree_node
*node
)
165 return le16_to_cpu(node
->bn_nchildren
);
169 nilfs_btree_node_set_nchildren(struct nilfs_btree_node
*node
, int nchildren
)
171 node
->bn_nchildren
= cpu_to_le16(nchildren
);
174 static inline int nilfs_btree_node_size(const struct nilfs_btree
*btree
)
176 return 1 << btree
->bt_bmap
.b_inode
->i_blkbits
;
180 nilfs_btree_node_nchildren_min(const struct nilfs_btree_node
*node
,
181 const struct nilfs_btree
*btree
)
183 return nilfs_btree_node_root(node
) ?
184 NILFS_BTREE_ROOT_NCHILDREN_MIN
:
185 NILFS_BTREE_NODE_NCHILDREN_MIN(nilfs_btree_node_size(btree
));
189 nilfs_btree_node_nchildren_max(const struct nilfs_btree_node
*node
,
190 const struct nilfs_btree
*btree
)
192 return nilfs_btree_node_root(node
) ?
193 NILFS_BTREE_ROOT_NCHILDREN_MAX
:
194 NILFS_BTREE_NODE_NCHILDREN_MAX(nilfs_btree_node_size(btree
));
197 static inline __le64
*
198 nilfs_btree_node_dkeys(const struct nilfs_btree_node
*node
)
200 return (__le64
*)((char *)(node
+ 1) +
201 (nilfs_btree_node_root(node
) ?
202 0 : NILFS_BTREE_NODE_EXTRA_PAD_SIZE
));
205 static inline __le64
*
206 nilfs_btree_node_dptrs(const struct nilfs_btree_node
*node
,
207 const struct nilfs_btree
*btree
)
209 return (__le64
*)(nilfs_btree_node_dkeys(node
) +
210 nilfs_btree_node_nchildren_max(node
, btree
));
214 nilfs_btree_node_get_key(const struct nilfs_btree_node
*node
, int index
)
216 return nilfs_bmap_dkey_to_key(*(nilfs_btree_node_dkeys(node
) + index
));
220 nilfs_btree_node_set_key(struct nilfs_btree_node
*node
, int index
, __u64 key
)
222 *(nilfs_btree_node_dkeys(node
) + index
) = nilfs_bmap_key_to_dkey(key
);
226 nilfs_btree_node_get_ptr(const struct nilfs_btree
*btree
,
227 const struct nilfs_btree_node
*node
, int index
)
229 return nilfs_bmap_dptr_to_ptr(*(nilfs_btree_node_dptrs(node
, btree
) +
234 nilfs_btree_node_set_ptr(struct nilfs_btree
*btree
,
235 struct nilfs_btree_node
*node
, int index
, __u64 ptr
)
237 *(nilfs_btree_node_dptrs(node
, btree
) + index
) =
238 nilfs_bmap_ptr_to_dptr(ptr
);
241 static void nilfs_btree_node_init(struct nilfs_btree
*btree
,
242 struct nilfs_btree_node
*node
,
243 int flags
, int level
, int nchildren
,
244 const __u64
*keys
, const __u64
*ptrs
)
250 nilfs_btree_node_set_flags(node
, flags
);
251 nilfs_btree_node_set_level(node
, level
);
252 nilfs_btree_node_set_nchildren(node
, nchildren
);
254 dkeys
= nilfs_btree_node_dkeys(node
);
255 dptrs
= nilfs_btree_node_dptrs(node
, btree
);
256 for (i
= 0; i
< nchildren
; i
++) {
257 dkeys
[i
] = nilfs_bmap_key_to_dkey(keys
[i
]);
258 dptrs
[i
] = nilfs_bmap_ptr_to_dptr(ptrs
[i
]);
262 /* Assume the buffer heads corresponding to left and right are locked. */
263 static void nilfs_btree_node_move_left(struct nilfs_btree
*btree
,
264 struct nilfs_btree_node
*left
,
265 struct nilfs_btree_node
*right
,
268 __le64
*ldkeys
, *rdkeys
;
269 __le64
*ldptrs
, *rdptrs
;
270 int lnchildren
, rnchildren
;
272 ldkeys
= nilfs_btree_node_dkeys(left
);
273 ldptrs
= nilfs_btree_node_dptrs(left
, btree
);
274 lnchildren
= nilfs_btree_node_get_nchildren(left
);
276 rdkeys
= nilfs_btree_node_dkeys(right
);
277 rdptrs
= nilfs_btree_node_dptrs(right
, btree
);
278 rnchildren
= nilfs_btree_node_get_nchildren(right
);
280 memcpy(ldkeys
+ lnchildren
, rdkeys
, n
* sizeof(*rdkeys
));
281 memcpy(ldptrs
+ lnchildren
, rdptrs
, n
* sizeof(*rdptrs
));
282 memmove(rdkeys
, rdkeys
+ n
, (rnchildren
- n
) * sizeof(*rdkeys
));
283 memmove(rdptrs
, rdptrs
+ n
, (rnchildren
- n
) * sizeof(*rdptrs
));
287 nilfs_btree_node_set_nchildren(left
, lnchildren
);
288 nilfs_btree_node_set_nchildren(right
, rnchildren
);
291 /* Assume that the buffer heads corresponding to left and right are locked. */
292 static void nilfs_btree_node_move_right(struct nilfs_btree
*btree
,
293 struct nilfs_btree_node
*left
,
294 struct nilfs_btree_node
*right
,
297 __le64
*ldkeys
, *rdkeys
;
298 __le64
*ldptrs
, *rdptrs
;
299 int lnchildren
, rnchildren
;
301 ldkeys
= nilfs_btree_node_dkeys(left
);
302 ldptrs
= nilfs_btree_node_dptrs(left
, btree
);
303 lnchildren
= nilfs_btree_node_get_nchildren(left
);
305 rdkeys
= nilfs_btree_node_dkeys(right
);
306 rdptrs
= nilfs_btree_node_dptrs(right
, btree
);
307 rnchildren
= nilfs_btree_node_get_nchildren(right
);
309 memmove(rdkeys
+ n
, rdkeys
, rnchildren
* sizeof(*rdkeys
));
310 memmove(rdptrs
+ n
, rdptrs
, rnchildren
* sizeof(*rdptrs
));
311 memcpy(rdkeys
, ldkeys
+ lnchildren
- n
, n
* sizeof(*rdkeys
));
312 memcpy(rdptrs
, ldptrs
+ lnchildren
- n
, n
* sizeof(*rdptrs
));
316 nilfs_btree_node_set_nchildren(left
, lnchildren
);
317 nilfs_btree_node_set_nchildren(right
, rnchildren
);
320 /* Assume that the buffer head corresponding to node is locked. */
321 static void nilfs_btree_node_insert(struct nilfs_btree
*btree
,
322 struct nilfs_btree_node
*node
,
323 __u64 key
, __u64 ptr
, int index
)
329 dkeys
= nilfs_btree_node_dkeys(node
);
330 dptrs
= nilfs_btree_node_dptrs(node
, btree
);
331 nchildren
= nilfs_btree_node_get_nchildren(node
);
332 if (index
< nchildren
) {
333 memmove(dkeys
+ index
+ 1, dkeys
+ index
,
334 (nchildren
- index
) * sizeof(*dkeys
));
335 memmove(dptrs
+ index
+ 1, dptrs
+ index
,
336 (nchildren
- index
) * sizeof(*dptrs
));
338 dkeys
[index
] = nilfs_bmap_key_to_dkey(key
);
339 dptrs
[index
] = nilfs_bmap_ptr_to_dptr(ptr
);
341 nilfs_btree_node_set_nchildren(node
, nchildren
);
344 /* Assume that the buffer head corresponding to node is locked. */
345 static void nilfs_btree_node_delete(struct nilfs_btree
*btree
,
346 struct nilfs_btree_node
*node
,
347 __u64
*keyp
, __u64
*ptrp
, int index
)
355 dkeys
= nilfs_btree_node_dkeys(node
);
356 dptrs
= nilfs_btree_node_dptrs(node
, btree
);
357 key
= nilfs_bmap_dkey_to_key(dkeys
[index
]);
358 ptr
= nilfs_bmap_dptr_to_ptr(dptrs
[index
]);
359 nchildren
= nilfs_btree_node_get_nchildren(node
);
365 if (index
< nchildren
- 1) {
366 memmove(dkeys
+ index
, dkeys
+ index
+ 1,
367 (nchildren
- index
- 1) * sizeof(*dkeys
));
368 memmove(dptrs
+ index
, dptrs
+ index
+ 1,
369 (nchildren
- index
- 1) * sizeof(*dptrs
));
372 nilfs_btree_node_set_nchildren(node
, nchildren
);
375 static int nilfs_btree_node_lookup(const struct nilfs_btree_node
*node
,
376 __u64 key
, int *indexp
)
379 int index
, low
, high
, s
;
383 high
= nilfs_btree_node_get_nchildren(node
) - 1;
386 while (low
<= high
) {
387 index
= (low
+ high
) / 2;
388 nkey
= nilfs_btree_node_get_key(node
, index
);
392 } else if (nkey
< key
) {
402 if (nilfs_btree_node_get_level(node
) > NILFS_BTREE_LEVEL_NODE_MIN
) {
403 if (s
> 0 && index
> 0)
414 static inline struct nilfs_btree_node
*
415 nilfs_btree_get_root(const struct nilfs_btree
*btree
)
417 return (struct nilfs_btree_node
*)btree
->bt_bmap
.b_u
.u_data
;
420 static inline struct nilfs_btree_node
*
421 nilfs_btree_get_nonroot_node(const struct nilfs_btree_path
*path
, int level
)
423 return (struct nilfs_btree_node
*)path
[level
].bp_bh
->b_data
;
426 static inline struct nilfs_btree_node
*
427 nilfs_btree_get_sib_node(const struct nilfs_btree_path
*path
, int level
)
429 return (struct nilfs_btree_node
*)path
[level
].bp_sib_bh
->b_data
;
432 static inline int nilfs_btree_height(const struct nilfs_btree
*btree
)
434 return nilfs_btree_node_get_level(nilfs_btree_get_root(btree
)) + 1;
437 static inline struct nilfs_btree_node
*
438 nilfs_btree_get_node(const struct nilfs_btree
*btree
,
439 const struct nilfs_btree_path
*path
,
442 return (level
== nilfs_btree_height(btree
) - 1) ?
443 nilfs_btree_get_root(btree
) :
444 nilfs_btree_get_nonroot_node(path
, level
);
447 static int nilfs_btree_do_lookup(const struct nilfs_btree
*btree
,
448 struct nilfs_btree_path
*path
,
449 __u64 key
, __u64
*ptrp
, int minlevel
)
451 struct nilfs_btree_node
*node
;
453 int level
, index
, found
, ret
;
455 node
= nilfs_btree_get_root(btree
);
456 level
= nilfs_btree_node_get_level(node
);
457 if (level
< minlevel
|| nilfs_btree_node_get_nchildren(node
) <= 0)
460 found
= nilfs_btree_node_lookup(node
, key
, &index
);
461 ptr
= nilfs_btree_node_get_ptr(btree
, node
, index
);
462 path
[level
].bp_bh
= NULL
;
463 path
[level
].bp_index
= index
;
465 for (level
--; level
>= minlevel
; level
--) {
466 ret
= nilfs_btree_get_block(btree
, ptr
, &path
[level
].bp_bh
);
469 node
= nilfs_btree_get_nonroot_node(path
, level
);
470 BUG_ON(level
!= nilfs_btree_node_get_level(node
));
472 found
= nilfs_btree_node_lookup(node
, key
, &index
);
475 if (index
< nilfs_btree_node_nchildren_max(node
, btree
))
476 ptr
= nilfs_btree_node_get_ptr(btree
, node
, index
);
478 WARN_ON(found
|| level
!= NILFS_BTREE_LEVEL_NODE_MIN
);
480 ptr
= NILFS_BMAP_INVALID_PTR
;
482 path
[level
].bp_index
= index
;
493 static int nilfs_btree_do_lookup_last(const struct nilfs_btree
*btree
,
494 struct nilfs_btree_path
*path
,
495 __u64
*keyp
, __u64
*ptrp
)
497 struct nilfs_btree_node
*node
;
499 int index
, level
, ret
;
501 node
= nilfs_btree_get_root(btree
);
502 index
= nilfs_btree_node_get_nchildren(node
) - 1;
505 level
= nilfs_btree_node_get_level(node
);
506 ptr
= nilfs_btree_node_get_ptr(btree
, node
, index
);
507 path
[level
].bp_bh
= NULL
;
508 path
[level
].bp_index
= index
;
510 for (level
--; level
> 0; level
--) {
511 ret
= nilfs_btree_get_block(btree
, ptr
, &path
[level
].bp_bh
);
514 node
= nilfs_btree_get_nonroot_node(path
, level
);
515 BUG_ON(level
!= nilfs_btree_node_get_level(node
));
516 index
= nilfs_btree_node_get_nchildren(node
) - 1;
517 ptr
= nilfs_btree_node_get_ptr(btree
, node
, index
);
518 path
[level
].bp_index
= index
;
522 *keyp
= nilfs_btree_node_get_key(node
, index
);
529 static int nilfs_btree_lookup(const struct nilfs_bmap
*bmap
,
530 __u64 key
, int level
, __u64
*ptrp
)
532 struct nilfs_btree
*btree
;
533 struct nilfs_btree_path
*path
;
537 btree
= (struct nilfs_btree
*)bmap
;
538 path
= nilfs_btree_alloc_path();
541 nilfs_btree_init_path(path
);
543 ret
= nilfs_btree_do_lookup(btree
, path
, key
, &ptr
, level
);
548 nilfs_btree_release_path(path
);
549 nilfs_btree_free_path(path
);
554 static int nilfs_btree_lookup_contig(const struct nilfs_bmap
*bmap
,
555 __u64 key
, __u64
*ptrp
, unsigned maxblocks
)
557 struct nilfs_btree
*btree
= (struct nilfs_btree
*)bmap
;
558 struct nilfs_btree_path
*path
;
559 struct nilfs_btree_node
*node
;
560 struct inode
*dat
= NULL
;
563 int level
= NILFS_BTREE_LEVEL_NODE_MIN
;
564 int ret
, cnt
, index
, maxlevel
;
566 path
= nilfs_btree_alloc_path();
569 nilfs_btree_init_path(path
);
570 ret
= nilfs_btree_do_lookup(btree
, path
, key
, &ptr
, level
);
574 if (NILFS_BMAP_USE_VBN(bmap
)) {
575 dat
= nilfs_bmap_get_dat(bmap
);
576 ret
= nilfs_dat_translate(dat
, ptr
, &blocknr
);
582 if (cnt
== maxblocks
)
585 maxlevel
= nilfs_btree_height(btree
) - 1;
586 node
= nilfs_btree_get_node(btree
, path
, level
);
587 index
= path
[level
].bp_index
+ 1;
589 while (index
< nilfs_btree_node_get_nchildren(node
)) {
590 if (nilfs_btree_node_get_key(node
, index
) !=
593 ptr2
= nilfs_btree_node_get_ptr(btree
, node
, index
);
595 ret
= nilfs_dat_translate(dat
, ptr2
, &blocknr
);
600 if (ptr2
!= ptr
+ cnt
|| ++cnt
== maxblocks
)
605 if (level
== maxlevel
)
608 /* look-up right sibling node */
609 node
= nilfs_btree_get_node(btree
, path
, level
+ 1);
610 index
= path
[level
+ 1].bp_index
+ 1;
611 if (index
>= nilfs_btree_node_get_nchildren(node
) ||
612 nilfs_btree_node_get_key(node
, index
) != key
+ cnt
)
614 ptr2
= nilfs_btree_node_get_ptr(btree
, node
, index
);
615 path
[level
+ 1].bp_index
= index
;
617 brelse(path
[level
].bp_bh
);
618 path
[level
].bp_bh
= NULL
;
619 ret
= nilfs_btree_get_block(btree
, ptr2
, &path
[level
].bp_bh
);
622 node
= nilfs_btree_get_nonroot_node(path
, level
);
624 path
[level
].bp_index
= index
;
630 nilfs_btree_release_path(path
);
631 nilfs_btree_free_path(path
);
635 static void nilfs_btree_promote_key(struct nilfs_btree
*btree
,
636 struct nilfs_btree_path
*path
,
637 int level
, __u64 key
)
639 if (level
< nilfs_btree_height(btree
) - 1) {
641 lock_buffer(path
[level
].bp_bh
);
642 nilfs_btree_node_set_key(
643 nilfs_btree_get_nonroot_node(path
, level
),
644 path
[level
].bp_index
, key
);
645 if (!buffer_dirty(path
[level
].bp_bh
))
646 nilfs_btnode_mark_dirty(path
[level
].bp_bh
);
647 unlock_buffer(path
[level
].bp_bh
);
648 } while ((path
[level
].bp_index
== 0) &&
649 (++level
< nilfs_btree_height(btree
) - 1));
653 if (level
== nilfs_btree_height(btree
) - 1) {
654 nilfs_btree_node_set_key(nilfs_btree_get_root(btree
),
655 path
[level
].bp_index
, key
);
659 static void nilfs_btree_do_insert(struct nilfs_btree
*btree
,
660 struct nilfs_btree_path
*path
,
661 int level
, __u64
*keyp
, __u64
*ptrp
)
663 struct nilfs_btree_node
*node
;
665 if (level
< nilfs_btree_height(btree
) - 1) {
666 lock_buffer(path
[level
].bp_bh
);
667 node
= nilfs_btree_get_nonroot_node(path
, level
);
668 nilfs_btree_node_insert(btree
, node
, *keyp
, *ptrp
,
669 path
[level
].bp_index
);
670 if (!buffer_dirty(path
[level
].bp_bh
))
671 nilfs_btnode_mark_dirty(path
[level
].bp_bh
);
672 unlock_buffer(path
[level
].bp_bh
);
674 if (path
[level
].bp_index
== 0)
675 nilfs_btree_promote_key(btree
, path
, level
+ 1,
676 nilfs_btree_node_get_key(node
,
679 node
= nilfs_btree_get_root(btree
);
680 nilfs_btree_node_insert(btree
, node
, *keyp
, *ptrp
,
681 path
[level
].bp_index
);
685 static void nilfs_btree_carry_left(struct nilfs_btree
*btree
,
686 struct nilfs_btree_path
*path
,
687 int level
, __u64
*keyp
, __u64
*ptrp
)
689 struct nilfs_btree_node
*node
, *left
;
690 int nchildren
, lnchildren
, n
, move
;
692 lock_buffer(path
[level
].bp_bh
);
693 lock_buffer(path
[level
].bp_sib_bh
);
695 node
= nilfs_btree_get_nonroot_node(path
, level
);
696 left
= nilfs_btree_get_sib_node(path
, level
);
697 nchildren
= nilfs_btree_node_get_nchildren(node
);
698 lnchildren
= nilfs_btree_node_get_nchildren(left
);
701 n
= (nchildren
+ lnchildren
+ 1) / 2 - lnchildren
;
702 if (n
> path
[level
].bp_index
) {
703 /* move insert point */
708 nilfs_btree_node_move_left(btree
, left
, node
, n
);
710 if (!buffer_dirty(path
[level
].bp_bh
))
711 nilfs_btnode_mark_dirty(path
[level
].bp_bh
);
712 if (!buffer_dirty(path
[level
].bp_sib_bh
))
713 nilfs_btnode_mark_dirty(path
[level
].bp_sib_bh
);
715 unlock_buffer(path
[level
].bp_bh
);
716 unlock_buffer(path
[level
].bp_sib_bh
);
718 nilfs_btree_promote_key(btree
, path
, level
+ 1,
719 nilfs_btree_node_get_key(node
, 0));
722 brelse(path
[level
].bp_bh
);
723 path
[level
].bp_bh
= path
[level
].bp_sib_bh
;
724 path
[level
].bp_sib_bh
= NULL
;
725 path
[level
].bp_index
+= lnchildren
;
726 path
[level
+ 1].bp_index
--;
728 brelse(path
[level
].bp_sib_bh
);
729 path
[level
].bp_sib_bh
= NULL
;
730 path
[level
].bp_index
-= n
;
733 nilfs_btree_do_insert(btree
, path
, level
, keyp
, ptrp
);
736 static void nilfs_btree_carry_right(struct nilfs_btree
*btree
,
737 struct nilfs_btree_path
*path
,
738 int level
, __u64
*keyp
, __u64
*ptrp
)
740 struct nilfs_btree_node
*node
, *right
;
741 int nchildren
, rnchildren
, n
, move
;
743 lock_buffer(path
[level
].bp_bh
);
744 lock_buffer(path
[level
].bp_sib_bh
);
746 node
= nilfs_btree_get_nonroot_node(path
, level
);
747 right
= nilfs_btree_get_sib_node(path
, level
);
748 nchildren
= nilfs_btree_node_get_nchildren(node
);
749 rnchildren
= nilfs_btree_node_get_nchildren(right
);
752 n
= (nchildren
+ rnchildren
+ 1) / 2 - rnchildren
;
753 if (n
> nchildren
- path
[level
].bp_index
) {
754 /* move insert point */
759 nilfs_btree_node_move_right(btree
, node
, right
, n
);
761 if (!buffer_dirty(path
[level
].bp_bh
))
762 nilfs_btnode_mark_dirty(path
[level
].bp_bh
);
763 if (!buffer_dirty(path
[level
].bp_sib_bh
))
764 nilfs_btnode_mark_dirty(path
[level
].bp_sib_bh
);
766 unlock_buffer(path
[level
].bp_bh
);
767 unlock_buffer(path
[level
].bp_sib_bh
);
769 path
[level
+ 1].bp_index
++;
770 nilfs_btree_promote_key(btree
, path
, level
+ 1,
771 nilfs_btree_node_get_key(right
, 0));
772 path
[level
+ 1].bp_index
--;
775 brelse(path
[level
].bp_bh
);
776 path
[level
].bp_bh
= path
[level
].bp_sib_bh
;
777 path
[level
].bp_sib_bh
= NULL
;
778 path
[level
].bp_index
-= nilfs_btree_node_get_nchildren(node
);
779 path
[level
+ 1].bp_index
++;
781 brelse(path
[level
].bp_sib_bh
);
782 path
[level
].bp_sib_bh
= NULL
;
785 nilfs_btree_do_insert(btree
, path
, level
, keyp
, ptrp
);
788 static void nilfs_btree_split(struct nilfs_btree
*btree
,
789 struct nilfs_btree_path
*path
,
790 int level
, __u64
*keyp
, __u64
*ptrp
)
792 struct nilfs_btree_node
*node
, *right
;
795 int nchildren
, n
, move
;
797 lock_buffer(path
[level
].bp_bh
);
798 lock_buffer(path
[level
].bp_sib_bh
);
800 node
= nilfs_btree_get_nonroot_node(path
, level
);
801 right
= nilfs_btree_get_sib_node(path
, level
);
802 nchildren
= nilfs_btree_node_get_nchildren(node
);
805 n
= (nchildren
+ 1) / 2;
806 if (n
> nchildren
- path
[level
].bp_index
) {
811 nilfs_btree_node_move_right(btree
, node
, right
, n
);
813 if (!buffer_dirty(path
[level
].bp_bh
))
814 nilfs_btnode_mark_dirty(path
[level
].bp_bh
);
815 if (!buffer_dirty(path
[level
].bp_sib_bh
))
816 nilfs_btnode_mark_dirty(path
[level
].bp_sib_bh
);
818 unlock_buffer(path
[level
].bp_bh
);
819 unlock_buffer(path
[level
].bp_sib_bh
);
821 newkey
= nilfs_btree_node_get_key(right
, 0);
822 newptr
= path
[level
].bp_newreq
.bpr_ptr
;
825 path
[level
].bp_index
-= nilfs_btree_node_get_nchildren(node
);
826 nilfs_btree_node_insert(btree
, right
, *keyp
, *ptrp
,
827 path
[level
].bp_index
);
829 *keyp
= nilfs_btree_node_get_key(right
, 0);
830 *ptrp
= path
[level
].bp_newreq
.bpr_ptr
;
832 brelse(path
[level
].bp_bh
);
833 path
[level
].bp_bh
= path
[level
].bp_sib_bh
;
834 path
[level
].bp_sib_bh
= NULL
;
836 nilfs_btree_do_insert(btree
, path
, level
, keyp
, ptrp
);
838 *keyp
= nilfs_btree_node_get_key(right
, 0);
839 *ptrp
= path
[level
].bp_newreq
.bpr_ptr
;
841 brelse(path
[level
].bp_sib_bh
);
842 path
[level
].bp_sib_bh
= NULL
;
845 path
[level
+ 1].bp_index
++;
848 static void nilfs_btree_grow(struct nilfs_btree
*btree
,
849 struct nilfs_btree_path
*path
,
850 int level
, __u64
*keyp
, __u64
*ptrp
)
852 struct nilfs_btree_node
*root
, *child
;
855 lock_buffer(path
[level
].bp_sib_bh
);
857 root
= nilfs_btree_get_root(btree
);
858 child
= nilfs_btree_get_sib_node(path
, level
);
860 n
= nilfs_btree_node_get_nchildren(root
);
862 nilfs_btree_node_move_right(btree
, root
, child
, n
);
863 nilfs_btree_node_set_level(root
, level
+ 1);
865 if (!buffer_dirty(path
[level
].bp_sib_bh
))
866 nilfs_btnode_mark_dirty(path
[level
].bp_sib_bh
);
868 unlock_buffer(path
[level
].bp_sib_bh
);
870 path
[level
].bp_bh
= path
[level
].bp_sib_bh
;
871 path
[level
].bp_sib_bh
= NULL
;
873 nilfs_btree_do_insert(btree
, path
, level
, keyp
, ptrp
);
875 *keyp
= nilfs_btree_node_get_key(child
, 0);
876 *ptrp
= path
[level
].bp_newreq
.bpr_ptr
;
879 static __u64
nilfs_btree_find_near(const struct nilfs_btree
*btree
,
880 const struct nilfs_btree_path
*path
)
882 struct nilfs_btree_node
*node
;
886 return NILFS_BMAP_INVALID_PTR
;
889 level
= NILFS_BTREE_LEVEL_NODE_MIN
;
890 if (path
[level
].bp_index
> 0) {
891 node
= nilfs_btree_get_node(btree
, path
, level
);
892 return nilfs_btree_node_get_ptr(btree
, node
,
893 path
[level
].bp_index
- 1);
897 level
= NILFS_BTREE_LEVEL_NODE_MIN
+ 1;
898 if (level
<= nilfs_btree_height(btree
) - 1) {
899 node
= nilfs_btree_get_node(btree
, path
, level
);
900 return nilfs_btree_node_get_ptr(btree
, node
,
901 path
[level
].bp_index
);
904 return NILFS_BMAP_INVALID_PTR
;
907 static __u64
nilfs_btree_find_target_v(const struct nilfs_btree
*btree
,
908 const struct nilfs_btree_path
*path
,
913 ptr
= nilfs_bmap_find_target_seq(&btree
->bt_bmap
, key
);
914 if (ptr
!= NILFS_BMAP_INVALID_PTR
)
915 /* sequential access */
918 ptr
= nilfs_btree_find_near(btree
, path
);
919 if (ptr
!= NILFS_BMAP_INVALID_PTR
)
924 return nilfs_bmap_find_target_in_group(&btree
->bt_bmap
);
927 static void nilfs_btree_set_target_v(struct nilfs_btree
*btree
, __u64 key
,
930 btree
->bt_bmap
.b_last_allocated_key
= key
;
931 btree
->bt_bmap
.b_last_allocated_ptr
= ptr
;
934 static int nilfs_btree_prepare_insert(struct nilfs_btree
*btree
,
935 struct nilfs_btree_path
*path
,
936 int *levelp
, __u64 key
, __u64 ptr
,
937 struct nilfs_bmap_stats
*stats
)
939 struct buffer_head
*bh
;
940 struct nilfs_btree_node
*node
, *parent
, *sib
;
942 int pindex
, level
, ret
;
944 stats
->bs_nblocks
= 0;
945 level
= NILFS_BTREE_LEVEL_DATA
;
947 /* allocate a new ptr for data block */
948 if (NILFS_BMAP_USE_VBN(&btree
->bt_bmap
))
949 path
[level
].bp_newreq
.bpr_ptr
=
950 nilfs_btree_find_target_v(btree
, path
, key
);
952 ret
= nilfs_bmap_prepare_alloc_ptr(&btree
->bt_bmap
,
953 &path
[level
].bp_newreq
);
957 for (level
= NILFS_BTREE_LEVEL_NODE_MIN
;
958 level
< nilfs_btree_height(btree
) - 1;
960 node
= nilfs_btree_get_nonroot_node(path
, level
);
961 if (nilfs_btree_node_get_nchildren(node
) <
962 nilfs_btree_node_nchildren_max(node
, btree
)) {
963 path
[level
].bp_op
= nilfs_btree_do_insert
;
968 parent
= nilfs_btree_get_node(btree
, path
, level
+ 1);
969 pindex
= path
[level
+ 1].bp_index
;
973 sibptr
= nilfs_btree_node_get_ptr(btree
, parent
,
975 ret
= nilfs_btree_get_block(btree
, sibptr
, &bh
);
977 goto err_out_child_node
;
978 sib
= (struct nilfs_btree_node
*)bh
->b_data
;
979 if (nilfs_btree_node_get_nchildren(sib
) <
980 nilfs_btree_node_nchildren_max(sib
, btree
)) {
981 path
[level
].bp_sib_bh
= bh
;
982 path
[level
].bp_op
= nilfs_btree_carry_left
;
991 nilfs_btree_node_get_nchildren(parent
) - 1) {
992 sibptr
= nilfs_btree_node_get_ptr(btree
, parent
,
994 ret
= nilfs_btree_get_block(btree
, sibptr
, &bh
);
996 goto err_out_child_node
;
997 sib
= (struct nilfs_btree_node
*)bh
->b_data
;
998 if (nilfs_btree_node_get_nchildren(sib
) <
999 nilfs_btree_node_nchildren_max(sib
, btree
)) {
1000 path
[level
].bp_sib_bh
= bh
;
1001 path
[level
].bp_op
= nilfs_btree_carry_right
;
1002 stats
->bs_nblocks
++;
1009 path
[level
].bp_newreq
.bpr_ptr
=
1010 path
[level
- 1].bp_newreq
.bpr_ptr
+ 1;
1011 ret
= nilfs_bmap_prepare_alloc_ptr(&btree
->bt_bmap
,
1012 &path
[level
].bp_newreq
);
1014 goto err_out_child_node
;
1015 ret
= nilfs_btree_get_new_block(btree
,
1016 path
[level
].bp_newreq
.bpr_ptr
,
1019 goto err_out_curr_node
;
1021 stats
->bs_nblocks
++;
1024 nilfs_btree_node_init(btree
,
1025 (struct nilfs_btree_node
*)bh
->b_data
,
1026 0, level
, 0, NULL
, NULL
);
1028 path
[level
].bp_sib_bh
= bh
;
1029 path
[level
].bp_op
= nilfs_btree_split
;
1033 node
= nilfs_btree_get_root(btree
);
1034 if (nilfs_btree_node_get_nchildren(node
) <
1035 nilfs_btree_node_nchildren_max(node
, btree
)) {
1036 path
[level
].bp_op
= nilfs_btree_do_insert
;
1037 stats
->bs_nblocks
++;
1042 path
[level
].bp_newreq
.bpr_ptr
= path
[level
- 1].bp_newreq
.bpr_ptr
+ 1;
1043 ret
= nilfs_bmap_prepare_alloc_ptr(&btree
->bt_bmap
,
1044 &path
[level
].bp_newreq
);
1046 goto err_out_child_node
;
1047 ret
= nilfs_btree_get_new_block(btree
, path
[level
].bp_newreq
.bpr_ptr
,
1050 goto err_out_curr_node
;
1053 nilfs_btree_node_init(btree
, (struct nilfs_btree_node
*)bh
->b_data
,
1054 0, level
, 0, NULL
, NULL
);
1056 path
[level
].bp_sib_bh
= bh
;
1057 path
[level
].bp_op
= nilfs_btree_grow
;
1060 path
[level
].bp_op
= nilfs_btree_do_insert
;
1062 /* a newly-created node block and a data block are added */
1063 stats
->bs_nblocks
+= 2;
1072 nilfs_bmap_abort_alloc_ptr(&btree
->bt_bmap
, &path
[level
].bp_newreq
);
1074 for (level
--; level
> NILFS_BTREE_LEVEL_DATA
; level
--) {
1075 nilfs_btnode_delete(path
[level
].bp_sib_bh
);
1076 nilfs_bmap_abort_alloc_ptr(&btree
->bt_bmap
,
1077 &path
[level
].bp_newreq
);
1081 nilfs_bmap_abort_alloc_ptr(&btree
->bt_bmap
, &path
[level
].bp_newreq
);
1084 stats
->bs_nblocks
= 0;
1088 static void nilfs_btree_commit_insert(struct nilfs_btree
*btree
,
1089 struct nilfs_btree_path
*path
,
1090 int maxlevel
, __u64 key
, __u64 ptr
)
1094 set_buffer_nilfs_volatile((struct buffer_head
*)((unsigned long)ptr
));
1095 ptr
= path
[NILFS_BTREE_LEVEL_DATA
].bp_newreq
.bpr_ptr
;
1096 if (NILFS_BMAP_USE_VBN(&btree
->bt_bmap
))
1097 nilfs_btree_set_target_v(btree
, key
, ptr
);
1099 for (level
= NILFS_BTREE_LEVEL_NODE_MIN
; level
<= maxlevel
; level
++) {
1100 nilfs_bmap_commit_alloc_ptr(&btree
->bt_bmap
,
1101 &path
[level
- 1].bp_newreq
);
1102 path
[level
].bp_op(btree
, path
, level
, &key
, &ptr
);
1105 if (!nilfs_bmap_dirty(&btree
->bt_bmap
))
1106 nilfs_bmap_set_dirty(&btree
->bt_bmap
);
1109 static int nilfs_btree_insert(struct nilfs_bmap
*bmap
, __u64 key
, __u64 ptr
)
1111 struct nilfs_btree
*btree
;
1112 struct nilfs_btree_path
*path
;
1113 struct nilfs_bmap_stats stats
;
1116 btree
= (struct nilfs_btree
*)bmap
;
1117 path
= nilfs_btree_alloc_path();
1120 nilfs_btree_init_path(path
);
1122 ret
= nilfs_btree_do_lookup(btree
, path
, key
, NULL
,
1123 NILFS_BTREE_LEVEL_NODE_MIN
);
1124 if (ret
!= -ENOENT
) {
1130 ret
= nilfs_btree_prepare_insert(btree
, path
, &level
, key
, ptr
, &stats
);
1133 nilfs_btree_commit_insert(btree
, path
, level
, key
, ptr
);
1134 nilfs_bmap_add_blocks(bmap
, stats
.bs_nblocks
);
1137 nilfs_btree_release_path(path
);
1138 nilfs_btree_free_path(path
);
1142 static void nilfs_btree_do_delete(struct nilfs_btree
*btree
,
1143 struct nilfs_btree_path
*path
,
1144 int level
, __u64
*keyp
, __u64
*ptrp
)
1146 struct nilfs_btree_node
*node
;
1148 if (level
< nilfs_btree_height(btree
) - 1) {
1149 lock_buffer(path
[level
].bp_bh
);
1150 node
= nilfs_btree_get_nonroot_node(path
, level
);
1151 nilfs_btree_node_delete(btree
, node
, keyp
, ptrp
,
1152 path
[level
].bp_index
);
1153 if (!buffer_dirty(path
[level
].bp_bh
))
1154 nilfs_btnode_mark_dirty(path
[level
].bp_bh
);
1155 unlock_buffer(path
[level
].bp_bh
);
1156 if (path
[level
].bp_index
== 0)
1157 nilfs_btree_promote_key(btree
, path
, level
+ 1,
1158 nilfs_btree_node_get_key(node
, 0));
1160 node
= nilfs_btree_get_root(btree
);
1161 nilfs_btree_node_delete(btree
, node
, keyp
, ptrp
,
1162 path
[level
].bp_index
);
1166 static void nilfs_btree_borrow_left(struct nilfs_btree
*btree
,
1167 struct nilfs_btree_path
*path
,
1168 int level
, __u64
*keyp
, __u64
*ptrp
)
1170 struct nilfs_btree_node
*node
, *left
;
1171 int nchildren
, lnchildren
, n
;
1173 nilfs_btree_do_delete(btree
, path
, level
, keyp
, ptrp
);
1175 lock_buffer(path
[level
].bp_bh
);
1176 lock_buffer(path
[level
].bp_sib_bh
);
1178 node
= nilfs_btree_get_nonroot_node(path
, level
);
1179 left
= nilfs_btree_get_sib_node(path
, level
);
1180 nchildren
= nilfs_btree_node_get_nchildren(node
);
1181 lnchildren
= nilfs_btree_node_get_nchildren(left
);
1183 n
= (nchildren
+ lnchildren
) / 2 - nchildren
;
1185 nilfs_btree_node_move_right(btree
, left
, node
, n
);
1187 if (!buffer_dirty(path
[level
].bp_bh
))
1188 nilfs_btnode_mark_dirty(path
[level
].bp_bh
);
1189 if (!buffer_dirty(path
[level
].bp_sib_bh
))
1190 nilfs_btnode_mark_dirty(path
[level
].bp_sib_bh
);
1192 unlock_buffer(path
[level
].bp_bh
);
1193 unlock_buffer(path
[level
].bp_sib_bh
);
1195 nilfs_btree_promote_key(btree
, path
, level
+ 1,
1196 nilfs_btree_node_get_key(node
, 0));
1198 brelse(path
[level
].bp_sib_bh
);
1199 path
[level
].bp_sib_bh
= NULL
;
1200 path
[level
].bp_index
+= n
;
1203 static void nilfs_btree_borrow_right(struct nilfs_btree
*btree
,
1204 struct nilfs_btree_path
*path
,
1205 int level
, __u64
*keyp
, __u64
*ptrp
)
1207 struct nilfs_btree_node
*node
, *right
;
1208 int nchildren
, rnchildren
, n
;
1210 nilfs_btree_do_delete(btree
, path
, level
, keyp
, ptrp
);
1212 lock_buffer(path
[level
].bp_bh
);
1213 lock_buffer(path
[level
].bp_sib_bh
);
1215 node
= nilfs_btree_get_nonroot_node(path
, level
);
1216 right
= nilfs_btree_get_sib_node(path
, level
);
1217 nchildren
= nilfs_btree_node_get_nchildren(node
);
1218 rnchildren
= nilfs_btree_node_get_nchildren(right
);
1220 n
= (nchildren
+ rnchildren
) / 2 - nchildren
;
1222 nilfs_btree_node_move_left(btree
, node
, right
, n
);
1224 if (!buffer_dirty(path
[level
].bp_bh
))
1225 nilfs_btnode_mark_dirty(path
[level
].bp_bh
);
1226 if (!buffer_dirty(path
[level
].bp_sib_bh
))
1227 nilfs_btnode_mark_dirty(path
[level
].bp_sib_bh
);
1229 unlock_buffer(path
[level
].bp_bh
);
1230 unlock_buffer(path
[level
].bp_sib_bh
);
1232 path
[level
+ 1].bp_index
++;
1233 nilfs_btree_promote_key(btree
, path
, level
+ 1,
1234 nilfs_btree_node_get_key(right
, 0));
1235 path
[level
+ 1].bp_index
--;
1237 brelse(path
[level
].bp_sib_bh
);
1238 path
[level
].bp_sib_bh
= NULL
;
1241 static void nilfs_btree_concat_left(struct nilfs_btree
*btree
,
1242 struct nilfs_btree_path
*path
,
1243 int level
, __u64
*keyp
, __u64
*ptrp
)
1245 struct nilfs_btree_node
*node
, *left
;
1248 nilfs_btree_do_delete(btree
, path
, level
, keyp
, ptrp
);
1250 lock_buffer(path
[level
].bp_bh
);
1251 lock_buffer(path
[level
].bp_sib_bh
);
1253 node
= nilfs_btree_get_nonroot_node(path
, level
);
1254 left
= nilfs_btree_get_sib_node(path
, level
);
1256 n
= nilfs_btree_node_get_nchildren(node
);
1258 nilfs_btree_node_move_left(btree
, left
, node
, n
);
1260 if (!buffer_dirty(path
[level
].bp_sib_bh
))
1261 nilfs_btnode_mark_dirty(path
[level
].bp_sib_bh
);
1263 unlock_buffer(path
[level
].bp_bh
);
1264 unlock_buffer(path
[level
].bp_sib_bh
);
1266 nilfs_btnode_delete(path
[level
].bp_bh
);
1267 path
[level
].bp_bh
= path
[level
].bp_sib_bh
;
1268 path
[level
].bp_sib_bh
= NULL
;
1269 path
[level
].bp_index
+= nilfs_btree_node_get_nchildren(left
);
1272 static void nilfs_btree_concat_right(struct nilfs_btree
*btree
,
1273 struct nilfs_btree_path
*path
,
1274 int level
, __u64
*keyp
, __u64
*ptrp
)
1276 struct nilfs_btree_node
*node
, *right
;
1279 nilfs_btree_do_delete(btree
, path
, level
, keyp
, ptrp
);
1281 lock_buffer(path
[level
].bp_bh
);
1282 lock_buffer(path
[level
].bp_sib_bh
);
1284 node
= nilfs_btree_get_nonroot_node(path
, level
);
1285 right
= nilfs_btree_get_sib_node(path
, level
);
1287 n
= nilfs_btree_node_get_nchildren(right
);
1289 nilfs_btree_node_move_left(btree
, node
, right
, n
);
1291 if (!buffer_dirty(path
[level
].bp_bh
))
1292 nilfs_btnode_mark_dirty(path
[level
].bp_bh
);
1294 unlock_buffer(path
[level
].bp_bh
);
1295 unlock_buffer(path
[level
].bp_sib_bh
);
1297 nilfs_btnode_delete(path
[level
].bp_sib_bh
);
1298 path
[level
].bp_sib_bh
= NULL
;
1299 path
[level
+ 1].bp_index
++;
1302 static void nilfs_btree_shrink(struct nilfs_btree
*btree
,
1303 struct nilfs_btree_path
*path
,
1304 int level
, __u64
*keyp
, __u64
*ptrp
)
1306 struct nilfs_btree_node
*root
, *child
;
1309 nilfs_btree_do_delete(btree
, path
, level
, keyp
, ptrp
);
1311 lock_buffer(path
[level
].bp_bh
);
1312 root
= nilfs_btree_get_root(btree
);
1313 child
= nilfs_btree_get_nonroot_node(path
, level
);
1315 nilfs_btree_node_delete(btree
, root
, NULL
, NULL
, 0);
1316 nilfs_btree_node_set_level(root
, level
);
1317 n
= nilfs_btree_node_get_nchildren(child
);
1318 nilfs_btree_node_move_left(btree
, root
, child
, n
);
1319 unlock_buffer(path
[level
].bp_bh
);
1321 nilfs_btnode_delete(path
[level
].bp_bh
);
1322 path
[level
].bp_bh
= NULL
;
1326 static int nilfs_btree_prepare_delete(struct nilfs_btree
*btree
,
1327 struct nilfs_btree_path
*path
,
1329 struct nilfs_bmap_stats
*stats
)
1331 struct buffer_head
*bh
;
1332 struct nilfs_btree_node
*node
, *parent
, *sib
;
1334 int pindex
, level
, ret
;
1337 stats
->bs_nblocks
= 0;
1338 for (level
= NILFS_BTREE_LEVEL_NODE_MIN
;
1339 level
< nilfs_btree_height(btree
) - 1;
1341 node
= nilfs_btree_get_nonroot_node(path
, level
);
1342 path
[level
].bp_oldreq
.bpr_ptr
=
1343 nilfs_btree_node_get_ptr(btree
, node
,
1344 path
[level
].bp_index
);
1345 ret
= nilfs_bmap_prepare_end_ptr(&btree
->bt_bmap
,
1346 &path
[level
].bp_oldreq
);
1348 goto err_out_child_node
;
1350 if (nilfs_btree_node_get_nchildren(node
) >
1351 nilfs_btree_node_nchildren_min(node
, btree
)) {
1352 path
[level
].bp_op
= nilfs_btree_do_delete
;
1353 stats
->bs_nblocks
++;
1357 parent
= nilfs_btree_get_node(btree
, path
, level
+ 1);
1358 pindex
= path
[level
+ 1].bp_index
;
1362 sibptr
= nilfs_btree_node_get_ptr(btree
, parent
,
1364 ret
= nilfs_btree_get_block(btree
, sibptr
, &bh
);
1366 goto err_out_curr_node
;
1367 sib
= (struct nilfs_btree_node
*)bh
->b_data
;
1368 if (nilfs_btree_node_get_nchildren(sib
) >
1369 nilfs_btree_node_nchildren_min(sib
, btree
)) {
1370 path
[level
].bp_sib_bh
= bh
;
1371 path
[level
].bp_op
= nilfs_btree_borrow_left
;
1372 stats
->bs_nblocks
++;
1375 path
[level
].bp_sib_bh
= bh
;
1376 path
[level
].bp_op
= nilfs_btree_concat_left
;
1377 stats
->bs_nblocks
++;
1381 nilfs_btree_node_get_nchildren(parent
) - 1) {
1383 sibptr
= nilfs_btree_node_get_ptr(btree
, parent
,
1385 ret
= nilfs_btree_get_block(btree
, sibptr
, &bh
);
1387 goto err_out_curr_node
;
1388 sib
= (struct nilfs_btree_node
*)bh
->b_data
;
1389 if (nilfs_btree_node_get_nchildren(sib
) >
1390 nilfs_btree_node_nchildren_min(sib
, btree
)) {
1391 path
[level
].bp_sib_bh
= bh
;
1392 path
[level
].bp_op
= nilfs_btree_borrow_right
;
1393 stats
->bs_nblocks
++;
1396 path
[level
].bp_sib_bh
= bh
;
1397 path
[level
].bp_op
= nilfs_btree_concat_right
;
1398 stats
->bs_nblocks
++;
1403 /* the only child of the root node */
1404 WARN_ON(level
!= nilfs_btree_height(btree
) - 2);
1405 if (nilfs_btree_node_get_nchildren(node
) - 1 <=
1406 NILFS_BTREE_ROOT_NCHILDREN_MAX
) {
1407 path
[level
].bp_op
= nilfs_btree_shrink
;
1408 stats
->bs_nblocks
+= 2;
1410 path
[level
].bp_op
= nilfs_btree_do_delete
;
1411 stats
->bs_nblocks
++;
1419 node
= nilfs_btree_get_root(btree
);
1420 path
[level
].bp_oldreq
.bpr_ptr
=
1421 nilfs_btree_node_get_ptr(btree
, node
, path
[level
].bp_index
);
1423 ret
= nilfs_bmap_prepare_end_ptr(&btree
->bt_bmap
,
1424 &path
[level
].bp_oldreq
);
1426 goto err_out_child_node
;
1428 /* child of the root node is deleted */
1429 path
[level
].bp_op
= nilfs_btree_do_delete
;
1430 stats
->bs_nblocks
++;
1439 nilfs_bmap_abort_end_ptr(&btree
->bt_bmap
, &path
[level
].bp_oldreq
);
1441 for (level
--; level
>= NILFS_BTREE_LEVEL_NODE_MIN
; level
--) {
1442 brelse(path
[level
].bp_sib_bh
);
1443 nilfs_bmap_abort_end_ptr(&btree
->bt_bmap
,
1444 &path
[level
].bp_oldreq
);
1447 stats
->bs_nblocks
= 0;
1451 static void nilfs_btree_commit_delete(struct nilfs_btree
*btree
,
1452 struct nilfs_btree_path
*path
,
1457 for (level
= NILFS_BTREE_LEVEL_NODE_MIN
; level
<= maxlevel
; level
++) {
1458 nilfs_bmap_commit_end_ptr(&btree
->bt_bmap
,
1459 &path
[level
].bp_oldreq
);
1460 path
[level
].bp_op(btree
, path
, level
, NULL
, NULL
);
1463 if (!nilfs_bmap_dirty(&btree
->bt_bmap
))
1464 nilfs_bmap_set_dirty(&btree
->bt_bmap
);
1467 static int nilfs_btree_delete(struct nilfs_bmap
*bmap
, __u64 key
)
1470 struct nilfs_btree
*btree
;
1471 struct nilfs_btree_path
*path
;
1472 struct nilfs_bmap_stats stats
;
1475 btree
= (struct nilfs_btree
*)bmap
;
1476 path
= nilfs_btree_alloc_path();
1479 nilfs_btree_init_path(path
);
1480 ret
= nilfs_btree_do_lookup(btree
, path
, key
, NULL
,
1481 NILFS_BTREE_LEVEL_NODE_MIN
);
1485 ret
= nilfs_btree_prepare_delete(btree
, path
, &level
, &stats
);
1488 nilfs_btree_commit_delete(btree
, path
, level
);
1489 nilfs_bmap_sub_blocks(bmap
, stats
.bs_nblocks
);
1492 nilfs_btree_release_path(path
);
1493 nilfs_btree_free_path(path
);
1497 static int nilfs_btree_last_key(const struct nilfs_bmap
*bmap
, __u64
*keyp
)
1499 struct nilfs_btree
*btree
;
1500 struct nilfs_btree_path
*path
;
1503 btree
= (struct nilfs_btree
*)bmap
;
1504 path
= nilfs_btree_alloc_path();
1507 nilfs_btree_init_path(path
);
1509 ret
= nilfs_btree_do_lookup_last(btree
, path
, keyp
, NULL
);
1511 nilfs_btree_release_path(path
);
1512 nilfs_btree_free_path(path
);
1517 static int nilfs_btree_check_delete(struct nilfs_bmap
*bmap
, __u64 key
)
1519 struct buffer_head
*bh
;
1520 struct nilfs_btree
*btree
;
1521 struct nilfs_btree_node
*root
, *node
;
1522 __u64 maxkey
, nextmaxkey
;
1526 btree
= (struct nilfs_btree
*)bmap
;
1527 root
= nilfs_btree_get_root(btree
);
1528 switch (nilfs_btree_height(btree
)) {
1534 nchildren
= nilfs_btree_node_get_nchildren(root
);
1537 ptr
= nilfs_btree_node_get_ptr(btree
, root
, nchildren
- 1);
1538 ret
= nilfs_btree_get_block(btree
, ptr
, &bh
);
1541 node
= (struct nilfs_btree_node
*)bh
->b_data
;
1547 nchildren
= nilfs_btree_node_get_nchildren(node
);
1548 maxkey
= nilfs_btree_node_get_key(node
, nchildren
- 1);
1549 nextmaxkey
= (nchildren
> 1) ?
1550 nilfs_btree_node_get_key(node
, nchildren
- 2) : 0;
1554 return (maxkey
== key
) && (nextmaxkey
< NILFS_BMAP_LARGE_LOW
);
1557 static int nilfs_btree_gather_data(struct nilfs_bmap
*bmap
,
1558 __u64
*keys
, __u64
*ptrs
, int nitems
)
1560 struct buffer_head
*bh
;
1561 struct nilfs_btree
*btree
;
1562 struct nilfs_btree_node
*node
, *root
;
1566 int nchildren
, i
, ret
;
1568 btree
= (struct nilfs_btree
*)bmap
;
1569 root
= nilfs_btree_get_root(btree
);
1570 switch (nilfs_btree_height(btree
)) {
1576 nchildren
= nilfs_btree_node_get_nchildren(root
);
1577 WARN_ON(nchildren
> 1);
1578 ptr
= nilfs_btree_node_get_ptr(btree
, root
, nchildren
- 1);
1579 ret
= nilfs_btree_get_block(btree
, ptr
, &bh
);
1582 node
= (struct nilfs_btree_node
*)bh
->b_data
;
1589 nchildren
= nilfs_btree_node_get_nchildren(node
);
1590 if (nchildren
< nitems
)
1592 dkeys
= nilfs_btree_node_dkeys(node
);
1593 dptrs
= nilfs_btree_node_dptrs(node
, btree
);
1594 for (i
= 0; i
< nitems
; i
++) {
1595 keys
[i
] = nilfs_bmap_dkey_to_key(dkeys
[i
]);
1596 ptrs
[i
] = nilfs_bmap_dptr_to_ptr(dptrs
[i
]);
1606 nilfs_btree_prepare_convert_and_insert(struct nilfs_bmap
*bmap
, __u64 key
,
1607 union nilfs_bmap_ptr_req
*dreq
,
1608 union nilfs_bmap_ptr_req
*nreq
,
1609 struct buffer_head
**bhp
,
1610 struct nilfs_bmap_stats
*stats
)
1612 struct buffer_head
*bh
;
1613 struct nilfs_btree
*btree
;
1616 btree
= (struct nilfs_btree
*)bmap
;
1617 stats
->bs_nblocks
= 0;
1620 /* cannot find near ptr */
1621 if (NILFS_BMAP_USE_VBN(bmap
))
1622 dreq
->bpr_ptr
= nilfs_btree_find_target_v(btree
, NULL
, key
);
1624 ret
= nilfs_bmap_prepare_alloc_ptr(bmap
, dreq
);
1629 stats
->bs_nblocks
++;
1631 nreq
->bpr_ptr
= dreq
->bpr_ptr
+ 1;
1632 ret
= nilfs_bmap_prepare_alloc_ptr(bmap
, nreq
);
1636 ret
= nilfs_btree_get_new_block(btree
, nreq
->bpr_ptr
, &bh
);
1641 stats
->bs_nblocks
++;
1649 nilfs_bmap_abort_alloc_ptr(bmap
, nreq
);
1651 nilfs_bmap_abort_alloc_ptr(bmap
, dreq
);
1652 stats
->bs_nblocks
= 0;
1658 nilfs_btree_commit_convert_and_insert(struct nilfs_bmap
*bmap
,
1659 __u64 key
, __u64 ptr
,
1660 const __u64
*keys
, const __u64
*ptrs
,
1662 union nilfs_bmap_ptr_req
*dreq
,
1663 union nilfs_bmap_ptr_req
*nreq
,
1664 struct buffer_head
*bh
)
1666 struct nilfs_btree
*btree
;
1667 struct nilfs_btree_node
*node
;
1670 /* free resources */
1671 if (bmap
->b_ops
->bop_clear
!= NULL
)
1672 bmap
->b_ops
->bop_clear(bmap
);
1674 /* ptr must be a pointer to a buffer head. */
1675 set_buffer_nilfs_volatile((struct buffer_head
*)((unsigned long)ptr
));
1677 /* convert and insert */
1678 btree
= (struct nilfs_btree
*)bmap
;
1679 nilfs_btree_init(bmap
);
1681 nilfs_bmap_commit_alloc_ptr(bmap
, dreq
);
1682 nilfs_bmap_commit_alloc_ptr(bmap
, nreq
);
1684 /* create child node at level 1 */
1686 node
= (struct nilfs_btree_node
*)bh
->b_data
;
1687 nilfs_btree_node_init(btree
, node
, 0, 1, n
, keys
, ptrs
);
1688 nilfs_btree_node_insert(btree
, node
,
1689 key
, dreq
->bpr_ptr
, n
);
1690 if (!buffer_dirty(bh
))
1691 nilfs_btnode_mark_dirty(bh
);
1692 if (!nilfs_bmap_dirty(bmap
))
1693 nilfs_bmap_set_dirty(bmap
);
1698 /* create root node at level 2 */
1699 node
= nilfs_btree_get_root(btree
);
1700 tmpptr
= nreq
->bpr_ptr
;
1701 nilfs_btree_node_init(btree
, node
, NILFS_BTREE_NODE_ROOT
,
1702 2, 1, &keys
[0], &tmpptr
);
1704 nilfs_bmap_commit_alloc_ptr(bmap
, dreq
);
1706 /* create root node at level 1 */
1707 node
= nilfs_btree_get_root(btree
);
1708 nilfs_btree_node_init(btree
, node
, NILFS_BTREE_NODE_ROOT
,
1710 nilfs_btree_node_insert(btree
, node
,
1711 key
, dreq
->bpr_ptr
, n
);
1712 if (!nilfs_bmap_dirty(bmap
))
1713 nilfs_bmap_set_dirty(bmap
);
1716 if (NILFS_BMAP_USE_VBN(bmap
))
1717 nilfs_btree_set_target_v(btree
, key
, dreq
->bpr_ptr
);
1721 * nilfs_btree_convert_and_insert -
1729 int nilfs_btree_convert_and_insert(struct nilfs_bmap
*bmap
,
1730 __u64 key
, __u64 ptr
,
1731 const __u64
*keys
, const __u64
*ptrs
, int n
)
1733 struct buffer_head
*bh
;
1734 union nilfs_bmap_ptr_req dreq
, nreq
, *di
, *ni
;
1735 struct nilfs_bmap_stats stats
;
1738 if (n
+ 1 <= NILFS_BTREE_ROOT_NCHILDREN_MAX
) {
1741 } else if ((n
+ 1) <= NILFS_BTREE_NODE_NCHILDREN_MAX(
1742 1 << bmap
->b_inode
->i_blkbits
)) {
1751 ret
= nilfs_btree_prepare_convert_and_insert(bmap
, key
, di
, ni
, &bh
,
1755 nilfs_btree_commit_convert_and_insert(bmap
, key
, ptr
, keys
, ptrs
, n
,
1757 nilfs_bmap_add_blocks(bmap
, stats
.bs_nblocks
);
1761 static int nilfs_btree_propagate_p(struct nilfs_btree
*btree
,
1762 struct nilfs_btree_path
*path
,
1764 struct buffer_head
*bh
)
1766 while ((++level
< nilfs_btree_height(btree
) - 1) &&
1767 !buffer_dirty(path
[level
].bp_bh
))
1768 nilfs_btnode_mark_dirty(path
[level
].bp_bh
);
1773 static int nilfs_btree_prepare_update_v(struct nilfs_btree
*btree
,
1774 struct nilfs_btree_path
*path
,
1777 struct nilfs_btree_node
*parent
;
1780 parent
= nilfs_btree_get_node(btree
, path
, level
+ 1);
1781 path
[level
].bp_oldreq
.bpr_ptr
=
1782 nilfs_btree_node_get_ptr(btree
, parent
,
1783 path
[level
+ 1].bp_index
);
1784 path
[level
].bp_newreq
.bpr_ptr
= path
[level
].bp_oldreq
.bpr_ptr
+ 1;
1785 ret
= nilfs_bmap_prepare_update_v(&btree
->bt_bmap
,
1786 &path
[level
].bp_oldreq
,
1787 &path
[level
].bp_newreq
);
1791 if (buffer_nilfs_node(path
[level
].bp_bh
)) {
1792 path
[level
].bp_ctxt
.oldkey
= path
[level
].bp_oldreq
.bpr_ptr
;
1793 path
[level
].bp_ctxt
.newkey
= path
[level
].bp_newreq
.bpr_ptr
;
1794 path
[level
].bp_ctxt
.bh
= path
[level
].bp_bh
;
1795 ret
= nilfs_btnode_prepare_change_key(
1796 &NILFS_BMAP_I(&btree
->bt_bmap
)->i_btnode_cache
,
1797 &path
[level
].bp_ctxt
);
1799 nilfs_bmap_abort_update_v(&btree
->bt_bmap
,
1800 &path
[level
].bp_oldreq
,
1801 &path
[level
].bp_newreq
);
1809 static void nilfs_btree_commit_update_v(struct nilfs_btree
*btree
,
1810 struct nilfs_btree_path
*path
,
1813 struct nilfs_btree_node
*parent
;
1815 nilfs_bmap_commit_update_v(&btree
->bt_bmap
,
1816 &path
[level
].bp_oldreq
,
1817 &path
[level
].bp_newreq
);
1819 if (buffer_nilfs_node(path
[level
].bp_bh
)) {
1820 nilfs_btnode_commit_change_key(
1821 &NILFS_BMAP_I(&btree
->bt_bmap
)->i_btnode_cache
,
1822 &path
[level
].bp_ctxt
);
1823 path
[level
].bp_bh
= path
[level
].bp_ctxt
.bh
;
1825 set_buffer_nilfs_volatile(path
[level
].bp_bh
);
1827 parent
= nilfs_btree_get_node(btree
, path
, level
+ 1);
1828 nilfs_btree_node_set_ptr(btree
, parent
, path
[level
+ 1].bp_index
,
1829 path
[level
].bp_newreq
.bpr_ptr
);
1832 static void nilfs_btree_abort_update_v(struct nilfs_btree
*btree
,
1833 struct nilfs_btree_path
*path
,
1836 nilfs_bmap_abort_update_v(&btree
->bt_bmap
,
1837 &path
[level
].bp_oldreq
,
1838 &path
[level
].bp_newreq
);
1839 if (buffer_nilfs_node(path
[level
].bp_bh
))
1840 nilfs_btnode_abort_change_key(
1841 &NILFS_BMAP_I(&btree
->bt_bmap
)->i_btnode_cache
,
1842 &path
[level
].bp_ctxt
);
1845 static int nilfs_btree_prepare_propagate_v(struct nilfs_btree
*btree
,
1846 struct nilfs_btree_path
*path
,
1853 if (!buffer_nilfs_volatile(path
[level
].bp_bh
)) {
1854 ret
= nilfs_btree_prepare_update_v(btree
, path
, level
);
1858 while ((++level
< nilfs_btree_height(btree
) - 1) &&
1859 !buffer_dirty(path
[level
].bp_bh
)) {
1861 WARN_ON(buffer_nilfs_volatile(path
[level
].bp_bh
));
1862 ret
= nilfs_btree_prepare_update_v(btree
, path
, level
);
1868 *maxlevelp
= level
- 1;
1873 while (--level
> minlevel
)
1874 nilfs_btree_abort_update_v(btree
, path
, level
);
1875 if (!buffer_nilfs_volatile(path
[level
].bp_bh
))
1876 nilfs_btree_abort_update_v(btree
, path
, level
);
1880 static void nilfs_btree_commit_propagate_v(struct nilfs_btree
*btree
,
1881 struct nilfs_btree_path
*path
,
1884 struct buffer_head
*bh
)
1888 if (!buffer_nilfs_volatile(path
[minlevel
].bp_bh
))
1889 nilfs_btree_commit_update_v(btree
, path
, minlevel
);
1891 for (level
= minlevel
+ 1; level
<= maxlevel
; level
++)
1892 nilfs_btree_commit_update_v(btree
, path
, level
);
1895 static int nilfs_btree_propagate_v(struct nilfs_btree
*btree
,
1896 struct nilfs_btree_path
*path
,
1898 struct buffer_head
*bh
)
1901 struct nilfs_btree_node
*parent
;
1905 path
[level
].bp_bh
= bh
;
1906 ret
= nilfs_btree_prepare_propagate_v(btree
, path
, level
, &maxlevel
);
1910 if (buffer_nilfs_volatile(path
[level
].bp_bh
)) {
1911 parent
= nilfs_btree_get_node(btree
, path
, level
+ 1);
1912 ptr
= nilfs_btree_node_get_ptr(btree
, parent
,
1913 path
[level
+ 1].bp_index
);
1914 ret
= nilfs_bmap_mark_dirty(&btree
->bt_bmap
, ptr
);
1919 nilfs_btree_commit_propagate_v(btree
, path
, level
, maxlevel
, bh
);
1922 brelse(path
[level
].bp_bh
);
1923 path
[level
].bp_bh
= NULL
;
1927 static int nilfs_btree_propagate(const struct nilfs_bmap
*bmap
,
1928 struct buffer_head
*bh
)
1930 struct nilfs_btree
*btree
;
1931 struct nilfs_btree_path
*path
;
1932 struct nilfs_btree_node
*node
;
1936 WARN_ON(!buffer_dirty(bh
));
1938 btree
= (struct nilfs_btree
*)bmap
;
1939 path
= nilfs_btree_alloc_path();
1942 nilfs_btree_init_path(path
);
1944 if (buffer_nilfs_node(bh
)) {
1945 node
= (struct nilfs_btree_node
*)bh
->b_data
;
1946 key
= nilfs_btree_node_get_key(node
, 0);
1947 level
= nilfs_btree_node_get_level(node
);
1949 key
= nilfs_bmap_data_get_key(bmap
, bh
);
1950 level
= NILFS_BTREE_LEVEL_DATA
;
1953 ret
= nilfs_btree_do_lookup(btree
, path
, key
, NULL
, level
+ 1);
1955 if (unlikely(ret
== -ENOENT
))
1956 printk(KERN_CRIT
"%s: key = %llu, level == %d\n",
1957 __func__
, (unsigned long long)key
, level
);
1961 ret
= NILFS_BMAP_USE_VBN(bmap
) ?
1962 nilfs_btree_propagate_v(btree
, path
, level
, bh
) :
1963 nilfs_btree_propagate_p(btree
, path
, level
, bh
);
1966 nilfs_btree_release_path(path
);
1967 nilfs_btree_free_path(path
);
1972 static int nilfs_btree_propagate_gc(const struct nilfs_bmap
*bmap
,
1973 struct buffer_head
*bh
)
1975 return nilfs_bmap_mark_dirty(bmap
, bh
->b_blocknr
);
1978 static void nilfs_btree_add_dirty_buffer(struct nilfs_btree
*btree
,
1979 struct list_head
*lists
,
1980 struct buffer_head
*bh
)
1982 struct list_head
*head
;
1983 struct buffer_head
*cbh
;
1984 struct nilfs_btree_node
*node
, *cnode
;
1989 node
= (struct nilfs_btree_node
*)bh
->b_data
;
1990 key
= nilfs_btree_node_get_key(node
, 0);
1991 level
= nilfs_btree_node_get_level(node
);
1992 list_for_each(head
, &lists
[level
]) {
1993 cbh
= list_entry(head
, struct buffer_head
, b_assoc_buffers
);
1994 cnode
= (struct nilfs_btree_node
*)cbh
->b_data
;
1995 ckey
= nilfs_btree_node_get_key(cnode
, 0);
1999 list_add_tail(&bh
->b_assoc_buffers
, head
);
2002 static void nilfs_btree_lookup_dirty_buffers(struct nilfs_bmap
*bmap
,
2003 struct list_head
*listp
)
2005 struct nilfs_btree
*btree
= (struct nilfs_btree
*)bmap
;
2006 struct address_space
*btcache
= &NILFS_BMAP_I(bmap
)->i_btnode_cache
;
2007 struct list_head lists
[NILFS_BTREE_LEVEL_MAX
];
2008 struct pagevec pvec
;
2009 struct buffer_head
*bh
, *head
;
2013 for (level
= NILFS_BTREE_LEVEL_NODE_MIN
;
2014 level
< NILFS_BTREE_LEVEL_MAX
;
2016 INIT_LIST_HEAD(&lists
[level
]);
2018 pagevec_init(&pvec
, 0);
2020 while (pagevec_lookup_tag(&pvec
, btcache
, &index
, PAGECACHE_TAG_DIRTY
,
2022 for (i
= 0; i
< pagevec_count(&pvec
); i
++) {
2023 bh
= head
= page_buffers(pvec
.pages
[i
]);
2025 if (buffer_dirty(bh
))
2026 nilfs_btree_add_dirty_buffer(btree
,
2028 } while ((bh
= bh
->b_this_page
) != head
);
2030 pagevec_release(&pvec
);
2034 for (level
= NILFS_BTREE_LEVEL_NODE_MIN
;
2035 level
< NILFS_BTREE_LEVEL_MAX
;
2037 list_splice(&lists
[level
], listp
->prev
);
2040 static int nilfs_btree_assign_p(struct nilfs_btree
*btree
,
2041 struct nilfs_btree_path
*path
,
2043 struct buffer_head
**bh
,
2045 union nilfs_binfo
*binfo
)
2047 struct nilfs_btree_node
*parent
;
2052 parent
= nilfs_btree_get_node(btree
, path
, level
+ 1);
2053 ptr
= nilfs_btree_node_get_ptr(btree
, parent
,
2054 path
[level
+ 1].bp_index
);
2055 if (buffer_nilfs_node(*bh
)) {
2056 path
[level
].bp_ctxt
.oldkey
= ptr
;
2057 path
[level
].bp_ctxt
.newkey
= blocknr
;
2058 path
[level
].bp_ctxt
.bh
= *bh
;
2059 ret
= nilfs_btnode_prepare_change_key(
2060 &NILFS_BMAP_I(&btree
->bt_bmap
)->i_btnode_cache
,
2061 &path
[level
].bp_ctxt
);
2064 nilfs_btnode_commit_change_key(
2065 &NILFS_BMAP_I(&btree
->bt_bmap
)->i_btnode_cache
,
2066 &path
[level
].bp_ctxt
);
2067 *bh
= path
[level
].bp_ctxt
.bh
;
2070 nilfs_btree_node_set_ptr(btree
, parent
,
2071 path
[level
+ 1].bp_index
, blocknr
);
2073 key
= nilfs_btree_node_get_key(parent
, path
[level
+ 1].bp_index
);
2074 /* on-disk format */
2075 binfo
->bi_dat
.bi_blkoff
= nilfs_bmap_key_to_dkey(key
);
2076 binfo
->bi_dat
.bi_level
= level
;
2081 static int nilfs_btree_assign_v(struct nilfs_btree
*btree
,
2082 struct nilfs_btree_path
*path
,
2084 struct buffer_head
**bh
,
2086 union nilfs_binfo
*binfo
)
2088 struct nilfs_btree_node
*parent
;
2091 union nilfs_bmap_ptr_req req
;
2094 parent
= nilfs_btree_get_node(btree
, path
, level
+ 1);
2095 ptr
= nilfs_btree_node_get_ptr(btree
, parent
,
2096 path
[level
+ 1].bp_index
);
2098 ret
= nilfs_bmap_start_v(&btree
->bt_bmap
, &req
, blocknr
);
2099 if (unlikely(ret
< 0))
2102 key
= nilfs_btree_node_get_key(parent
, path
[level
+ 1].bp_index
);
2103 /* on-disk format */
2104 binfo
->bi_v
.bi_vblocknr
= nilfs_bmap_ptr_to_dptr(ptr
);
2105 binfo
->bi_v
.bi_blkoff
= nilfs_bmap_key_to_dkey(key
);
2110 static int nilfs_btree_assign(struct nilfs_bmap
*bmap
,
2111 struct buffer_head
**bh
,
2113 union nilfs_binfo
*binfo
)
2115 struct nilfs_btree
*btree
;
2116 struct nilfs_btree_path
*path
;
2117 struct nilfs_btree_node
*node
;
2121 btree
= (struct nilfs_btree
*)bmap
;
2122 path
= nilfs_btree_alloc_path();
2125 nilfs_btree_init_path(path
);
2127 if (buffer_nilfs_node(*bh
)) {
2128 node
= (struct nilfs_btree_node
*)(*bh
)->b_data
;
2129 key
= nilfs_btree_node_get_key(node
, 0);
2130 level
= nilfs_btree_node_get_level(node
);
2132 key
= nilfs_bmap_data_get_key(bmap
, *bh
);
2133 level
= NILFS_BTREE_LEVEL_DATA
;
2136 ret
= nilfs_btree_do_lookup(btree
, path
, key
, NULL
, level
+ 1);
2138 WARN_ON(ret
== -ENOENT
);
2142 ret
= NILFS_BMAP_USE_VBN(bmap
) ?
2143 nilfs_btree_assign_v(btree
, path
, level
, bh
, blocknr
, binfo
) :
2144 nilfs_btree_assign_p(btree
, path
, level
, bh
, blocknr
, binfo
);
2147 nilfs_btree_release_path(path
);
2148 nilfs_btree_free_path(path
);
2153 static int nilfs_btree_assign_gc(struct nilfs_bmap
*bmap
,
2154 struct buffer_head
**bh
,
2156 union nilfs_binfo
*binfo
)
2158 struct nilfs_btree
*btree
;
2159 struct nilfs_btree_node
*node
;
2163 btree
= (struct nilfs_btree
*)bmap
;
2164 ret
= nilfs_bmap_move_v(bmap
, (*bh
)->b_blocknr
, blocknr
);
2168 if (buffer_nilfs_node(*bh
)) {
2169 node
= (struct nilfs_btree_node
*)(*bh
)->b_data
;
2170 key
= nilfs_btree_node_get_key(node
, 0);
2172 key
= nilfs_bmap_data_get_key(bmap
, *bh
);
2174 /* on-disk format */
2175 binfo
->bi_v
.bi_vblocknr
= cpu_to_le64((*bh
)->b_blocknr
);
2176 binfo
->bi_v
.bi_blkoff
= nilfs_bmap_key_to_dkey(key
);
2181 static int nilfs_btree_mark(struct nilfs_bmap
*bmap
, __u64 key
, int level
)
2183 struct buffer_head
*bh
;
2184 struct nilfs_btree
*btree
;
2185 struct nilfs_btree_path
*path
;
2189 btree
= (struct nilfs_btree
*)bmap
;
2190 path
= nilfs_btree_alloc_path();
2193 nilfs_btree_init_path(path
);
2195 ret
= nilfs_btree_do_lookup(btree
, path
, key
, &ptr
, level
+ 1);
2197 WARN_ON(ret
== -ENOENT
);
2200 ret
= nilfs_btree_get_block(btree
, ptr
, &bh
);
2202 WARN_ON(ret
== -ENOENT
);
2206 if (!buffer_dirty(bh
))
2207 nilfs_btnode_mark_dirty(bh
);
2209 if (!nilfs_bmap_dirty(&btree
->bt_bmap
))
2210 nilfs_bmap_set_dirty(&btree
->bt_bmap
);
2213 nilfs_btree_release_path(path
);
2214 nilfs_btree_free_path(path
);
2218 static const struct nilfs_bmap_operations nilfs_btree_ops
= {
2219 .bop_lookup
= nilfs_btree_lookup
,
2220 .bop_lookup_contig
= nilfs_btree_lookup_contig
,
2221 .bop_insert
= nilfs_btree_insert
,
2222 .bop_delete
= nilfs_btree_delete
,
2225 .bop_propagate
= nilfs_btree_propagate
,
2227 .bop_lookup_dirty_buffers
= nilfs_btree_lookup_dirty_buffers
,
2229 .bop_assign
= nilfs_btree_assign
,
2230 .bop_mark
= nilfs_btree_mark
,
2232 .bop_last_key
= nilfs_btree_last_key
,
2233 .bop_check_insert
= NULL
,
2234 .bop_check_delete
= nilfs_btree_check_delete
,
2235 .bop_gather_data
= nilfs_btree_gather_data
,
2238 static const struct nilfs_bmap_operations nilfs_btree_ops_gc
= {
2240 .bop_lookup_contig
= NULL
,
2245 .bop_propagate
= nilfs_btree_propagate_gc
,
2247 .bop_lookup_dirty_buffers
= nilfs_btree_lookup_dirty_buffers
,
2249 .bop_assign
= nilfs_btree_assign_gc
,
2252 .bop_last_key
= NULL
,
2253 .bop_check_insert
= NULL
,
2254 .bop_check_delete
= NULL
,
2255 .bop_gather_data
= NULL
,
2258 int nilfs_btree_init(struct nilfs_bmap
*bmap
)
2260 bmap
->b_ops
= &nilfs_btree_ops
;
2264 void nilfs_btree_init_gc(struct nilfs_bmap
*bmap
)
2266 bmap
->b_ops
= &nilfs_btree_ops_gc
;