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 struct nilfs_btree_path *nilfs_btree_alloc_path(void)
76 struct nilfs_btree_path *path;
77 int level = NILFS_BTREE_LEVEL_DATA;
79 path = kmem_cache_alloc(nilfs_btree_path_cache, GFP_NOFS);
83 for (; level < NILFS_BTREE_LEVEL_MAX; level++) {
84 path[level].bp_bh = NULL;
85 path[level].bp_sib_bh = NULL;
86 path[level].bp_index = 0;
87 path[level].bp_oldreq.bpr_ptr = NILFS_BMAP_INVALID_PTR;
88 path[level].bp_newreq.bpr_ptr = NILFS_BMAP_INVALID_PTR;
89 path[level].bp_op = NULL;
96 static inline void nilfs_btree_free_path(struct nilfs_btree_path *path)
98 kmem_cache_free(nilfs_btree_path_cache, path);
101 static void nilfs_btree_release_path(struct nilfs_btree_path *path)
105 for (level = NILFS_BTREE_LEVEL_DATA; level < NILFS_BTREE_LEVEL_MAX;
107 brelse(path[level].bp_bh);
111 * B-tree node operations
113 static int nilfs_btree_get_block(const struct nilfs_btree *btree, __u64 ptr,
114 struct buffer_head **bhp)
116 struct address_space *btnc =
117 &NILFS_BMAP_I((struct nilfs_bmap *)btree)->i_btnode_cache;
120 err = nilfs_btnode_submit_block(btnc, ptr, 0, bhp);
122 return err == -EEXIST ? 0 : err;
124 wait_on_buffer(*bhp);
125 if (!buffer_uptodate(*bhp)) {
132 static int nilfs_btree_get_new_block(const struct nilfs_btree *btree,
133 __u64 ptr, struct buffer_head **bhp)
135 struct address_space *btnc =
136 &NILFS_BMAP_I((struct nilfs_bmap *)btree)->i_btnode_cache;
137 struct buffer_head *bh;
139 bh = nilfs_btnode_create_block(btnc, ptr);
143 set_buffer_nilfs_volatile(bh);
149 nilfs_btree_node_get_flags(const struct nilfs_btree_node *node)
151 return node->bn_flags;
155 nilfs_btree_node_set_flags(struct nilfs_btree_node *node, int flags)
157 node->bn_flags = flags;
160 static inline int nilfs_btree_node_root(const struct nilfs_btree_node *node)
162 return nilfs_btree_node_get_flags(node) & NILFS_BTREE_NODE_ROOT;
166 nilfs_btree_node_get_level(const struct nilfs_btree_node *node)
168 return node->bn_level;
172 nilfs_btree_node_set_level(struct nilfs_btree_node *node, int level)
174 node->bn_level = level;
178 nilfs_btree_node_get_nchildren(const struct nilfs_btree_node *node)
180 return le16_to_cpu(node->bn_nchildren);
184 nilfs_btree_node_set_nchildren(struct nilfs_btree_node *node, int nchildren)
186 node->bn_nchildren = cpu_to_le16(nchildren);
189 static inline int nilfs_btree_node_size(const struct nilfs_btree *btree)
191 return 1 << btree->bt_bmap.b_inode->i_blkbits;
195 nilfs_btree_node_nchildren_min(const struct nilfs_btree_node *node,
196 const struct nilfs_btree *btree)
198 return nilfs_btree_node_root(node) ?
199 NILFS_BTREE_ROOT_NCHILDREN_MIN :
200 NILFS_BTREE_NODE_NCHILDREN_MIN(nilfs_btree_node_size(btree));
204 nilfs_btree_node_nchildren_max(const struct nilfs_btree_node *node,
205 const struct nilfs_btree *btree)
207 return nilfs_btree_node_root(node) ?
208 NILFS_BTREE_ROOT_NCHILDREN_MAX :
209 NILFS_BTREE_NODE_NCHILDREN_MAX(nilfs_btree_node_size(btree));
212 static inline __le64 *
213 nilfs_btree_node_dkeys(const struct nilfs_btree_node *node)
215 return (__le64 *)((char *)(node + 1) +
216 (nilfs_btree_node_root(node) ?
217 0 : NILFS_BTREE_NODE_EXTRA_PAD_SIZE));
220 static inline __le64 *
221 nilfs_btree_node_dptrs(const struct nilfs_btree_node *node,
222 const struct nilfs_btree *btree)
224 return (__le64 *)(nilfs_btree_node_dkeys(node) +
225 nilfs_btree_node_nchildren_max(node, btree));
229 nilfs_btree_node_get_key(const struct nilfs_btree_node *node, int index)
231 return nilfs_bmap_dkey_to_key(*(nilfs_btree_node_dkeys(node) + index));
235 nilfs_btree_node_set_key(struct nilfs_btree_node *node, int index, __u64 key)
237 *(nilfs_btree_node_dkeys(node) + index) = nilfs_bmap_key_to_dkey(key);
241 nilfs_btree_node_get_ptr(const struct nilfs_btree *btree,
242 const struct nilfs_btree_node *node, int index)
244 return nilfs_bmap_dptr_to_ptr(*(nilfs_btree_node_dptrs(node, btree) +
249 nilfs_btree_node_set_ptr(struct nilfs_btree *btree,
250 struct nilfs_btree_node *node, int index, __u64 ptr)
252 *(nilfs_btree_node_dptrs(node, btree) + index) =
253 nilfs_bmap_ptr_to_dptr(ptr);
256 static void nilfs_btree_node_init(struct nilfs_btree *btree,
257 struct nilfs_btree_node *node,
258 int flags, int level, int nchildren,
259 const __u64 *keys, const __u64 *ptrs)
265 nilfs_btree_node_set_flags(node, flags);
266 nilfs_btree_node_set_level(node, level);
267 nilfs_btree_node_set_nchildren(node, nchildren);
269 dkeys = nilfs_btree_node_dkeys(node);
270 dptrs = nilfs_btree_node_dptrs(node, btree);
271 for (i = 0; i < nchildren; i++) {
272 dkeys[i] = nilfs_bmap_key_to_dkey(keys[i]);
273 dptrs[i] = nilfs_bmap_ptr_to_dptr(ptrs[i]);
277 /* Assume the buffer heads corresponding to left and right are locked. */
278 static void nilfs_btree_node_move_left(struct nilfs_btree *btree,
279 struct nilfs_btree_node *left,
280 struct nilfs_btree_node *right,
283 __le64 *ldkeys, *rdkeys;
284 __le64 *ldptrs, *rdptrs;
285 int lnchildren, rnchildren;
287 ldkeys = nilfs_btree_node_dkeys(left);
288 ldptrs = nilfs_btree_node_dptrs(left, btree);
289 lnchildren = nilfs_btree_node_get_nchildren(left);
291 rdkeys = nilfs_btree_node_dkeys(right);
292 rdptrs = nilfs_btree_node_dptrs(right, btree);
293 rnchildren = nilfs_btree_node_get_nchildren(right);
295 memcpy(ldkeys + lnchildren, rdkeys, n * sizeof(*rdkeys));
296 memcpy(ldptrs + lnchildren, rdptrs, n * sizeof(*rdptrs));
297 memmove(rdkeys, rdkeys + n, (rnchildren - n) * sizeof(*rdkeys));
298 memmove(rdptrs, rdptrs + n, (rnchildren - n) * sizeof(*rdptrs));
302 nilfs_btree_node_set_nchildren(left, lnchildren);
303 nilfs_btree_node_set_nchildren(right, rnchildren);
306 /* Assume that the buffer heads corresponding to left and right are locked. */
307 static void nilfs_btree_node_move_right(struct nilfs_btree *btree,
308 struct nilfs_btree_node *left,
309 struct nilfs_btree_node *right,
312 __le64 *ldkeys, *rdkeys;
313 __le64 *ldptrs, *rdptrs;
314 int lnchildren, rnchildren;
316 ldkeys = nilfs_btree_node_dkeys(left);
317 ldptrs = nilfs_btree_node_dptrs(left, btree);
318 lnchildren = nilfs_btree_node_get_nchildren(left);
320 rdkeys = nilfs_btree_node_dkeys(right);
321 rdptrs = nilfs_btree_node_dptrs(right, btree);
322 rnchildren = nilfs_btree_node_get_nchildren(right);
324 memmove(rdkeys + n, rdkeys, rnchildren * sizeof(*rdkeys));
325 memmove(rdptrs + n, rdptrs, rnchildren * sizeof(*rdptrs));
326 memcpy(rdkeys, ldkeys + lnchildren - n, n * sizeof(*rdkeys));
327 memcpy(rdptrs, ldptrs + lnchildren - n, n * sizeof(*rdptrs));
331 nilfs_btree_node_set_nchildren(left, lnchildren);
332 nilfs_btree_node_set_nchildren(right, rnchildren);
335 /* Assume that the buffer head corresponding to node is locked. */
336 static void nilfs_btree_node_insert(struct nilfs_btree *btree,
337 struct nilfs_btree_node *node,
338 __u64 key, __u64 ptr, int index)
344 dkeys = nilfs_btree_node_dkeys(node);
345 dptrs = nilfs_btree_node_dptrs(node, btree);
346 nchildren = nilfs_btree_node_get_nchildren(node);
347 if (index < nchildren) {
348 memmove(dkeys + index + 1, dkeys + index,
349 (nchildren - index) * sizeof(*dkeys));
350 memmove(dptrs + index + 1, dptrs + index,
351 (nchildren - index) * sizeof(*dptrs));
353 dkeys[index] = nilfs_bmap_key_to_dkey(key);
354 dptrs[index] = nilfs_bmap_ptr_to_dptr(ptr);
356 nilfs_btree_node_set_nchildren(node, nchildren);
359 /* Assume that the buffer head corresponding to node is locked. */
360 static void nilfs_btree_node_delete(struct nilfs_btree *btree,
361 struct nilfs_btree_node *node,
362 __u64 *keyp, __u64 *ptrp, int index)
370 dkeys = nilfs_btree_node_dkeys(node);
371 dptrs = nilfs_btree_node_dptrs(node, btree);
372 key = nilfs_bmap_dkey_to_key(dkeys[index]);
373 ptr = nilfs_bmap_dptr_to_ptr(dptrs[index]);
374 nchildren = nilfs_btree_node_get_nchildren(node);
380 if (index < nchildren - 1) {
381 memmove(dkeys + index, dkeys + index + 1,
382 (nchildren - index - 1) * sizeof(*dkeys));
383 memmove(dptrs + index, dptrs + index + 1,
384 (nchildren - index - 1) * sizeof(*dptrs));
387 nilfs_btree_node_set_nchildren(node, nchildren);
390 static int nilfs_btree_node_lookup(const struct nilfs_btree_node *node,
391 __u64 key, int *indexp)
394 int index, low, high, s;
398 high = nilfs_btree_node_get_nchildren(node) - 1;
401 while (low <= high) {
402 index = (low + high) / 2;
403 nkey = nilfs_btree_node_get_key(node, index);
407 } else if (nkey < key) {
417 if (nilfs_btree_node_get_level(node) > NILFS_BTREE_LEVEL_NODE_MIN) {
418 if (s > 0 && index > 0)
429 static inline struct nilfs_btree_node *
430 nilfs_btree_get_root(const struct nilfs_btree *btree)
432 return (struct nilfs_btree_node *)btree->bt_bmap.b_u.u_data;
435 static inline struct nilfs_btree_node *
436 nilfs_btree_get_nonroot_node(const struct nilfs_btree_path *path, int level)
438 return (struct nilfs_btree_node *)path[level].bp_bh->b_data;
441 static inline struct nilfs_btree_node *
442 nilfs_btree_get_sib_node(const struct nilfs_btree_path *path, int level)
444 return (struct nilfs_btree_node *)path[level].bp_sib_bh->b_data;
447 static inline int nilfs_btree_height(const struct nilfs_btree *btree)
449 return nilfs_btree_node_get_level(nilfs_btree_get_root(btree)) + 1;
452 static inline struct nilfs_btree_node *
453 nilfs_btree_get_node(const struct nilfs_btree *btree,
454 const struct nilfs_btree_path *path,
457 return (level == nilfs_btree_height(btree) - 1) ?
458 nilfs_btree_get_root(btree) :
459 nilfs_btree_get_nonroot_node(path, level);
463 nilfs_btree_bad_node(struct nilfs_btree_node *node, int level)
465 if (unlikely(nilfs_btree_node_get_level(node) != level)) {
467 printk(KERN_CRIT "NILFS: btree level mismatch: %d != %d\n",
468 nilfs_btree_node_get_level(node), level);
474 static int nilfs_btree_do_lookup(const struct nilfs_btree *btree,
475 struct nilfs_btree_path *path,
476 __u64 key, __u64 *ptrp, int minlevel)
478 struct nilfs_btree_node *node;
480 int level, index, found, ret;
482 node = nilfs_btree_get_root(btree);
483 level = nilfs_btree_node_get_level(node);
484 if (level < minlevel || nilfs_btree_node_get_nchildren(node) <= 0)
487 found = nilfs_btree_node_lookup(node, key, &index);
488 ptr = nilfs_btree_node_get_ptr(btree, node, index);
489 path[level].bp_bh = NULL;
490 path[level].bp_index = index;
492 for (level--; level >= minlevel; level--) {
493 ret = nilfs_btree_get_block(btree, ptr, &path[level].bp_bh);
496 node = nilfs_btree_get_nonroot_node(path, level);
497 if (nilfs_btree_bad_node(node, level))
500 found = nilfs_btree_node_lookup(node, key, &index);
503 if (index < nilfs_btree_node_nchildren_max(node, btree))
504 ptr = nilfs_btree_node_get_ptr(btree, node, index);
506 WARN_ON(found || level != NILFS_BTREE_LEVEL_NODE_MIN);
508 ptr = NILFS_BMAP_INVALID_PTR;
510 path[level].bp_index = index;
521 static int nilfs_btree_do_lookup_last(const struct nilfs_btree *btree,
522 struct nilfs_btree_path *path,
523 __u64 *keyp, __u64 *ptrp)
525 struct nilfs_btree_node *node;
527 int index, level, ret;
529 node = nilfs_btree_get_root(btree);
530 index = nilfs_btree_node_get_nchildren(node) - 1;
533 level = nilfs_btree_node_get_level(node);
534 ptr = nilfs_btree_node_get_ptr(btree, node, index);
535 path[level].bp_bh = NULL;
536 path[level].bp_index = index;
538 for (level--; level > 0; level--) {
539 ret = nilfs_btree_get_block(btree, ptr, &path[level].bp_bh);
542 node = nilfs_btree_get_nonroot_node(path, level);
543 if (nilfs_btree_bad_node(node, level))
545 index = nilfs_btree_node_get_nchildren(node) - 1;
546 ptr = nilfs_btree_node_get_ptr(btree, node, index);
547 path[level].bp_index = index;
551 *keyp = nilfs_btree_node_get_key(node, index);
558 static int nilfs_btree_lookup(const struct nilfs_bmap *bmap,
559 __u64 key, int level, __u64 *ptrp)
561 struct nilfs_btree *btree;
562 struct nilfs_btree_path *path;
566 btree = (struct nilfs_btree *)bmap;
567 path = nilfs_btree_alloc_path();
571 ret = nilfs_btree_do_lookup(btree, path, key, &ptr, level);
576 nilfs_btree_release_path(path);
577 nilfs_btree_free_path(path);
582 static int nilfs_btree_lookup_contig(const struct nilfs_bmap *bmap,
583 __u64 key, __u64 *ptrp, unsigned maxblocks)
585 struct nilfs_btree *btree = (struct nilfs_btree *)bmap;
586 struct nilfs_btree_path *path;
587 struct nilfs_btree_node *node;
588 struct inode *dat = NULL;
591 int level = NILFS_BTREE_LEVEL_NODE_MIN;
592 int ret, cnt, index, maxlevel;
594 path = nilfs_btree_alloc_path();
598 ret = nilfs_btree_do_lookup(btree, path, key, &ptr, level);
602 if (NILFS_BMAP_USE_VBN(bmap)) {
603 dat = nilfs_bmap_get_dat(bmap);
604 ret = nilfs_dat_translate(dat, ptr, &blocknr);
610 if (cnt == maxblocks)
613 maxlevel = nilfs_btree_height(btree) - 1;
614 node = nilfs_btree_get_node(btree, path, level);
615 index = path[level].bp_index + 1;
617 while (index < nilfs_btree_node_get_nchildren(node)) {
618 if (nilfs_btree_node_get_key(node, index) !=
621 ptr2 = nilfs_btree_node_get_ptr(btree, node, index);
623 ret = nilfs_dat_translate(dat, ptr2, &blocknr);
628 if (ptr2 != ptr + cnt || ++cnt == maxblocks)
633 if (level == maxlevel)
636 /* look-up right sibling node */
637 node = nilfs_btree_get_node(btree, path, level + 1);
638 index = path[level + 1].bp_index + 1;
639 if (index >= nilfs_btree_node_get_nchildren(node) ||
640 nilfs_btree_node_get_key(node, index) != key + cnt)
642 ptr2 = nilfs_btree_node_get_ptr(btree, node, index);
643 path[level + 1].bp_index = index;
645 brelse(path[level].bp_bh);
646 path[level].bp_bh = NULL;
647 ret = nilfs_btree_get_block(btree, ptr2, &path[level].bp_bh);
650 node = nilfs_btree_get_nonroot_node(path, level);
652 path[level].bp_index = index;
658 nilfs_btree_release_path(path);
659 nilfs_btree_free_path(path);
663 static void nilfs_btree_promote_key(struct nilfs_btree *btree,
664 struct nilfs_btree_path *path,
665 int level, __u64 key)
667 if (level < nilfs_btree_height(btree) - 1) {
669 nilfs_btree_node_set_key(
670 nilfs_btree_get_nonroot_node(path, level),
671 path[level].bp_index, key);
672 if (!buffer_dirty(path[level].bp_bh))
673 nilfs_btnode_mark_dirty(path[level].bp_bh);
674 } while ((path[level].bp_index == 0) &&
675 (++level < nilfs_btree_height(btree) - 1));
679 if (level == nilfs_btree_height(btree) - 1) {
680 nilfs_btree_node_set_key(nilfs_btree_get_root(btree),
681 path[level].bp_index, key);
685 static void nilfs_btree_do_insert(struct nilfs_btree *btree,
686 struct nilfs_btree_path *path,
687 int level, __u64 *keyp, __u64 *ptrp)
689 struct nilfs_btree_node *node;
691 if (level < nilfs_btree_height(btree) - 1) {
692 node = nilfs_btree_get_nonroot_node(path, level);
693 nilfs_btree_node_insert(btree, node, *keyp, *ptrp,
694 path[level].bp_index);
695 if (!buffer_dirty(path[level].bp_bh))
696 nilfs_btnode_mark_dirty(path[level].bp_bh);
698 if (path[level].bp_index == 0)
699 nilfs_btree_promote_key(btree, path, level + 1,
700 nilfs_btree_node_get_key(node,
703 node = nilfs_btree_get_root(btree);
704 nilfs_btree_node_insert(btree, node, *keyp, *ptrp,
705 path[level].bp_index);
709 static void nilfs_btree_carry_left(struct nilfs_btree *btree,
710 struct nilfs_btree_path *path,
711 int level, __u64 *keyp, __u64 *ptrp)
713 struct nilfs_btree_node *node, *left;
714 int nchildren, lnchildren, n, move;
716 node = nilfs_btree_get_nonroot_node(path, level);
717 left = nilfs_btree_get_sib_node(path, level);
718 nchildren = nilfs_btree_node_get_nchildren(node);
719 lnchildren = nilfs_btree_node_get_nchildren(left);
722 n = (nchildren + lnchildren + 1) / 2 - lnchildren;
723 if (n > path[level].bp_index) {
724 /* move insert point */
729 nilfs_btree_node_move_left(btree, left, node, n);
731 if (!buffer_dirty(path[level].bp_bh))
732 nilfs_btnode_mark_dirty(path[level].bp_bh);
733 if (!buffer_dirty(path[level].bp_sib_bh))
734 nilfs_btnode_mark_dirty(path[level].bp_sib_bh);
736 nilfs_btree_promote_key(btree, path, level + 1,
737 nilfs_btree_node_get_key(node, 0));
740 brelse(path[level].bp_bh);
741 path[level].bp_bh = path[level].bp_sib_bh;
742 path[level].bp_sib_bh = NULL;
743 path[level].bp_index += lnchildren;
744 path[level + 1].bp_index--;
746 brelse(path[level].bp_sib_bh);
747 path[level].bp_sib_bh = NULL;
748 path[level].bp_index -= n;
751 nilfs_btree_do_insert(btree, path, level, keyp, ptrp);
754 static void nilfs_btree_carry_right(struct nilfs_btree *btree,
755 struct nilfs_btree_path *path,
756 int level, __u64 *keyp, __u64 *ptrp)
758 struct nilfs_btree_node *node, *right;
759 int nchildren, rnchildren, n, move;
761 node = nilfs_btree_get_nonroot_node(path, level);
762 right = nilfs_btree_get_sib_node(path, level);
763 nchildren = nilfs_btree_node_get_nchildren(node);
764 rnchildren = nilfs_btree_node_get_nchildren(right);
767 n = (nchildren + rnchildren + 1) / 2 - rnchildren;
768 if (n > nchildren - path[level].bp_index) {
769 /* move insert point */
774 nilfs_btree_node_move_right(btree, node, right, n);
776 if (!buffer_dirty(path[level].bp_bh))
777 nilfs_btnode_mark_dirty(path[level].bp_bh);
778 if (!buffer_dirty(path[level].bp_sib_bh))
779 nilfs_btnode_mark_dirty(path[level].bp_sib_bh);
781 path[level + 1].bp_index++;
782 nilfs_btree_promote_key(btree, path, level + 1,
783 nilfs_btree_node_get_key(right, 0));
784 path[level + 1].bp_index--;
787 brelse(path[level].bp_bh);
788 path[level].bp_bh = path[level].bp_sib_bh;
789 path[level].bp_sib_bh = NULL;
790 path[level].bp_index -= nilfs_btree_node_get_nchildren(node);
791 path[level + 1].bp_index++;
793 brelse(path[level].bp_sib_bh);
794 path[level].bp_sib_bh = NULL;
797 nilfs_btree_do_insert(btree, path, level, keyp, ptrp);
800 static void nilfs_btree_split(struct nilfs_btree *btree,
801 struct nilfs_btree_path *path,
802 int level, __u64 *keyp, __u64 *ptrp)
804 struct nilfs_btree_node *node, *right;
807 int nchildren, n, move;
809 node = nilfs_btree_get_nonroot_node(path, level);
810 right = nilfs_btree_get_sib_node(path, level);
811 nchildren = nilfs_btree_node_get_nchildren(node);
814 n = (nchildren + 1) / 2;
815 if (n > nchildren - path[level].bp_index) {
820 nilfs_btree_node_move_right(btree, node, right, n);
822 if (!buffer_dirty(path[level].bp_bh))
823 nilfs_btnode_mark_dirty(path[level].bp_bh);
824 if (!buffer_dirty(path[level].bp_sib_bh))
825 nilfs_btnode_mark_dirty(path[level].bp_sib_bh);
827 newkey = nilfs_btree_node_get_key(right, 0);
828 newptr = path[level].bp_newreq.bpr_ptr;
831 path[level].bp_index -= nilfs_btree_node_get_nchildren(node);
832 nilfs_btree_node_insert(btree, right, *keyp, *ptrp,
833 path[level].bp_index);
835 *keyp = nilfs_btree_node_get_key(right, 0);
836 *ptrp = path[level].bp_newreq.bpr_ptr;
838 brelse(path[level].bp_bh);
839 path[level].bp_bh = path[level].bp_sib_bh;
840 path[level].bp_sib_bh = NULL;
842 nilfs_btree_do_insert(btree, path, level, keyp, ptrp);
844 *keyp = nilfs_btree_node_get_key(right, 0);
845 *ptrp = path[level].bp_newreq.bpr_ptr;
847 brelse(path[level].bp_sib_bh);
848 path[level].bp_sib_bh = NULL;
851 path[level + 1].bp_index++;
854 static void nilfs_btree_grow(struct nilfs_btree *btree,
855 struct nilfs_btree_path *path,
856 int level, __u64 *keyp, __u64 *ptrp)
858 struct nilfs_btree_node *root, *child;
861 root = nilfs_btree_get_root(btree);
862 child = nilfs_btree_get_sib_node(path, level);
864 n = nilfs_btree_node_get_nchildren(root);
866 nilfs_btree_node_move_right(btree, root, child, n);
867 nilfs_btree_node_set_level(root, level + 1);
869 if (!buffer_dirty(path[level].bp_sib_bh))
870 nilfs_btnode_mark_dirty(path[level].bp_sib_bh);
872 path[level].bp_bh = path[level].bp_sib_bh;
873 path[level].bp_sib_bh = NULL;
875 nilfs_btree_do_insert(btree, path, level, keyp, ptrp);
877 *keyp = nilfs_btree_node_get_key(child, 0);
878 *ptrp = path[level].bp_newreq.bpr_ptr;
881 static __u64 nilfs_btree_find_near(const struct nilfs_btree *btree,
882 const struct nilfs_btree_path *path)
884 struct nilfs_btree_node *node;
888 return NILFS_BMAP_INVALID_PTR;
891 level = NILFS_BTREE_LEVEL_NODE_MIN;
892 if (path[level].bp_index > 0) {
893 node = nilfs_btree_get_node(btree, path, level);
894 return nilfs_btree_node_get_ptr(btree, node,
895 path[level].bp_index - 1);
899 level = NILFS_BTREE_LEVEL_NODE_MIN + 1;
900 if (level <= nilfs_btree_height(btree) - 1) {
901 node = nilfs_btree_get_node(btree, path, level);
902 return nilfs_btree_node_get_ptr(btree, node,
903 path[level].bp_index);
906 return NILFS_BMAP_INVALID_PTR;
909 static __u64 nilfs_btree_find_target_v(const struct nilfs_btree *btree,
910 const struct nilfs_btree_path *path,
915 ptr = nilfs_bmap_find_target_seq(&btree->bt_bmap, key);
916 if (ptr != NILFS_BMAP_INVALID_PTR)
917 /* sequential access */
920 ptr = nilfs_btree_find_near(btree, path);
921 if (ptr != NILFS_BMAP_INVALID_PTR)
926 return nilfs_bmap_find_target_in_group(&btree->bt_bmap);
929 static void nilfs_btree_set_target_v(struct nilfs_btree *btree, __u64 key,
932 btree->bt_bmap.b_last_allocated_key = key;
933 btree->bt_bmap.b_last_allocated_ptr = ptr;
936 static int nilfs_btree_prepare_insert(struct nilfs_btree *btree,
937 struct nilfs_btree_path *path,
938 int *levelp, __u64 key, __u64 ptr,
939 struct nilfs_bmap_stats *stats)
941 struct buffer_head *bh;
942 struct nilfs_btree_node *node, *parent, *sib;
944 int pindex, level, ret;
945 struct inode *dat = NULL;
947 stats->bs_nblocks = 0;
948 level = NILFS_BTREE_LEVEL_DATA;
950 /* allocate a new ptr for data block */
951 if (NILFS_BMAP_USE_VBN(&btree->bt_bmap)) {
952 path[level].bp_newreq.bpr_ptr =
953 nilfs_btree_find_target_v(btree, path, key);
954 dat = nilfs_bmap_get_dat(&btree->bt_bmap);
957 ret = nilfs_bmap_prepare_alloc_ptr(&btree->bt_bmap,
958 &path[level].bp_newreq, dat);
962 for (level = NILFS_BTREE_LEVEL_NODE_MIN;
963 level < nilfs_btree_height(btree) - 1;
965 node = nilfs_btree_get_nonroot_node(path, level);
966 if (nilfs_btree_node_get_nchildren(node) <
967 nilfs_btree_node_nchildren_max(node, btree)) {
968 path[level].bp_op = nilfs_btree_do_insert;
973 parent = nilfs_btree_get_node(btree, path, level + 1);
974 pindex = path[level + 1].bp_index;
978 sibptr = nilfs_btree_node_get_ptr(btree, parent,
980 ret = nilfs_btree_get_block(btree, sibptr, &bh);
982 goto err_out_child_node;
983 sib = (struct nilfs_btree_node *)bh->b_data;
984 if (nilfs_btree_node_get_nchildren(sib) <
985 nilfs_btree_node_nchildren_max(sib, btree)) {
986 path[level].bp_sib_bh = bh;
987 path[level].bp_op = nilfs_btree_carry_left;
996 nilfs_btree_node_get_nchildren(parent) - 1) {
997 sibptr = nilfs_btree_node_get_ptr(btree, parent,
999 ret = nilfs_btree_get_block(btree, sibptr, &bh);
1001 goto err_out_child_node;
1002 sib = (struct nilfs_btree_node *)bh->b_data;
1003 if (nilfs_btree_node_get_nchildren(sib) <
1004 nilfs_btree_node_nchildren_max(sib, btree)) {
1005 path[level].bp_sib_bh = bh;
1006 path[level].bp_op = nilfs_btree_carry_right;
1007 stats->bs_nblocks++;
1014 path[level].bp_newreq.bpr_ptr =
1015 path[level - 1].bp_newreq.bpr_ptr + 1;
1016 ret = nilfs_bmap_prepare_alloc_ptr(&btree->bt_bmap,
1017 &path[level].bp_newreq, dat);
1019 goto err_out_child_node;
1020 ret = nilfs_btree_get_new_block(btree,
1021 path[level].bp_newreq.bpr_ptr,
1024 goto err_out_curr_node;
1026 stats->bs_nblocks++;
1028 nilfs_btree_node_init(btree,
1029 (struct nilfs_btree_node *)bh->b_data,
1030 0, level, 0, NULL, NULL);
1031 path[level].bp_sib_bh = bh;
1032 path[level].bp_op = nilfs_btree_split;
1036 node = nilfs_btree_get_root(btree);
1037 if (nilfs_btree_node_get_nchildren(node) <
1038 nilfs_btree_node_nchildren_max(node, btree)) {
1039 path[level].bp_op = nilfs_btree_do_insert;
1040 stats->bs_nblocks++;
1045 path[level].bp_newreq.bpr_ptr = path[level - 1].bp_newreq.bpr_ptr + 1;
1046 ret = nilfs_bmap_prepare_alloc_ptr(&btree->bt_bmap,
1047 &path[level].bp_newreq, dat);
1049 goto err_out_child_node;
1050 ret = nilfs_btree_get_new_block(btree, path[level].bp_newreq.bpr_ptr,
1053 goto err_out_curr_node;
1055 nilfs_btree_node_init(btree, (struct nilfs_btree_node *)bh->b_data,
1056 0, level, 0, NULL, NULL);
1057 path[level].bp_sib_bh = bh;
1058 path[level].bp_op = nilfs_btree_grow;
1061 path[level].bp_op = nilfs_btree_do_insert;
1063 /* a newly-created node block and a data block are added */
1064 stats->bs_nblocks += 2;
1073 nilfs_bmap_abort_alloc_ptr(&btree->bt_bmap, &path[level].bp_newreq,
1076 for (level--; level > NILFS_BTREE_LEVEL_DATA; level--) {
1077 nilfs_btnode_delete(path[level].bp_sib_bh);
1078 nilfs_bmap_abort_alloc_ptr(&btree->bt_bmap,
1079 &path[level].bp_newreq, dat);
1083 nilfs_bmap_abort_alloc_ptr(&btree->bt_bmap, &path[level].bp_newreq,
1087 stats->bs_nblocks = 0;
1091 static void nilfs_btree_commit_insert(struct nilfs_btree *btree,
1092 struct nilfs_btree_path *path,
1093 int maxlevel, __u64 key, __u64 ptr)
1095 struct inode *dat = NULL;
1098 set_buffer_nilfs_volatile((struct buffer_head *)((unsigned long)ptr));
1099 ptr = path[NILFS_BTREE_LEVEL_DATA].bp_newreq.bpr_ptr;
1100 if (NILFS_BMAP_USE_VBN(&btree->bt_bmap)) {
1101 nilfs_btree_set_target_v(btree, key, ptr);
1102 dat = nilfs_bmap_get_dat(&btree->bt_bmap);
1105 for (level = NILFS_BTREE_LEVEL_NODE_MIN; level <= maxlevel; level++) {
1106 nilfs_bmap_commit_alloc_ptr(&btree->bt_bmap,
1107 &path[level - 1].bp_newreq, dat);
1108 path[level].bp_op(btree, path, level, &key, &ptr);
1111 if (!nilfs_bmap_dirty(&btree->bt_bmap))
1112 nilfs_bmap_set_dirty(&btree->bt_bmap);
1115 static int nilfs_btree_insert(struct nilfs_bmap *bmap, __u64 key, __u64 ptr)
1117 struct nilfs_btree *btree;
1118 struct nilfs_btree_path *path;
1119 struct nilfs_bmap_stats stats;
1122 btree = (struct nilfs_btree *)bmap;
1123 path = nilfs_btree_alloc_path();
1127 ret = nilfs_btree_do_lookup(btree, path, key, NULL,
1128 NILFS_BTREE_LEVEL_NODE_MIN);
1129 if (ret != -ENOENT) {
1135 ret = nilfs_btree_prepare_insert(btree, path, &level, key, ptr, &stats);
1138 nilfs_btree_commit_insert(btree, path, level, key, ptr);
1139 nilfs_bmap_add_blocks(bmap, stats.bs_nblocks);
1142 nilfs_btree_release_path(path);
1143 nilfs_btree_free_path(path);
1147 static void nilfs_btree_do_delete(struct nilfs_btree *btree,
1148 struct nilfs_btree_path *path,
1149 int level, __u64 *keyp, __u64 *ptrp)
1151 struct nilfs_btree_node *node;
1153 if (level < nilfs_btree_height(btree) - 1) {
1154 node = nilfs_btree_get_nonroot_node(path, level);
1155 nilfs_btree_node_delete(btree, node, keyp, ptrp,
1156 path[level].bp_index);
1157 if (!buffer_dirty(path[level].bp_bh))
1158 nilfs_btnode_mark_dirty(path[level].bp_bh);
1159 if (path[level].bp_index == 0)
1160 nilfs_btree_promote_key(btree, path, level + 1,
1161 nilfs_btree_node_get_key(node, 0));
1163 node = nilfs_btree_get_root(btree);
1164 nilfs_btree_node_delete(btree, node, keyp, ptrp,
1165 path[level].bp_index);
1169 static void nilfs_btree_borrow_left(struct nilfs_btree *btree,
1170 struct nilfs_btree_path *path,
1171 int level, __u64 *keyp, __u64 *ptrp)
1173 struct nilfs_btree_node *node, *left;
1174 int nchildren, lnchildren, n;
1176 nilfs_btree_do_delete(btree, path, level, keyp, ptrp);
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 nilfs_btree_promote_key(btree, path, level + 1,
1193 nilfs_btree_node_get_key(node, 0));
1195 brelse(path[level].bp_sib_bh);
1196 path[level].bp_sib_bh = NULL;
1197 path[level].bp_index += n;
1200 static void nilfs_btree_borrow_right(struct nilfs_btree *btree,
1201 struct nilfs_btree_path *path,
1202 int level, __u64 *keyp, __u64 *ptrp)
1204 struct nilfs_btree_node *node, *right;
1205 int nchildren, rnchildren, n;
1207 nilfs_btree_do_delete(btree, path, level, keyp, ptrp);
1209 node = nilfs_btree_get_nonroot_node(path, level);
1210 right = nilfs_btree_get_sib_node(path, level);
1211 nchildren = nilfs_btree_node_get_nchildren(node);
1212 rnchildren = nilfs_btree_node_get_nchildren(right);
1214 n = (nchildren + rnchildren) / 2 - nchildren;
1216 nilfs_btree_node_move_left(btree, node, right, n);
1218 if (!buffer_dirty(path[level].bp_bh))
1219 nilfs_btnode_mark_dirty(path[level].bp_bh);
1220 if (!buffer_dirty(path[level].bp_sib_bh))
1221 nilfs_btnode_mark_dirty(path[level].bp_sib_bh);
1223 path[level + 1].bp_index++;
1224 nilfs_btree_promote_key(btree, path, level + 1,
1225 nilfs_btree_node_get_key(right, 0));
1226 path[level + 1].bp_index--;
1228 brelse(path[level].bp_sib_bh);
1229 path[level].bp_sib_bh = NULL;
1232 static void nilfs_btree_concat_left(struct nilfs_btree *btree,
1233 struct nilfs_btree_path *path,
1234 int level, __u64 *keyp, __u64 *ptrp)
1236 struct nilfs_btree_node *node, *left;
1239 nilfs_btree_do_delete(btree, path, level, keyp, ptrp);
1241 node = nilfs_btree_get_nonroot_node(path, level);
1242 left = nilfs_btree_get_sib_node(path, level);
1244 n = nilfs_btree_node_get_nchildren(node);
1246 nilfs_btree_node_move_left(btree, left, node, n);
1248 if (!buffer_dirty(path[level].bp_sib_bh))
1249 nilfs_btnode_mark_dirty(path[level].bp_sib_bh);
1251 nilfs_btnode_delete(path[level].bp_bh);
1252 path[level].bp_bh = path[level].bp_sib_bh;
1253 path[level].bp_sib_bh = NULL;
1254 path[level].bp_index += nilfs_btree_node_get_nchildren(left);
1257 static void nilfs_btree_concat_right(struct nilfs_btree *btree,
1258 struct nilfs_btree_path *path,
1259 int level, __u64 *keyp, __u64 *ptrp)
1261 struct nilfs_btree_node *node, *right;
1264 nilfs_btree_do_delete(btree, path, level, keyp, ptrp);
1266 node = nilfs_btree_get_nonroot_node(path, level);
1267 right = nilfs_btree_get_sib_node(path, level);
1269 n = nilfs_btree_node_get_nchildren(right);
1271 nilfs_btree_node_move_left(btree, node, right, n);
1273 if (!buffer_dirty(path[level].bp_bh))
1274 nilfs_btnode_mark_dirty(path[level].bp_bh);
1276 nilfs_btnode_delete(path[level].bp_sib_bh);
1277 path[level].bp_sib_bh = NULL;
1278 path[level + 1].bp_index++;
1281 static void nilfs_btree_shrink(struct nilfs_btree *btree,
1282 struct nilfs_btree_path *path,
1283 int level, __u64 *keyp, __u64 *ptrp)
1285 struct nilfs_btree_node *root, *child;
1288 nilfs_btree_do_delete(btree, path, level, keyp, ptrp);
1290 root = nilfs_btree_get_root(btree);
1291 child = nilfs_btree_get_nonroot_node(path, level);
1293 nilfs_btree_node_delete(btree, root, NULL, NULL, 0);
1294 nilfs_btree_node_set_level(root, level);
1295 n = nilfs_btree_node_get_nchildren(child);
1296 nilfs_btree_node_move_left(btree, root, child, n);
1298 nilfs_btnode_delete(path[level].bp_bh);
1299 path[level].bp_bh = NULL;
1303 static int nilfs_btree_prepare_delete(struct nilfs_btree *btree,
1304 struct nilfs_btree_path *path,
1306 struct nilfs_bmap_stats *stats,
1309 struct buffer_head *bh;
1310 struct nilfs_btree_node *node, *parent, *sib;
1312 int pindex, level, ret;
1315 stats->bs_nblocks = 0;
1316 for (level = NILFS_BTREE_LEVEL_NODE_MIN;
1317 level < nilfs_btree_height(btree) - 1;
1319 node = nilfs_btree_get_nonroot_node(path, level);
1320 path[level].bp_oldreq.bpr_ptr =
1321 nilfs_btree_node_get_ptr(btree, node,
1322 path[level].bp_index);
1323 ret = nilfs_bmap_prepare_end_ptr(&btree->bt_bmap,
1324 &path[level].bp_oldreq, dat);
1326 goto err_out_child_node;
1328 if (nilfs_btree_node_get_nchildren(node) >
1329 nilfs_btree_node_nchildren_min(node, btree)) {
1330 path[level].bp_op = nilfs_btree_do_delete;
1331 stats->bs_nblocks++;
1335 parent = nilfs_btree_get_node(btree, path, level + 1);
1336 pindex = path[level + 1].bp_index;
1340 sibptr = nilfs_btree_node_get_ptr(btree, parent,
1342 ret = nilfs_btree_get_block(btree, sibptr, &bh);
1344 goto err_out_curr_node;
1345 sib = (struct nilfs_btree_node *)bh->b_data;
1346 if (nilfs_btree_node_get_nchildren(sib) >
1347 nilfs_btree_node_nchildren_min(sib, btree)) {
1348 path[level].bp_sib_bh = bh;
1349 path[level].bp_op = nilfs_btree_borrow_left;
1350 stats->bs_nblocks++;
1353 path[level].bp_sib_bh = bh;
1354 path[level].bp_op = nilfs_btree_concat_left;
1355 stats->bs_nblocks++;
1359 nilfs_btree_node_get_nchildren(parent) - 1) {
1361 sibptr = nilfs_btree_node_get_ptr(btree, parent,
1363 ret = nilfs_btree_get_block(btree, sibptr, &bh);
1365 goto err_out_curr_node;
1366 sib = (struct nilfs_btree_node *)bh->b_data;
1367 if (nilfs_btree_node_get_nchildren(sib) >
1368 nilfs_btree_node_nchildren_min(sib, btree)) {
1369 path[level].bp_sib_bh = bh;
1370 path[level].bp_op = nilfs_btree_borrow_right;
1371 stats->bs_nblocks++;
1374 path[level].bp_sib_bh = bh;
1375 path[level].bp_op = nilfs_btree_concat_right;
1376 stats->bs_nblocks++;
1381 /* the only child of the root node */
1382 WARN_ON(level != nilfs_btree_height(btree) - 2);
1383 if (nilfs_btree_node_get_nchildren(node) - 1 <=
1384 NILFS_BTREE_ROOT_NCHILDREN_MAX) {
1385 path[level].bp_op = nilfs_btree_shrink;
1386 stats->bs_nblocks += 2;
1388 path[level].bp_op = nilfs_btree_do_delete;
1389 stats->bs_nblocks++;
1397 node = nilfs_btree_get_root(btree);
1398 path[level].bp_oldreq.bpr_ptr =
1399 nilfs_btree_node_get_ptr(btree, node, path[level].bp_index);
1401 ret = nilfs_bmap_prepare_end_ptr(&btree->bt_bmap,
1402 &path[level].bp_oldreq, dat);
1404 goto err_out_child_node;
1406 /* child of the root node is deleted */
1407 path[level].bp_op = nilfs_btree_do_delete;
1408 stats->bs_nblocks++;
1417 nilfs_bmap_abort_end_ptr(&btree->bt_bmap, &path[level].bp_oldreq, dat);
1419 for (level--; level >= NILFS_BTREE_LEVEL_NODE_MIN; level--) {
1420 brelse(path[level].bp_sib_bh);
1421 nilfs_bmap_abort_end_ptr(&btree->bt_bmap,
1422 &path[level].bp_oldreq, dat);
1425 stats->bs_nblocks = 0;
1429 static void nilfs_btree_commit_delete(struct nilfs_btree *btree,
1430 struct nilfs_btree_path *path,
1431 int maxlevel, struct inode *dat)
1435 for (level = NILFS_BTREE_LEVEL_NODE_MIN; level <= maxlevel; level++) {
1436 nilfs_bmap_commit_end_ptr(&btree->bt_bmap,
1437 &path[level].bp_oldreq, dat);
1438 path[level].bp_op(btree, path, level, NULL, NULL);
1441 if (!nilfs_bmap_dirty(&btree->bt_bmap))
1442 nilfs_bmap_set_dirty(&btree->bt_bmap);
1445 static int nilfs_btree_delete(struct nilfs_bmap *bmap, __u64 key)
1448 struct nilfs_btree *btree;
1449 struct nilfs_btree_path *path;
1450 struct nilfs_bmap_stats stats;
1454 btree = (struct nilfs_btree *)bmap;
1455 path = nilfs_btree_alloc_path();
1459 ret = nilfs_btree_do_lookup(btree, path, key, NULL,
1460 NILFS_BTREE_LEVEL_NODE_MIN);
1465 dat = NILFS_BMAP_USE_VBN(&btree->bt_bmap) ?
1466 nilfs_bmap_get_dat(&btree->bt_bmap) : NULL;
1468 ret = nilfs_btree_prepare_delete(btree, path, &level, &stats, dat);
1471 nilfs_btree_commit_delete(btree, path, level, dat);
1472 nilfs_bmap_sub_blocks(bmap, stats.bs_nblocks);
1475 nilfs_btree_release_path(path);
1476 nilfs_btree_free_path(path);
1480 static int nilfs_btree_last_key(const struct nilfs_bmap *bmap, __u64 *keyp)
1482 struct nilfs_btree *btree;
1483 struct nilfs_btree_path *path;
1486 btree = (struct nilfs_btree *)bmap;
1487 path = nilfs_btree_alloc_path();
1491 ret = nilfs_btree_do_lookup_last(btree, path, keyp, NULL);
1493 nilfs_btree_release_path(path);
1494 nilfs_btree_free_path(path);
1499 static int nilfs_btree_check_delete(struct nilfs_bmap *bmap, __u64 key)
1501 struct buffer_head *bh;
1502 struct nilfs_btree *btree;
1503 struct nilfs_btree_node *root, *node;
1504 __u64 maxkey, nextmaxkey;
1508 btree = (struct nilfs_btree *)bmap;
1509 root = nilfs_btree_get_root(btree);
1510 switch (nilfs_btree_height(btree)) {
1516 nchildren = nilfs_btree_node_get_nchildren(root);
1519 ptr = nilfs_btree_node_get_ptr(btree, root, nchildren - 1);
1520 ret = nilfs_btree_get_block(btree, ptr, &bh);
1523 node = (struct nilfs_btree_node *)bh->b_data;
1529 nchildren = nilfs_btree_node_get_nchildren(node);
1530 maxkey = nilfs_btree_node_get_key(node, nchildren - 1);
1531 nextmaxkey = (nchildren > 1) ?
1532 nilfs_btree_node_get_key(node, nchildren - 2) : 0;
1536 return (maxkey == key) && (nextmaxkey < NILFS_BMAP_LARGE_LOW);
1539 static int nilfs_btree_gather_data(struct nilfs_bmap *bmap,
1540 __u64 *keys, __u64 *ptrs, int nitems)
1542 struct buffer_head *bh;
1543 struct nilfs_btree *btree;
1544 struct nilfs_btree_node *node, *root;
1548 int nchildren, i, ret;
1550 btree = (struct nilfs_btree *)bmap;
1551 root = nilfs_btree_get_root(btree);
1552 switch (nilfs_btree_height(btree)) {
1558 nchildren = nilfs_btree_node_get_nchildren(root);
1559 WARN_ON(nchildren > 1);
1560 ptr = nilfs_btree_node_get_ptr(btree, root, nchildren - 1);
1561 ret = nilfs_btree_get_block(btree, ptr, &bh);
1564 node = (struct nilfs_btree_node *)bh->b_data;
1571 nchildren = nilfs_btree_node_get_nchildren(node);
1572 if (nchildren < nitems)
1574 dkeys = nilfs_btree_node_dkeys(node);
1575 dptrs = nilfs_btree_node_dptrs(node, btree);
1576 for (i = 0; i < nitems; i++) {
1577 keys[i] = nilfs_bmap_dkey_to_key(dkeys[i]);
1578 ptrs[i] = nilfs_bmap_dptr_to_ptr(dptrs[i]);
1588 nilfs_btree_prepare_convert_and_insert(struct nilfs_bmap *bmap, __u64 key,
1589 union nilfs_bmap_ptr_req *dreq,
1590 union nilfs_bmap_ptr_req *nreq,
1591 struct buffer_head **bhp,
1592 struct nilfs_bmap_stats *stats)
1594 struct buffer_head *bh;
1595 struct nilfs_btree *btree = (struct nilfs_btree *)bmap;
1596 struct inode *dat = NULL;
1599 stats->bs_nblocks = 0;
1602 /* cannot find near ptr */
1603 if (NILFS_BMAP_USE_VBN(bmap)) {
1604 dreq->bpr_ptr = nilfs_btree_find_target_v(btree, NULL, key);
1605 dat = nilfs_bmap_get_dat(bmap);
1608 ret = nilfs_bmap_prepare_alloc_ptr(bmap, dreq, dat);
1613 stats->bs_nblocks++;
1615 nreq->bpr_ptr = dreq->bpr_ptr + 1;
1616 ret = nilfs_bmap_prepare_alloc_ptr(bmap, nreq, dat);
1620 ret = nilfs_btree_get_new_block(btree, nreq->bpr_ptr, &bh);
1625 stats->bs_nblocks++;
1633 nilfs_bmap_abort_alloc_ptr(bmap, nreq, dat);
1635 nilfs_bmap_abort_alloc_ptr(bmap, dreq, dat);
1636 stats->bs_nblocks = 0;
1642 nilfs_btree_commit_convert_and_insert(struct nilfs_bmap *bmap,
1643 __u64 key, __u64 ptr,
1644 const __u64 *keys, const __u64 *ptrs,
1646 union nilfs_bmap_ptr_req *dreq,
1647 union nilfs_bmap_ptr_req *nreq,
1648 struct buffer_head *bh)
1650 struct nilfs_btree *btree = (struct nilfs_btree *)bmap;
1651 struct nilfs_btree_node *node;
1655 /* free resources */
1656 if (bmap->b_ops->bop_clear != NULL)
1657 bmap->b_ops->bop_clear(bmap);
1659 /* ptr must be a pointer to a buffer head. */
1660 set_buffer_nilfs_volatile((struct buffer_head *)((unsigned long)ptr));
1662 /* convert and insert */
1663 dat = NILFS_BMAP_USE_VBN(bmap) ? nilfs_bmap_get_dat(bmap) : NULL;
1664 nilfs_btree_init(bmap);
1666 nilfs_bmap_commit_alloc_ptr(bmap, dreq, dat);
1667 nilfs_bmap_commit_alloc_ptr(bmap, nreq, dat);
1669 /* create child node at level 1 */
1670 node = (struct nilfs_btree_node *)bh->b_data;
1671 nilfs_btree_node_init(btree, node, 0, 1, n, keys, ptrs);
1672 nilfs_btree_node_insert(btree, node,
1673 key, dreq->bpr_ptr, n);
1674 if (!buffer_dirty(bh))
1675 nilfs_btnode_mark_dirty(bh);
1676 if (!nilfs_bmap_dirty(bmap))
1677 nilfs_bmap_set_dirty(bmap);
1681 /* create root node at level 2 */
1682 node = nilfs_btree_get_root(btree);
1683 tmpptr = nreq->bpr_ptr;
1684 nilfs_btree_node_init(btree, node, NILFS_BTREE_NODE_ROOT,
1685 2, 1, &keys[0], &tmpptr);
1687 nilfs_bmap_commit_alloc_ptr(bmap, dreq, dat);
1689 /* create root node at level 1 */
1690 node = nilfs_btree_get_root(btree);
1691 nilfs_btree_node_init(btree, node, NILFS_BTREE_NODE_ROOT,
1693 nilfs_btree_node_insert(btree, node,
1694 key, dreq->bpr_ptr, n);
1695 if (!nilfs_bmap_dirty(bmap))
1696 nilfs_bmap_set_dirty(bmap);
1699 if (NILFS_BMAP_USE_VBN(bmap))
1700 nilfs_btree_set_target_v(btree, key, dreq->bpr_ptr);
1704 * nilfs_btree_convert_and_insert -
1712 int nilfs_btree_convert_and_insert(struct nilfs_bmap *bmap,
1713 __u64 key, __u64 ptr,
1714 const __u64 *keys, const __u64 *ptrs, int n)
1716 struct buffer_head *bh;
1717 union nilfs_bmap_ptr_req dreq, nreq, *di, *ni;
1718 struct nilfs_bmap_stats stats;
1721 if (n + 1 <= NILFS_BTREE_ROOT_NCHILDREN_MAX) {
1724 } else if ((n + 1) <= NILFS_BTREE_NODE_NCHILDREN_MAX(
1725 1 << bmap->b_inode->i_blkbits)) {
1734 ret = nilfs_btree_prepare_convert_and_insert(bmap, key, di, ni, &bh,
1738 nilfs_btree_commit_convert_and_insert(bmap, key, ptr, keys, ptrs, n,
1740 nilfs_bmap_add_blocks(bmap, stats.bs_nblocks);
1744 static int nilfs_btree_propagate_p(struct nilfs_btree *btree,
1745 struct nilfs_btree_path *path,
1747 struct buffer_head *bh)
1749 while ((++level < nilfs_btree_height(btree) - 1) &&
1750 !buffer_dirty(path[level].bp_bh))
1751 nilfs_btnode_mark_dirty(path[level].bp_bh);
1756 static int nilfs_btree_prepare_update_v(struct nilfs_btree *btree,
1757 struct nilfs_btree_path *path,
1758 int level, struct inode *dat)
1760 struct nilfs_btree_node *parent;
1763 parent = nilfs_btree_get_node(btree, path, level + 1);
1764 path[level].bp_oldreq.bpr_ptr =
1765 nilfs_btree_node_get_ptr(btree, parent,
1766 path[level + 1].bp_index);
1767 path[level].bp_newreq.bpr_ptr = path[level].bp_oldreq.bpr_ptr + 1;
1768 ret = nilfs_dat_prepare_update(dat, &path[level].bp_oldreq.bpr_req,
1769 &path[level].bp_newreq.bpr_req);
1773 if (buffer_nilfs_node(path[level].bp_bh)) {
1774 path[level].bp_ctxt.oldkey = path[level].bp_oldreq.bpr_ptr;
1775 path[level].bp_ctxt.newkey = path[level].bp_newreq.bpr_ptr;
1776 path[level].bp_ctxt.bh = path[level].bp_bh;
1777 ret = nilfs_btnode_prepare_change_key(
1778 &NILFS_BMAP_I(&btree->bt_bmap)->i_btnode_cache,
1779 &path[level].bp_ctxt);
1781 nilfs_dat_abort_update(dat,
1782 &path[level].bp_oldreq.bpr_req,
1783 &path[level].bp_newreq.bpr_req);
1791 static void nilfs_btree_commit_update_v(struct nilfs_btree *btree,
1792 struct nilfs_btree_path *path,
1793 int level, struct inode *dat)
1795 struct nilfs_btree_node *parent;
1797 nilfs_dat_commit_update(dat, &path[level].bp_oldreq.bpr_req,
1798 &path[level].bp_newreq.bpr_req,
1799 btree->bt_bmap.b_ptr_type == NILFS_BMAP_PTR_VS);
1801 if (buffer_nilfs_node(path[level].bp_bh)) {
1802 nilfs_btnode_commit_change_key(
1803 &NILFS_BMAP_I(&btree->bt_bmap)->i_btnode_cache,
1804 &path[level].bp_ctxt);
1805 path[level].bp_bh = path[level].bp_ctxt.bh;
1807 set_buffer_nilfs_volatile(path[level].bp_bh);
1809 parent = nilfs_btree_get_node(btree, path, level + 1);
1810 nilfs_btree_node_set_ptr(btree, parent, path[level + 1].bp_index,
1811 path[level].bp_newreq.bpr_ptr);
1814 static void nilfs_btree_abort_update_v(struct nilfs_btree *btree,
1815 struct nilfs_btree_path *path,
1816 int level, struct inode *dat)
1818 nilfs_dat_abort_update(dat, &path[level].bp_oldreq.bpr_req,
1819 &path[level].bp_newreq.bpr_req);
1820 if (buffer_nilfs_node(path[level].bp_bh))
1821 nilfs_btnode_abort_change_key(
1822 &NILFS_BMAP_I(&btree->bt_bmap)->i_btnode_cache,
1823 &path[level].bp_ctxt);
1826 static int nilfs_btree_prepare_propagate_v(struct nilfs_btree *btree,
1827 struct nilfs_btree_path *path,
1828 int minlevel, int *maxlevelp,
1834 if (!buffer_nilfs_volatile(path[level].bp_bh)) {
1835 ret = nilfs_btree_prepare_update_v(btree, path, level, dat);
1839 while ((++level < nilfs_btree_height(btree) - 1) &&
1840 !buffer_dirty(path[level].bp_bh)) {
1842 WARN_ON(buffer_nilfs_volatile(path[level].bp_bh));
1843 ret = nilfs_btree_prepare_update_v(btree, path, level, dat);
1849 *maxlevelp = level - 1;
1854 while (--level > minlevel)
1855 nilfs_btree_abort_update_v(btree, path, level, dat);
1856 if (!buffer_nilfs_volatile(path[level].bp_bh))
1857 nilfs_btree_abort_update_v(btree, path, level, dat);
1861 static void nilfs_btree_commit_propagate_v(struct nilfs_btree *btree,
1862 struct nilfs_btree_path *path,
1863 int minlevel, int maxlevel,
1864 struct buffer_head *bh,
1869 if (!buffer_nilfs_volatile(path[minlevel].bp_bh))
1870 nilfs_btree_commit_update_v(btree, path, minlevel, dat);
1872 for (level = minlevel + 1; level <= maxlevel; level++)
1873 nilfs_btree_commit_update_v(btree, path, level, dat);
1876 static int nilfs_btree_propagate_v(struct nilfs_btree *btree,
1877 struct nilfs_btree_path *path,
1878 int level, struct buffer_head *bh)
1880 int maxlevel = 0, ret;
1881 struct nilfs_btree_node *parent;
1882 struct inode *dat = nilfs_bmap_get_dat(&btree->bt_bmap);
1886 path[level].bp_bh = bh;
1887 ret = nilfs_btree_prepare_propagate_v(btree, path, level, &maxlevel,
1892 if (buffer_nilfs_volatile(path[level].bp_bh)) {
1893 parent = nilfs_btree_get_node(btree, path, level + 1);
1894 ptr = nilfs_btree_node_get_ptr(btree, parent,
1895 path[level + 1].bp_index);
1896 ret = nilfs_dat_mark_dirty(dat, ptr);
1901 nilfs_btree_commit_propagate_v(btree, path, level, maxlevel, bh, dat);
1904 brelse(path[level].bp_bh);
1905 path[level].bp_bh = NULL;
1909 static int nilfs_btree_propagate(const struct nilfs_bmap *bmap,
1910 struct buffer_head *bh)
1912 struct nilfs_btree *btree;
1913 struct nilfs_btree_path *path;
1914 struct nilfs_btree_node *node;
1918 WARN_ON(!buffer_dirty(bh));
1920 btree = (struct nilfs_btree *)bmap;
1921 path = nilfs_btree_alloc_path();
1925 if (buffer_nilfs_node(bh)) {
1926 node = (struct nilfs_btree_node *)bh->b_data;
1927 key = nilfs_btree_node_get_key(node, 0);
1928 level = nilfs_btree_node_get_level(node);
1930 key = nilfs_bmap_data_get_key(bmap, bh);
1931 level = NILFS_BTREE_LEVEL_DATA;
1934 ret = nilfs_btree_do_lookup(btree, path, key, NULL, level + 1);
1936 if (unlikely(ret == -ENOENT))
1937 printk(KERN_CRIT "%s: key = %llu, level == %d\n",
1938 __func__, (unsigned long long)key, level);
1942 ret = NILFS_BMAP_USE_VBN(bmap) ?
1943 nilfs_btree_propagate_v(btree, path, level, bh) :
1944 nilfs_btree_propagate_p(btree, path, level, bh);
1947 nilfs_btree_release_path(path);
1948 nilfs_btree_free_path(path);
1953 static int nilfs_btree_propagate_gc(const struct nilfs_bmap *bmap,
1954 struct buffer_head *bh)
1956 return nilfs_dat_mark_dirty(nilfs_bmap_get_dat(bmap), bh->b_blocknr);
1959 static void nilfs_btree_add_dirty_buffer(struct nilfs_btree *btree,
1960 struct list_head *lists,
1961 struct buffer_head *bh)
1963 struct list_head *head;
1964 struct buffer_head *cbh;
1965 struct nilfs_btree_node *node, *cnode;
1970 node = (struct nilfs_btree_node *)bh->b_data;
1971 key = nilfs_btree_node_get_key(node, 0);
1972 level = nilfs_btree_node_get_level(node);
1973 list_for_each(head, &lists[level]) {
1974 cbh = list_entry(head, struct buffer_head, b_assoc_buffers);
1975 cnode = (struct nilfs_btree_node *)cbh->b_data;
1976 ckey = nilfs_btree_node_get_key(cnode, 0);
1980 list_add_tail(&bh->b_assoc_buffers, head);
1983 static void nilfs_btree_lookup_dirty_buffers(struct nilfs_bmap *bmap,
1984 struct list_head *listp)
1986 struct nilfs_btree *btree = (struct nilfs_btree *)bmap;
1987 struct address_space *btcache = &NILFS_BMAP_I(bmap)->i_btnode_cache;
1988 struct list_head lists[NILFS_BTREE_LEVEL_MAX];
1989 struct pagevec pvec;
1990 struct buffer_head *bh, *head;
1994 for (level = NILFS_BTREE_LEVEL_NODE_MIN;
1995 level < NILFS_BTREE_LEVEL_MAX;
1997 INIT_LIST_HEAD(&lists[level]);
1999 pagevec_init(&pvec, 0);
2001 while (pagevec_lookup_tag(&pvec, btcache, &index, PAGECACHE_TAG_DIRTY,
2003 for (i = 0; i < pagevec_count(&pvec); i++) {
2004 bh = head = page_buffers(pvec.pages[i]);
2006 if (buffer_dirty(bh))
2007 nilfs_btree_add_dirty_buffer(btree,
2009 } while ((bh = bh->b_this_page) != head);
2011 pagevec_release(&pvec);
2015 for (level = NILFS_BTREE_LEVEL_NODE_MIN;
2016 level < NILFS_BTREE_LEVEL_MAX;
2018 list_splice_tail(&lists[level], listp);
2021 static int nilfs_btree_assign_p(struct nilfs_btree *btree,
2022 struct nilfs_btree_path *path,
2024 struct buffer_head **bh,
2026 union nilfs_binfo *binfo)
2028 struct nilfs_btree_node *parent;
2033 parent = nilfs_btree_get_node(btree, path, level + 1);
2034 ptr = nilfs_btree_node_get_ptr(btree, parent,
2035 path[level + 1].bp_index);
2036 if (buffer_nilfs_node(*bh)) {
2037 path[level].bp_ctxt.oldkey = ptr;
2038 path[level].bp_ctxt.newkey = blocknr;
2039 path[level].bp_ctxt.bh = *bh;
2040 ret = nilfs_btnode_prepare_change_key(
2041 &NILFS_BMAP_I(&btree->bt_bmap)->i_btnode_cache,
2042 &path[level].bp_ctxt);
2045 nilfs_btnode_commit_change_key(
2046 &NILFS_BMAP_I(&btree->bt_bmap)->i_btnode_cache,
2047 &path[level].bp_ctxt);
2048 *bh = path[level].bp_ctxt.bh;
2051 nilfs_btree_node_set_ptr(btree, parent,
2052 path[level + 1].bp_index, blocknr);
2054 key = nilfs_btree_node_get_key(parent, path[level + 1].bp_index);
2055 /* on-disk format */
2056 binfo->bi_dat.bi_blkoff = nilfs_bmap_key_to_dkey(key);
2057 binfo->bi_dat.bi_level = level;
2062 static int nilfs_btree_assign_v(struct nilfs_btree *btree,
2063 struct nilfs_btree_path *path,
2065 struct buffer_head **bh,
2067 union nilfs_binfo *binfo)
2069 struct nilfs_btree_node *parent;
2070 struct inode *dat = nilfs_bmap_get_dat(&btree->bt_bmap);
2073 union nilfs_bmap_ptr_req req;
2076 parent = nilfs_btree_get_node(btree, path, level + 1);
2077 ptr = nilfs_btree_node_get_ptr(btree, parent,
2078 path[level + 1].bp_index);
2080 ret = nilfs_dat_prepare_start(dat, &req.bpr_req);
2083 nilfs_dat_commit_start(dat, &req.bpr_req, blocknr);
2085 key = nilfs_btree_node_get_key(parent, path[level + 1].bp_index);
2086 /* on-disk format */
2087 binfo->bi_v.bi_vblocknr = nilfs_bmap_ptr_to_dptr(ptr);
2088 binfo->bi_v.bi_blkoff = nilfs_bmap_key_to_dkey(key);
2093 static int nilfs_btree_assign(struct nilfs_bmap *bmap,
2094 struct buffer_head **bh,
2096 union nilfs_binfo *binfo)
2098 struct nilfs_btree *btree;
2099 struct nilfs_btree_path *path;
2100 struct nilfs_btree_node *node;
2104 btree = (struct nilfs_btree *)bmap;
2105 path = nilfs_btree_alloc_path();
2109 if (buffer_nilfs_node(*bh)) {
2110 node = (struct nilfs_btree_node *)(*bh)->b_data;
2111 key = nilfs_btree_node_get_key(node, 0);
2112 level = nilfs_btree_node_get_level(node);
2114 key = nilfs_bmap_data_get_key(bmap, *bh);
2115 level = NILFS_BTREE_LEVEL_DATA;
2118 ret = nilfs_btree_do_lookup(btree, path, key, NULL, level + 1);
2120 WARN_ON(ret == -ENOENT);
2124 ret = NILFS_BMAP_USE_VBN(bmap) ?
2125 nilfs_btree_assign_v(btree, path, level, bh, blocknr, binfo) :
2126 nilfs_btree_assign_p(btree, path, level, bh, blocknr, binfo);
2129 nilfs_btree_release_path(path);
2130 nilfs_btree_free_path(path);
2135 static int nilfs_btree_assign_gc(struct nilfs_bmap *bmap,
2136 struct buffer_head **bh,
2138 union nilfs_binfo *binfo)
2140 struct nilfs_btree_node *node;
2144 ret = nilfs_dat_move(nilfs_bmap_get_dat(bmap), (*bh)->b_blocknr,
2149 if (buffer_nilfs_node(*bh)) {
2150 node = (struct nilfs_btree_node *)(*bh)->b_data;
2151 key = nilfs_btree_node_get_key(node, 0);
2153 key = nilfs_bmap_data_get_key(bmap, *bh);
2155 /* on-disk format */
2156 binfo->bi_v.bi_vblocknr = cpu_to_le64((*bh)->b_blocknr);
2157 binfo->bi_v.bi_blkoff = nilfs_bmap_key_to_dkey(key);
2162 static int nilfs_btree_mark(struct nilfs_bmap *bmap, __u64 key, int level)
2164 struct buffer_head *bh;
2165 struct nilfs_btree *btree;
2166 struct nilfs_btree_path *path;
2170 btree = (struct nilfs_btree *)bmap;
2171 path = nilfs_btree_alloc_path();
2175 ret = nilfs_btree_do_lookup(btree, path, key, &ptr, level + 1);
2177 WARN_ON(ret == -ENOENT);
2180 ret = nilfs_btree_get_block(btree, ptr, &bh);
2182 WARN_ON(ret == -ENOENT);
2186 if (!buffer_dirty(bh))
2187 nilfs_btnode_mark_dirty(bh);
2189 if (!nilfs_bmap_dirty(&btree->bt_bmap))
2190 nilfs_bmap_set_dirty(&btree->bt_bmap);
2193 nilfs_btree_release_path(path);
2194 nilfs_btree_free_path(path);
2198 static const struct nilfs_bmap_operations nilfs_btree_ops = {
2199 .bop_lookup = nilfs_btree_lookup,
2200 .bop_lookup_contig = nilfs_btree_lookup_contig,
2201 .bop_insert = nilfs_btree_insert,
2202 .bop_delete = nilfs_btree_delete,
2205 .bop_propagate = nilfs_btree_propagate,
2207 .bop_lookup_dirty_buffers = nilfs_btree_lookup_dirty_buffers,
2209 .bop_assign = nilfs_btree_assign,
2210 .bop_mark = nilfs_btree_mark,
2212 .bop_last_key = nilfs_btree_last_key,
2213 .bop_check_insert = NULL,
2214 .bop_check_delete = nilfs_btree_check_delete,
2215 .bop_gather_data = nilfs_btree_gather_data,
2218 static const struct nilfs_bmap_operations nilfs_btree_ops_gc = {
2220 .bop_lookup_contig = NULL,
2225 .bop_propagate = nilfs_btree_propagate_gc,
2227 .bop_lookup_dirty_buffers = nilfs_btree_lookup_dirty_buffers,
2229 .bop_assign = nilfs_btree_assign_gc,
2232 .bop_last_key = NULL,
2233 .bop_check_insert = NULL,
2234 .bop_check_delete = NULL,
2235 .bop_gather_data = NULL,
2238 int nilfs_btree_init(struct nilfs_bmap *bmap)
2240 bmap->b_ops = &nilfs_btree_ops;
2244 void nilfs_btree_init_gc(struct nilfs_bmap *bmap)
2246 bmap->b_ops = &nilfs_btree_ops_gc;