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;