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>
34 static struct nilfs_btree_path *nilfs_btree_alloc_path(void)
36 struct nilfs_btree_path *path;
37 int level = NILFS_BTREE_LEVEL_DATA;
39 path = kmem_cache_alloc(nilfs_btree_path_cache, GFP_NOFS);
43 for (; level < NILFS_BTREE_LEVEL_MAX; level++) {
44 path[level].bp_bh = NULL;
45 path[level].bp_sib_bh = NULL;
46 path[level].bp_index = 0;
47 path[level].bp_oldreq.bpr_ptr = NILFS_BMAP_INVALID_PTR;
48 path[level].bp_newreq.bpr_ptr = NILFS_BMAP_INVALID_PTR;
49 path[level].bp_op = NULL;
56 static void nilfs_btree_free_path(struct nilfs_btree_path *path)
58 int level = NILFS_BTREE_LEVEL_DATA;
60 for (; level < NILFS_BTREE_LEVEL_MAX; level++)
61 brelse(path[level].bp_bh);
63 kmem_cache_free(nilfs_btree_path_cache, path);
67 * B-tree node operations
69 static int nilfs_btree_get_block(const struct nilfs_bmap *btree, __u64 ptr,
70 struct buffer_head **bhp)
72 struct address_space *btnc = &NILFS_BMAP_I(btree)->i_btnode_cache;
73 struct buffer_head *bh;
76 err = nilfs_btnode_submit_block(btnc, ptr, 0, bhp);
78 return err == -EEXIST ? 0 : err;
82 if (!buffer_uptodate(bh)) {
86 if (nilfs_btree_broken_node_block(bh)) {
87 clear_buffer_uptodate(bh);
94 static int nilfs_btree_get_new_block(const struct nilfs_bmap *btree,
95 __u64 ptr, struct buffer_head **bhp)
97 struct address_space *btnc = &NILFS_BMAP_I(btree)->i_btnode_cache;
98 struct buffer_head *bh;
100 bh = nilfs_btnode_create_block(btnc, ptr);
104 set_buffer_nilfs_volatile(bh);
110 nilfs_btree_node_get_flags(const struct nilfs_btree_node *node)
112 return node->bn_flags;
116 nilfs_btree_node_set_flags(struct nilfs_btree_node *node, int flags)
118 node->bn_flags = flags;
121 static inline int nilfs_btree_node_root(const struct nilfs_btree_node *node)
123 return nilfs_btree_node_get_flags(node) & NILFS_BTREE_NODE_ROOT;
127 nilfs_btree_node_get_level(const struct nilfs_btree_node *node)
129 return node->bn_level;
133 nilfs_btree_node_set_level(struct nilfs_btree_node *node, int level)
135 node->bn_level = level;
139 nilfs_btree_node_get_nchildren(const struct nilfs_btree_node *node)
141 return le16_to_cpu(node->bn_nchildren);
145 nilfs_btree_node_set_nchildren(struct nilfs_btree_node *node, int nchildren)
147 node->bn_nchildren = cpu_to_le16(nchildren);
150 static inline int nilfs_btree_node_size(const struct nilfs_bmap *btree)
152 return 1 << btree->b_inode->i_blkbits;
156 nilfs_btree_node_nchildren_min(const struct nilfs_btree_node *node,
157 const struct nilfs_bmap *btree)
159 return nilfs_btree_node_root(node) ?
160 NILFS_BTREE_ROOT_NCHILDREN_MIN :
161 NILFS_BTREE_NODE_NCHILDREN_MIN(nilfs_btree_node_size(btree));
165 nilfs_btree_node_nchildren_max(const struct nilfs_btree_node *node,
166 const struct nilfs_bmap *btree)
168 return nilfs_btree_node_root(node) ?
169 NILFS_BTREE_ROOT_NCHILDREN_MAX :
170 NILFS_BTREE_NODE_NCHILDREN_MAX(nilfs_btree_node_size(btree));
173 static inline __le64 *
174 nilfs_btree_node_dkeys(const struct nilfs_btree_node *node)
176 return (__le64 *)((char *)(node + 1) +
177 (nilfs_btree_node_root(node) ?
178 0 : NILFS_BTREE_NODE_EXTRA_PAD_SIZE));
181 static inline __le64 *
182 nilfs_btree_node_dptrs(const struct nilfs_btree_node *node,
183 const struct nilfs_bmap *btree)
185 return (__le64 *)(nilfs_btree_node_dkeys(node) +
186 nilfs_btree_node_nchildren_max(node, btree));
190 nilfs_btree_node_get_key(const struct nilfs_btree_node *node, int index)
192 return le64_to_cpu(*(nilfs_btree_node_dkeys(node) + index));
196 nilfs_btree_node_set_key(struct nilfs_btree_node *node, int index, __u64 key)
198 *(nilfs_btree_node_dkeys(node) + index) = cpu_to_le64(key);
202 nilfs_btree_node_get_ptr(const struct nilfs_bmap *btree,
203 const struct nilfs_btree_node *node, int index)
205 return le64_to_cpu(*(nilfs_btree_node_dptrs(node, btree) + index));
209 nilfs_btree_node_set_ptr(struct nilfs_bmap *btree,
210 struct nilfs_btree_node *node, int index, __u64 ptr)
212 *(nilfs_btree_node_dptrs(node, btree) + index) = cpu_to_le64(ptr);
215 static void nilfs_btree_node_init(struct nilfs_bmap *btree,
216 struct nilfs_btree_node *node,
217 int flags, int level, int nchildren,
218 const __u64 *keys, const __u64 *ptrs)
224 nilfs_btree_node_set_flags(node, flags);
225 nilfs_btree_node_set_level(node, level);
226 nilfs_btree_node_set_nchildren(node, nchildren);
228 dkeys = nilfs_btree_node_dkeys(node);
229 dptrs = nilfs_btree_node_dptrs(node, btree);
230 for (i = 0; i < nchildren; i++) {
231 dkeys[i] = cpu_to_le64(keys[i]);
232 dptrs[i] = cpu_to_le64(ptrs[i]);
236 /* Assume the buffer heads corresponding to left and right are locked. */
237 static void nilfs_btree_node_move_left(struct nilfs_bmap *btree,
238 struct nilfs_btree_node *left,
239 struct nilfs_btree_node *right,
242 __le64 *ldkeys, *rdkeys;
243 __le64 *ldptrs, *rdptrs;
244 int lnchildren, rnchildren;
246 ldkeys = nilfs_btree_node_dkeys(left);
247 ldptrs = nilfs_btree_node_dptrs(left, btree);
248 lnchildren = nilfs_btree_node_get_nchildren(left);
250 rdkeys = nilfs_btree_node_dkeys(right);
251 rdptrs = nilfs_btree_node_dptrs(right, btree);
252 rnchildren = nilfs_btree_node_get_nchildren(right);
254 memcpy(ldkeys + lnchildren, rdkeys, n * sizeof(*rdkeys));
255 memcpy(ldptrs + lnchildren, rdptrs, n * sizeof(*rdptrs));
256 memmove(rdkeys, rdkeys + n, (rnchildren - n) * sizeof(*rdkeys));
257 memmove(rdptrs, rdptrs + n, (rnchildren - n) * sizeof(*rdptrs));
261 nilfs_btree_node_set_nchildren(left, lnchildren);
262 nilfs_btree_node_set_nchildren(right, rnchildren);
265 /* Assume that the buffer heads corresponding to left and right are locked. */
266 static void nilfs_btree_node_move_right(struct nilfs_bmap *btree,
267 struct nilfs_btree_node *left,
268 struct nilfs_btree_node *right,
271 __le64 *ldkeys, *rdkeys;
272 __le64 *ldptrs, *rdptrs;
273 int lnchildren, rnchildren;
275 ldkeys = nilfs_btree_node_dkeys(left);
276 ldptrs = nilfs_btree_node_dptrs(left, btree);
277 lnchildren = nilfs_btree_node_get_nchildren(left);
279 rdkeys = nilfs_btree_node_dkeys(right);
280 rdptrs = nilfs_btree_node_dptrs(right, btree);
281 rnchildren = nilfs_btree_node_get_nchildren(right);
283 memmove(rdkeys + n, rdkeys, rnchildren * sizeof(*rdkeys));
284 memmove(rdptrs + n, rdptrs, rnchildren * sizeof(*rdptrs));
285 memcpy(rdkeys, ldkeys + lnchildren - n, n * sizeof(*rdkeys));
286 memcpy(rdptrs, ldptrs + lnchildren - n, n * sizeof(*rdptrs));
290 nilfs_btree_node_set_nchildren(left, lnchildren);
291 nilfs_btree_node_set_nchildren(right, rnchildren);
294 /* Assume that the buffer head corresponding to node is locked. */
295 static void nilfs_btree_node_insert(struct nilfs_bmap *btree,
296 struct nilfs_btree_node *node,
297 __u64 key, __u64 ptr, int index)
303 dkeys = nilfs_btree_node_dkeys(node);
304 dptrs = nilfs_btree_node_dptrs(node, btree);
305 nchildren = nilfs_btree_node_get_nchildren(node);
306 if (index < nchildren) {
307 memmove(dkeys + index + 1, dkeys + index,
308 (nchildren - index) * sizeof(*dkeys));
309 memmove(dptrs + index + 1, dptrs + index,
310 (nchildren - index) * sizeof(*dptrs));
312 dkeys[index] = cpu_to_le64(key);
313 dptrs[index] = cpu_to_le64(ptr);
315 nilfs_btree_node_set_nchildren(node, nchildren);
318 /* Assume that the buffer head corresponding to node is locked. */
319 static void nilfs_btree_node_delete(struct nilfs_bmap *btree,
320 struct nilfs_btree_node *node,
321 __u64 *keyp, __u64 *ptrp, int index)
329 dkeys = nilfs_btree_node_dkeys(node);
330 dptrs = nilfs_btree_node_dptrs(node, btree);
331 key = le64_to_cpu(dkeys[index]);
332 ptr = le64_to_cpu(dptrs[index]);
333 nchildren = nilfs_btree_node_get_nchildren(node);
339 if (index < nchildren - 1) {
340 memmove(dkeys + index, dkeys + index + 1,
341 (nchildren - index - 1) * sizeof(*dkeys));
342 memmove(dptrs + index, dptrs + index + 1,
343 (nchildren - index - 1) * sizeof(*dptrs));
346 nilfs_btree_node_set_nchildren(node, nchildren);
349 static int nilfs_btree_node_lookup(const struct nilfs_btree_node *node,
350 __u64 key, int *indexp)
353 int index, low, high, s;
357 high = nilfs_btree_node_get_nchildren(node) - 1;
360 while (low <= high) {
361 index = (low + high) / 2;
362 nkey = nilfs_btree_node_get_key(node, index);
366 } else if (nkey < key) {
376 if (nilfs_btree_node_get_level(node) > NILFS_BTREE_LEVEL_NODE_MIN) {
377 if (s > 0 && index > 0)
389 * nilfs_btree_node_broken - verify consistency of btree node
390 * @node: btree node block to be examined
391 * @size: node size (in bytes)
392 * @blocknr: block number
394 * Return Value: If node is broken, 1 is returned. Otherwise, 0 is returned.
396 static int nilfs_btree_node_broken(const struct nilfs_btree_node *node,
397 size_t size, sector_t blocknr)
399 int level, flags, nchildren;
402 level = nilfs_btree_node_get_level(node);
403 flags = nilfs_btree_node_get_flags(node);
404 nchildren = nilfs_btree_node_get_nchildren(node);
406 if (unlikely(level < NILFS_BTREE_LEVEL_NODE_MIN ||
407 level >= NILFS_BTREE_LEVEL_MAX ||
408 (flags & NILFS_BTREE_NODE_ROOT) ||
410 nchildren > NILFS_BTREE_NODE_NCHILDREN_MAX(size))) {
411 printk(KERN_CRIT "NILFS: bad btree node (blocknr=%llu): "
412 "level = %d, flags = 0x%x, nchildren = %d\n",
413 (unsigned long long)blocknr, level, flags, nchildren);
419 int nilfs_btree_broken_node_block(struct buffer_head *bh)
421 return nilfs_btree_node_broken((struct nilfs_btree_node *)bh->b_data,
422 bh->b_size, bh->b_blocknr);
425 static inline struct nilfs_btree_node *
426 nilfs_btree_get_root(const struct nilfs_bmap *btree)
428 return (struct nilfs_btree_node *)btree->b_u.u_data;
431 static inline struct nilfs_btree_node *
432 nilfs_btree_get_nonroot_node(const struct nilfs_btree_path *path, int level)
434 return (struct nilfs_btree_node *)path[level].bp_bh->b_data;
437 static inline struct nilfs_btree_node *
438 nilfs_btree_get_sib_node(const struct nilfs_btree_path *path, int level)
440 return (struct nilfs_btree_node *)path[level].bp_sib_bh->b_data;
443 static inline int nilfs_btree_height(const struct nilfs_bmap *btree)
445 return nilfs_btree_node_get_level(nilfs_btree_get_root(btree)) + 1;
448 static inline struct nilfs_btree_node *
449 nilfs_btree_get_node(const struct nilfs_bmap *btree,
450 const struct nilfs_btree_path *path,
453 return (level == nilfs_btree_height(btree) - 1) ?
454 nilfs_btree_get_root(btree) :
455 nilfs_btree_get_nonroot_node(path, level);
459 nilfs_btree_bad_node(struct nilfs_btree_node *node, int level)
461 if (unlikely(nilfs_btree_node_get_level(node) != level)) {
463 printk(KERN_CRIT "NILFS: btree level mismatch: %d != %d\n",
464 nilfs_btree_node_get_level(node), level);
470 static int nilfs_btree_do_lookup(const struct nilfs_bmap *btree,
471 struct nilfs_btree_path *path,
472 __u64 key, __u64 *ptrp, int minlevel)
474 struct nilfs_btree_node *node;
476 int level, index, found, ret;
478 node = nilfs_btree_get_root(btree);
479 level = nilfs_btree_node_get_level(node);
480 if (level < minlevel || nilfs_btree_node_get_nchildren(node) <= 0)
483 found = nilfs_btree_node_lookup(node, key, &index);
484 ptr = nilfs_btree_node_get_ptr(btree, node, index);
485 path[level].bp_bh = NULL;
486 path[level].bp_index = index;
488 for (level--; level >= minlevel; level--) {
489 ret = nilfs_btree_get_block(btree, ptr, &path[level].bp_bh);
492 node = nilfs_btree_get_nonroot_node(path, level);
493 if (nilfs_btree_bad_node(node, level))
496 found = nilfs_btree_node_lookup(node, key, &index);
499 if (index < nilfs_btree_node_nchildren_max(node, btree))
500 ptr = nilfs_btree_node_get_ptr(btree, node, index);
502 WARN_ON(found || level != NILFS_BTREE_LEVEL_NODE_MIN);
504 ptr = NILFS_BMAP_INVALID_PTR;
506 path[level].bp_index = index;
517 static int nilfs_btree_do_lookup_last(const struct nilfs_bmap *btree,
518 struct nilfs_btree_path *path,
519 __u64 *keyp, __u64 *ptrp)
521 struct nilfs_btree_node *node;
523 int index, level, ret;
525 node = nilfs_btree_get_root(btree);
526 index = nilfs_btree_node_get_nchildren(node) - 1;
529 level = nilfs_btree_node_get_level(node);
530 ptr = nilfs_btree_node_get_ptr(btree, node, index);
531 path[level].bp_bh = NULL;
532 path[level].bp_index = index;
534 for (level--; level > 0; level--) {
535 ret = nilfs_btree_get_block(btree, ptr, &path[level].bp_bh);
538 node = nilfs_btree_get_nonroot_node(path, level);
539 if (nilfs_btree_bad_node(node, level))
541 index = nilfs_btree_node_get_nchildren(node) - 1;
542 ptr = nilfs_btree_node_get_ptr(btree, node, index);
543 path[level].bp_index = index;
547 *keyp = nilfs_btree_node_get_key(node, index);
554 static int nilfs_btree_lookup(const struct nilfs_bmap *btree,
555 __u64 key, int level, __u64 *ptrp)
557 struct nilfs_btree_path *path;
560 path = nilfs_btree_alloc_path();
564 ret = nilfs_btree_do_lookup(btree, path, key, ptrp, level);
566 nilfs_btree_free_path(path);
571 static int nilfs_btree_lookup_contig(const struct nilfs_bmap *btree,
572 __u64 key, __u64 *ptrp, unsigned maxblocks)
574 struct nilfs_btree_path *path;
575 struct nilfs_btree_node *node;
576 struct inode *dat = NULL;
579 int level = NILFS_BTREE_LEVEL_NODE_MIN;
580 int ret, cnt, index, maxlevel;
582 path = nilfs_btree_alloc_path();
586 ret = nilfs_btree_do_lookup(btree, path, key, &ptr, level);
590 if (NILFS_BMAP_USE_VBN(btree)) {
591 dat = nilfs_bmap_get_dat(btree);
592 ret = nilfs_dat_translate(dat, ptr, &blocknr);
598 if (cnt == maxblocks)
601 maxlevel = nilfs_btree_height(btree) - 1;
602 node = nilfs_btree_get_node(btree, path, level);
603 index = path[level].bp_index + 1;
605 while (index < nilfs_btree_node_get_nchildren(node)) {
606 if (nilfs_btree_node_get_key(node, index) !=
609 ptr2 = nilfs_btree_node_get_ptr(btree, node, index);
611 ret = nilfs_dat_translate(dat, ptr2, &blocknr);
616 if (ptr2 != ptr + cnt || ++cnt == maxblocks)
621 if (level == maxlevel)
624 /* look-up right sibling node */
625 node = nilfs_btree_get_node(btree, path, level + 1);
626 index = path[level + 1].bp_index + 1;
627 if (index >= nilfs_btree_node_get_nchildren(node) ||
628 nilfs_btree_node_get_key(node, index) != key + cnt)
630 ptr2 = nilfs_btree_node_get_ptr(btree, node, index);
631 path[level + 1].bp_index = index;
633 brelse(path[level].bp_bh);
634 path[level].bp_bh = NULL;
635 ret = nilfs_btree_get_block(btree, ptr2, &path[level].bp_bh);
638 node = nilfs_btree_get_nonroot_node(path, level);
640 path[level].bp_index = index;
646 nilfs_btree_free_path(path);
650 static void nilfs_btree_promote_key(struct nilfs_bmap *btree,
651 struct nilfs_btree_path *path,
652 int level, __u64 key)
654 if (level < nilfs_btree_height(btree) - 1) {
656 nilfs_btree_node_set_key(
657 nilfs_btree_get_nonroot_node(path, level),
658 path[level].bp_index, key);
659 if (!buffer_dirty(path[level].bp_bh))
660 nilfs_btnode_mark_dirty(path[level].bp_bh);
661 } while ((path[level].bp_index == 0) &&
662 (++level < nilfs_btree_height(btree) - 1));
666 if (level == nilfs_btree_height(btree) - 1) {
667 nilfs_btree_node_set_key(nilfs_btree_get_root(btree),
668 path[level].bp_index, key);
672 static void nilfs_btree_do_insert(struct nilfs_bmap *btree,
673 struct nilfs_btree_path *path,
674 int level, __u64 *keyp, __u64 *ptrp)
676 struct nilfs_btree_node *node;
678 if (level < nilfs_btree_height(btree) - 1) {
679 node = nilfs_btree_get_nonroot_node(path, level);
680 nilfs_btree_node_insert(btree, node, *keyp, *ptrp,
681 path[level].bp_index);
682 if (!buffer_dirty(path[level].bp_bh))
683 nilfs_btnode_mark_dirty(path[level].bp_bh);
685 if (path[level].bp_index == 0)
686 nilfs_btree_promote_key(btree, path, level + 1,
687 nilfs_btree_node_get_key(node,
690 node = nilfs_btree_get_root(btree);
691 nilfs_btree_node_insert(btree, node, *keyp, *ptrp,
692 path[level].bp_index);
696 static void nilfs_btree_carry_left(struct nilfs_bmap *btree,
697 struct nilfs_btree_path *path,
698 int level, __u64 *keyp, __u64 *ptrp)
700 struct nilfs_btree_node *node, *left;
701 int nchildren, lnchildren, n, move;
703 node = nilfs_btree_get_nonroot_node(path, level);
704 left = nilfs_btree_get_sib_node(path, level);
705 nchildren = nilfs_btree_node_get_nchildren(node);
706 lnchildren = nilfs_btree_node_get_nchildren(left);
709 n = (nchildren + lnchildren + 1) / 2 - lnchildren;
710 if (n > path[level].bp_index) {
711 /* move insert point */
716 nilfs_btree_node_move_left(btree, left, node, n);
718 if (!buffer_dirty(path[level].bp_bh))
719 nilfs_btnode_mark_dirty(path[level].bp_bh);
720 if (!buffer_dirty(path[level].bp_sib_bh))
721 nilfs_btnode_mark_dirty(path[level].bp_sib_bh);
723 nilfs_btree_promote_key(btree, path, level + 1,
724 nilfs_btree_node_get_key(node, 0));
727 brelse(path[level].bp_bh);
728 path[level].bp_bh = path[level].bp_sib_bh;
729 path[level].bp_sib_bh = NULL;
730 path[level].bp_index += lnchildren;
731 path[level + 1].bp_index--;
733 brelse(path[level].bp_sib_bh);
734 path[level].bp_sib_bh = NULL;
735 path[level].bp_index -= n;
738 nilfs_btree_do_insert(btree, path, level, keyp, ptrp);
741 static void nilfs_btree_carry_right(struct nilfs_bmap *btree,
742 struct nilfs_btree_path *path,
743 int level, __u64 *keyp, __u64 *ptrp)
745 struct nilfs_btree_node *node, *right;
746 int nchildren, rnchildren, n, move;
748 node = nilfs_btree_get_nonroot_node(path, level);
749 right = nilfs_btree_get_sib_node(path, level);
750 nchildren = nilfs_btree_node_get_nchildren(node);
751 rnchildren = nilfs_btree_node_get_nchildren(right);
754 n = (nchildren + rnchildren + 1) / 2 - rnchildren;
755 if (n > nchildren - path[level].bp_index) {
756 /* move insert point */
761 nilfs_btree_node_move_right(btree, node, right, n);
763 if (!buffer_dirty(path[level].bp_bh))
764 nilfs_btnode_mark_dirty(path[level].bp_bh);
765 if (!buffer_dirty(path[level].bp_sib_bh))
766 nilfs_btnode_mark_dirty(path[level].bp_sib_bh);
768 path[level + 1].bp_index++;
769 nilfs_btree_promote_key(btree, path, level + 1,
770 nilfs_btree_node_get_key(right, 0));
771 path[level + 1].bp_index--;
774 brelse(path[level].bp_bh);
775 path[level].bp_bh = path[level].bp_sib_bh;
776 path[level].bp_sib_bh = NULL;
777 path[level].bp_index -= nilfs_btree_node_get_nchildren(node);
778 path[level + 1].bp_index++;
780 brelse(path[level].bp_sib_bh);
781 path[level].bp_sib_bh = NULL;
784 nilfs_btree_do_insert(btree, path, level, keyp, ptrp);
787 static void nilfs_btree_split(struct nilfs_bmap *btree,
788 struct nilfs_btree_path *path,
789 int level, __u64 *keyp, __u64 *ptrp)
791 struct nilfs_btree_node *node, *right;
794 int nchildren, n, move;
796 node = nilfs_btree_get_nonroot_node(path, level);
797 right = nilfs_btree_get_sib_node(path, level);
798 nchildren = nilfs_btree_node_get_nchildren(node);
801 n = (nchildren + 1) / 2;
802 if (n > nchildren - path[level].bp_index) {
807 nilfs_btree_node_move_right(btree, node, right, n);
809 if (!buffer_dirty(path[level].bp_bh))
810 nilfs_btnode_mark_dirty(path[level].bp_bh);
811 if (!buffer_dirty(path[level].bp_sib_bh))
812 nilfs_btnode_mark_dirty(path[level].bp_sib_bh);
814 newkey = nilfs_btree_node_get_key(right, 0);
815 newptr = path[level].bp_newreq.bpr_ptr;
818 path[level].bp_index -= nilfs_btree_node_get_nchildren(node);
819 nilfs_btree_node_insert(btree, right, *keyp, *ptrp,
820 path[level].bp_index);
822 *keyp = nilfs_btree_node_get_key(right, 0);
823 *ptrp = path[level].bp_newreq.bpr_ptr;
825 brelse(path[level].bp_bh);
826 path[level].bp_bh = path[level].bp_sib_bh;
827 path[level].bp_sib_bh = NULL;
829 nilfs_btree_do_insert(btree, path, level, keyp, ptrp);
831 *keyp = nilfs_btree_node_get_key(right, 0);
832 *ptrp = path[level].bp_newreq.bpr_ptr;
834 brelse(path[level].bp_sib_bh);
835 path[level].bp_sib_bh = NULL;
838 path[level + 1].bp_index++;
841 static void nilfs_btree_grow(struct nilfs_bmap *btree,
842 struct nilfs_btree_path *path,
843 int level, __u64 *keyp, __u64 *ptrp)
845 struct nilfs_btree_node *root, *child;
848 root = nilfs_btree_get_root(btree);
849 child = nilfs_btree_get_sib_node(path, level);
851 n = nilfs_btree_node_get_nchildren(root);
853 nilfs_btree_node_move_right(btree, root, child, n);
854 nilfs_btree_node_set_level(root, level + 1);
856 if (!buffer_dirty(path[level].bp_sib_bh))
857 nilfs_btnode_mark_dirty(path[level].bp_sib_bh);
859 path[level].bp_bh = path[level].bp_sib_bh;
860 path[level].bp_sib_bh = NULL;
862 nilfs_btree_do_insert(btree, path, level, keyp, ptrp);
864 *keyp = nilfs_btree_node_get_key(child, 0);
865 *ptrp = path[level].bp_newreq.bpr_ptr;
868 static __u64 nilfs_btree_find_near(const struct nilfs_bmap *btree,
869 const struct nilfs_btree_path *path)
871 struct nilfs_btree_node *node;
875 return NILFS_BMAP_INVALID_PTR;
878 level = NILFS_BTREE_LEVEL_NODE_MIN;
879 if (path[level].bp_index > 0) {
880 node = nilfs_btree_get_node(btree, path, level);
881 return nilfs_btree_node_get_ptr(btree, node,
882 path[level].bp_index - 1);
886 level = NILFS_BTREE_LEVEL_NODE_MIN + 1;
887 if (level <= nilfs_btree_height(btree) - 1) {
888 node = nilfs_btree_get_node(btree, path, level);
889 return nilfs_btree_node_get_ptr(btree, node,
890 path[level].bp_index);
893 return NILFS_BMAP_INVALID_PTR;
896 static __u64 nilfs_btree_find_target_v(const struct nilfs_bmap *btree,
897 const struct nilfs_btree_path *path,
902 ptr = nilfs_bmap_find_target_seq(btree, key);
903 if (ptr != NILFS_BMAP_INVALID_PTR)
904 /* sequential access */
907 ptr = nilfs_btree_find_near(btree, path);
908 if (ptr != NILFS_BMAP_INVALID_PTR)
913 return nilfs_bmap_find_target_in_group(btree);
916 static int nilfs_btree_prepare_insert(struct nilfs_bmap *btree,
917 struct nilfs_btree_path *path,
918 int *levelp, __u64 key, __u64 ptr,
919 struct nilfs_bmap_stats *stats)
921 struct buffer_head *bh;
922 struct nilfs_btree_node *node, *parent, *sib;
924 int pindex, level, ret;
925 struct inode *dat = NULL;
927 stats->bs_nblocks = 0;
928 level = NILFS_BTREE_LEVEL_DATA;
930 /* allocate a new ptr for data block */
931 if (NILFS_BMAP_USE_VBN(btree)) {
932 path[level].bp_newreq.bpr_ptr =
933 nilfs_btree_find_target_v(btree, path, key);
934 dat = nilfs_bmap_get_dat(btree);
937 ret = nilfs_bmap_prepare_alloc_ptr(btree, &path[level].bp_newreq, dat);
941 for (level = NILFS_BTREE_LEVEL_NODE_MIN;
942 level < nilfs_btree_height(btree) - 1;
944 node = nilfs_btree_get_nonroot_node(path, level);
945 if (nilfs_btree_node_get_nchildren(node) <
946 nilfs_btree_node_nchildren_max(node, btree)) {
947 path[level].bp_op = nilfs_btree_do_insert;
952 parent = nilfs_btree_get_node(btree, path, level + 1);
953 pindex = path[level + 1].bp_index;
957 sibptr = nilfs_btree_node_get_ptr(btree, parent,
959 ret = nilfs_btree_get_block(btree, sibptr, &bh);
961 goto err_out_child_node;
962 sib = (struct nilfs_btree_node *)bh->b_data;
963 if (nilfs_btree_node_get_nchildren(sib) <
964 nilfs_btree_node_nchildren_max(sib, btree)) {
965 path[level].bp_sib_bh = bh;
966 path[level].bp_op = nilfs_btree_carry_left;
975 nilfs_btree_node_get_nchildren(parent) - 1) {
976 sibptr = nilfs_btree_node_get_ptr(btree, parent,
978 ret = nilfs_btree_get_block(btree, sibptr, &bh);
980 goto err_out_child_node;
981 sib = (struct nilfs_btree_node *)bh->b_data;
982 if (nilfs_btree_node_get_nchildren(sib) <
983 nilfs_btree_node_nchildren_max(sib, btree)) {
984 path[level].bp_sib_bh = bh;
985 path[level].bp_op = nilfs_btree_carry_right;
993 path[level].bp_newreq.bpr_ptr =
994 path[level - 1].bp_newreq.bpr_ptr + 1;
995 ret = nilfs_bmap_prepare_alloc_ptr(btree,
996 &path[level].bp_newreq, dat);
998 goto err_out_child_node;
999 ret = nilfs_btree_get_new_block(btree,
1000 path[level].bp_newreq.bpr_ptr,
1003 goto err_out_curr_node;
1005 stats->bs_nblocks++;
1007 nilfs_btree_node_init(btree,
1008 (struct nilfs_btree_node *)bh->b_data,
1009 0, level, 0, NULL, NULL);
1010 path[level].bp_sib_bh = bh;
1011 path[level].bp_op = nilfs_btree_split;
1015 node = nilfs_btree_get_root(btree);
1016 if (nilfs_btree_node_get_nchildren(node) <
1017 nilfs_btree_node_nchildren_max(node, btree)) {
1018 path[level].bp_op = nilfs_btree_do_insert;
1019 stats->bs_nblocks++;
1024 path[level].bp_newreq.bpr_ptr = path[level - 1].bp_newreq.bpr_ptr + 1;
1025 ret = nilfs_bmap_prepare_alloc_ptr(btree, &path[level].bp_newreq, dat);
1027 goto err_out_child_node;
1028 ret = nilfs_btree_get_new_block(btree, path[level].bp_newreq.bpr_ptr,
1031 goto err_out_curr_node;
1033 nilfs_btree_node_init(btree, (struct nilfs_btree_node *)bh->b_data,
1034 0, level, 0, NULL, NULL);
1035 path[level].bp_sib_bh = bh;
1036 path[level].bp_op = nilfs_btree_grow;
1039 path[level].bp_op = nilfs_btree_do_insert;
1041 /* a newly-created node block and a data block are added */
1042 stats->bs_nblocks += 2;
1051 nilfs_bmap_abort_alloc_ptr(btree, &path[level].bp_newreq, dat);
1053 for (level--; level > NILFS_BTREE_LEVEL_DATA; level--) {
1054 nilfs_btnode_delete(path[level].bp_sib_bh);
1055 nilfs_bmap_abort_alloc_ptr(btree, &path[level].bp_newreq, dat);
1059 nilfs_bmap_abort_alloc_ptr(btree, &path[level].bp_newreq, dat);
1062 stats->bs_nblocks = 0;
1066 static void nilfs_btree_commit_insert(struct nilfs_bmap *btree,
1067 struct nilfs_btree_path *path,
1068 int maxlevel, __u64 key, __u64 ptr)
1070 struct inode *dat = NULL;
1073 set_buffer_nilfs_volatile((struct buffer_head *)((unsigned long)ptr));
1074 ptr = path[NILFS_BTREE_LEVEL_DATA].bp_newreq.bpr_ptr;
1075 if (NILFS_BMAP_USE_VBN(btree)) {
1076 nilfs_bmap_set_target_v(btree, key, ptr);
1077 dat = nilfs_bmap_get_dat(btree);
1080 for (level = NILFS_BTREE_LEVEL_NODE_MIN; level <= maxlevel; level++) {
1081 nilfs_bmap_commit_alloc_ptr(btree,
1082 &path[level - 1].bp_newreq, dat);
1083 path[level].bp_op(btree, path, level, &key, &ptr);
1086 if (!nilfs_bmap_dirty(btree))
1087 nilfs_bmap_set_dirty(btree);
1090 static int nilfs_btree_insert(struct nilfs_bmap *btree, __u64 key, __u64 ptr)
1092 struct nilfs_btree_path *path;
1093 struct nilfs_bmap_stats stats;
1096 path = nilfs_btree_alloc_path();
1100 ret = nilfs_btree_do_lookup(btree, path, key, NULL,
1101 NILFS_BTREE_LEVEL_NODE_MIN);
1102 if (ret != -ENOENT) {
1108 ret = nilfs_btree_prepare_insert(btree, path, &level, key, ptr, &stats);
1111 nilfs_btree_commit_insert(btree, path, level, key, ptr);
1112 nilfs_bmap_add_blocks(btree, stats.bs_nblocks);
1115 nilfs_btree_free_path(path);
1119 static void nilfs_btree_do_delete(struct nilfs_bmap *btree,
1120 struct nilfs_btree_path *path,
1121 int level, __u64 *keyp, __u64 *ptrp)
1123 struct nilfs_btree_node *node;
1125 if (level < nilfs_btree_height(btree) - 1) {
1126 node = nilfs_btree_get_nonroot_node(path, level);
1127 nilfs_btree_node_delete(btree, node, keyp, ptrp,
1128 path[level].bp_index);
1129 if (!buffer_dirty(path[level].bp_bh))
1130 nilfs_btnode_mark_dirty(path[level].bp_bh);
1131 if (path[level].bp_index == 0)
1132 nilfs_btree_promote_key(btree, path, level + 1,
1133 nilfs_btree_node_get_key(node, 0));
1135 node = nilfs_btree_get_root(btree);
1136 nilfs_btree_node_delete(btree, node, keyp, ptrp,
1137 path[level].bp_index);
1141 static void nilfs_btree_borrow_left(struct nilfs_bmap *btree,
1142 struct nilfs_btree_path *path,
1143 int level, __u64 *keyp, __u64 *ptrp)
1145 struct nilfs_btree_node *node, *left;
1146 int nchildren, lnchildren, n;
1148 nilfs_btree_do_delete(btree, path, level, keyp, ptrp);
1150 node = nilfs_btree_get_nonroot_node(path, level);
1151 left = nilfs_btree_get_sib_node(path, level);
1152 nchildren = nilfs_btree_node_get_nchildren(node);
1153 lnchildren = nilfs_btree_node_get_nchildren(left);
1155 n = (nchildren + lnchildren) / 2 - nchildren;
1157 nilfs_btree_node_move_right(btree, left, node, n);
1159 if (!buffer_dirty(path[level].bp_bh))
1160 nilfs_btnode_mark_dirty(path[level].bp_bh);
1161 if (!buffer_dirty(path[level].bp_sib_bh))
1162 nilfs_btnode_mark_dirty(path[level].bp_sib_bh);
1164 nilfs_btree_promote_key(btree, path, level + 1,
1165 nilfs_btree_node_get_key(node, 0));
1167 brelse(path[level].bp_sib_bh);
1168 path[level].bp_sib_bh = NULL;
1169 path[level].bp_index += n;
1172 static void nilfs_btree_borrow_right(struct nilfs_bmap *btree,
1173 struct nilfs_btree_path *path,
1174 int level, __u64 *keyp, __u64 *ptrp)
1176 struct nilfs_btree_node *node, *right;
1177 int nchildren, rnchildren, n;
1179 nilfs_btree_do_delete(btree, path, level, keyp, ptrp);
1181 node = nilfs_btree_get_nonroot_node(path, level);
1182 right = nilfs_btree_get_sib_node(path, level);
1183 nchildren = nilfs_btree_node_get_nchildren(node);
1184 rnchildren = nilfs_btree_node_get_nchildren(right);
1186 n = (nchildren + rnchildren) / 2 - nchildren;
1188 nilfs_btree_node_move_left(btree, node, right, n);
1190 if (!buffer_dirty(path[level].bp_bh))
1191 nilfs_btnode_mark_dirty(path[level].bp_bh);
1192 if (!buffer_dirty(path[level].bp_sib_bh))
1193 nilfs_btnode_mark_dirty(path[level].bp_sib_bh);
1195 path[level + 1].bp_index++;
1196 nilfs_btree_promote_key(btree, path, level + 1,
1197 nilfs_btree_node_get_key(right, 0));
1198 path[level + 1].bp_index--;
1200 brelse(path[level].bp_sib_bh);
1201 path[level].bp_sib_bh = NULL;
1204 static void nilfs_btree_concat_left(struct nilfs_bmap *btree,
1205 struct nilfs_btree_path *path,
1206 int level, __u64 *keyp, __u64 *ptrp)
1208 struct nilfs_btree_node *node, *left;
1211 nilfs_btree_do_delete(btree, path, level, keyp, ptrp);
1213 node = nilfs_btree_get_nonroot_node(path, level);
1214 left = nilfs_btree_get_sib_node(path, level);
1216 n = nilfs_btree_node_get_nchildren(node);
1218 nilfs_btree_node_move_left(btree, left, node, n);
1220 if (!buffer_dirty(path[level].bp_sib_bh))
1221 nilfs_btnode_mark_dirty(path[level].bp_sib_bh);
1223 nilfs_btnode_delete(path[level].bp_bh);
1224 path[level].bp_bh = path[level].bp_sib_bh;
1225 path[level].bp_sib_bh = NULL;
1226 path[level].bp_index += nilfs_btree_node_get_nchildren(left);
1229 static void nilfs_btree_concat_right(struct nilfs_bmap *btree,
1230 struct nilfs_btree_path *path,
1231 int level, __u64 *keyp, __u64 *ptrp)
1233 struct nilfs_btree_node *node, *right;
1236 nilfs_btree_do_delete(btree, path, level, keyp, ptrp);
1238 node = nilfs_btree_get_nonroot_node(path, level);
1239 right = nilfs_btree_get_sib_node(path, level);
1241 n = nilfs_btree_node_get_nchildren(right);
1243 nilfs_btree_node_move_left(btree, node, right, n);
1245 if (!buffer_dirty(path[level].bp_bh))
1246 nilfs_btnode_mark_dirty(path[level].bp_bh);
1248 nilfs_btnode_delete(path[level].bp_sib_bh);
1249 path[level].bp_sib_bh = NULL;
1250 path[level + 1].bp_index++;
1253 static void nilfs_btree_shrink(struct nilfs_bmap *btree,
1254 struct nilfs_btree_path *path,
1255 int level, __u64 *keyp, __u64 *ptrp)
1257 struct nilfs_btree_node *root, *child;
1260 nilfs_btree_do_delete(btree, path, level, keyp, ptrp);
1262 root = nilfs_btree_get_root(btree);
1263 child = nilfs_btree_get_nonroot_node(path, level);
1265 nilfs_btree_node_delete(btree, root, NULL, NULL, 0);
1266 nilfs_btree_node_set_level(root, level);
1267 n = nilfs_btree_node_get_nchildren(child);
1268 nilfs_btree_node_move_left(btree, root, child, n);
1270 nilfs_btnode_delete(path[level].bp_bh);
1271 path[level].bp_bh = NULL;
1275 static int nilfs_btree_prepare_delete(struct nilfs_bmap *btree,
1276 struct nilfs_btree_path *path,
1278 struct nilfs_bmap_stats *stats,
1281 struct buffer_head *bh;
1282 struct nilfs_btree_node *node, *parent, *sib;
1284 int pindex, level, ret;
1287 stats->bs_nblocks = 0;
1288 for (level = NILFS_BTREE_LEVEL_NODE_MIN;
1289 level < nilfs_btree_height(btree) - 1;
1291 node = nilfs_btree_get_nonroot_node(path, level);
1292 path[level].bp_oldreq.bpr_ptr =
1293 nilfs_btree_node_get_ptr(btree, node,
1294 path[level].bp_index);
1295 ret = nilfs_bmap_prepare_end_ptr(btree,
1296 &path[level].bp_oldreq, dat);
1298 goto err_out_child_node;
1300 if (nilfs_btree_node_get_nchildren(node) >
1301 nilfs_btree_node_nchildren_min(node, btree)) {
1302 path[level].bp_op = nilfs_btree_do_delete;
1303 stats->bs_nblocks++;
1307 parent = nilfs_btree_get_node(btree, path, level + 1);
1308 pindex = path[level + 1].bp_index;
1312 sibptr = nilfs_btree_node_get_ptr(btree, parent,
1314 ret = nilfs_btree_get_block(btree, sibptr, &bh);
1316 goto err_out_curr_node;
1317 sib = (struct nilfs_btree_node *)bh->b_data;
1318 if (nilfs_btree_node_get_nchildren(sib) >
1319 nilfs_btree_node_nchildren_min(sib, btree)) {
1320 path[level].bp_sib_bh = bh;
1321 path[level].bp_op = nilfs_btree_borrow_left;
1322 stats->bs_nblocks++;
1325 path[level].bp_sib_bh = bh;
1326 path[level].bp_op = nilfs_btree_concat_left;
1327 stats->bs_nblocks++;
1331 nilfs_btree_node_get_nchildren(parent) - 1) {
1333 sibptr = nilfs_btree_node_get_ptr(btree, parent,
1335 ret = nilfs_btree_get_block(btree, sibptr, &bh);
1337 goto err_out_curr_node;
1338 sib = (struct nilfs_btree_node *)bh->b_data;
1339 if (nilfs_btree_node_get_nchildren(sib) >
1340 nilfs_btree_node_nchildren_min(sib, btree)) {
1341 path[level].bp_sib_bh = bh;
1342 path[level].bp_op = nilfs_btree_borrow_right;
1343 stats->bs_nblocks++;
1346 path[level].bp_sib_bh = bh;
1347 path[level].bp_op = nilfs_btree_concat_right;
1348 stats->bs_nblocks++;
1353 /* the only child of the root node */
1354 WARN_ON(level != nilfs_btree_height(btree) - 2);
1355 if (nilfs_btree_node_get_nchildren(node) - 1 <=
1356 NILFS_BTREE_ROOT_NCHILDREN_MAX) {
1357 path[level].bp_op = nilfs_btree_shrink;
1358 stats->bs_nblocks += 2;
1360 path[level].bp_op = nilfs_btree_do_delete;
1361 stats->bs_nblocks++;
1369 node = nilfs_btree_get_root(btree);
1370 path[level].bp_oldreq.bpr_ptr =
1371 nilfs_btree_node_get_ptr(btree, node, path[level].bp_index);
1373 ret = nilfs_bmap_prepare_end_ptr(btree, &path[level].bp_oldreq, dat);
1375 goto err_out_child_node;
1377 /* child of the root node is deleted */
1378 path[level].bp_op = nilfs_btree_do_delete;
1379 stats->bs_nblocks++;
1388 nilfs_bmap_abort_end_ptr(btree, &path[level].bp_oldreq, dat);
1390 for (level--; level >= NILFS_BTREE_LEVEL_NODE_MIN; level--) {
1391 brelse(path[level].bp_sib_bh);
1392 nilfs_bmap_abort_end_ptr(btree, &path[level].bp_oldreq, dat);
1395 stats->bs_nblocks = 0;
1399 static void nilfs_btree_commit_delete(struct nilfs_bmap *btree,
1400 struct nilfs_btree_path *path,
1401 int maxlevel, struct inode *dat)
1405 for (level = NILFS_BTREE_LEVEL_NODE_MIN; level <= maxlevel; level++) {
1406 nilfs_bmap_commit_end_ptr(btree, &path[level].bp_oldreq, dat);
1407 path[level].bp_op(btree, path, level, NULL, NULL);
1410 if (!nilfs_bmap_dirty(btree))
1411 nilfs_bmap_set_dirty(btree);
1414 static int nilfs_btree_delete(struct nilfs_bmap *btree, __u64 key)
1417 struct nilfs_btree_path *path;
1418 struct nilfs_bmap_stats stats;
1422 path = nilfs_btree_alloc_path();
1426 ret = nilfs_btree_do_lookup(btree, path, key, NULL,
1427 NILFS_BTREE_LEVEL_NODE_MIN);
1432 dat = NILFS_BMAP_USE_VBN(btree) ? nilfs_bmap_get_dat(btree) : NULL;
1434 ret = nilfs_btree_prepare_delete(btree, path, &level, &stats, dat);
1437 nilfs_btree_commit_delete(btree, path, level, dat);
1438 nilfs_bmap_sub_blocks(btree, stats.bs_nblocks);
1441 nilfs_btree_free_path(path);
1445 static int nilfs_btree_last_key(const struct nilfs_bmap *btree, __u64 *keyp)
1447 struct nilfs_btree_path *path;
1450 path = nilfs_btree_alloc_path();
1454 ret = nilfs_btree_do_lookup_last(btree, path, keyp, NULL);
1456 nilfs_btree_free_path(path);
1461 static int nilfs_btree_check_delete(struct nilfs_bmap *btree, __u64 key)
1463 struct buffer_head *bh;
1464 struct nilfs_btree_node *root, *node;
1465 __u64 maxkey, nextmaxkey;
1469 root = nilfs_btree_get_root(btree);
1470 switch (nilfs_btree_height(btree)) {
1476 nchildren = nilfs_btree_node_get_nchildren(root);
1479 ptr = nilfs_btree_node_get_ptr(btree, root, nchildren - 1);
1480 ret = nilfs_btree_get_block(btree, ptr, &bh);
1483 node = (struct nilfs_btree_node *)bh->b_data;
1489 nchildren = nilfs_btree_node_get_nchildren(node);
1490 maxkey = nilfs_btree_node_get_key(node, nchildren - 1);
1491 nextmaxkey = (nchildren > 1) ?
1492 nilfs_btree_node_get_key(node, nchildren - 2) : 0;
1496 return (maxkey == key) && (nextmaxkey < NILFS_BMAP_LARGE_LOW);
1499 static int nilfs_btree_gather_data(struct nilfs_bmap *btree,
1500 __u64 *keys, __u64 *ptrs, int nitems)
1502 struct buffer_head *bh;
1503 struct nilfs_btree_node *node, *root;
1507 int nchildren, i, ret;
1509 root = nilfs_btree_get_root(btree);
1510 switch (nilfs_btree_height(btree)) {
1516 nchildren = nilfs_btree_node_get_nchildren(root);
1517 WARN_ON(nchildren > 1);
1518 ptr = nilfs_btree_node_get_ptr(btree, root, nchildren - 1);
1519 ret = nilfs_btree_get_block(btree, ptr, &bh);
1522 node = (struct nilfs_btree_node *)bh->b_data;
1529 nchildren = nilfs_btree_node_get_nchildren(node);
1530 if (nchildren < nitems)
1532 dkeys = nilfs_btree_node_dkeys(node);
1533 dptrs = nilfs_btree_node_dptrs(node, btree);
1534 for (i = 0; i < nitems; i++) {
1535 keys[i] = le64_to_cpu(dkeys[i]);
1536 ptrs[i] = le64_to_cpu(dptrs[i]);
1546 nilfs_btree_prepare_convert_and_insert(struct nilfs_bmap *btree, __u64 key,
1547 union nilfs_bmap_ptr_req *dreq,
1548 union nilfs_bmap_ptr_req *nreq,
1549 struct buffer_head **bhp,
1550 struct nilfs_bmap_stats *stats)
1552 struct buffer_head *bh;
1553 struct inode *dat = NULL;
1556 stats->bs_nblocks = 0;
1559 /* cannot find near ptr */
1560 if (NILFS_BMAP_USE_VBN(btree)) {
1561 dreq->bpr_ptr = nilfs_btree_find_target_v(btree, NULL, key);
1562 dat = nilfs_bmap_get_dat(btree);
1565 ret = nilfs_bmap_prepare_alloc_ptr(btree, dreq, dat);
1570 stats->bs_nblocks++;
1572 nreq->bpr_ptr = dreq->bpr_ptr + 1;
1573 ret = nilfs_bmap_prepare_alloc_ptr(btree, nreq, dat);
1577 ret = nilfs_btree_get_new_block(btree, nreq->bpr_ptr, &bh);
1582 stats->bs_nblocks++;
1590 nilfs_bmap_abort_alloc_ptr(btree, nreq, dat);
1592 nilfs_bmap_abort_alloc_ptr(btree, dreq, dat);
1593 stats->bs_nblocks = 0;
1599 nilfs_btree_commit_convert_and_insert(struct nilfs_bmap *btree,
1600 __u64 key, __u64 ptr,
1601 const __u64 *keys, const __u64 *ptrs,
1603 union nilfs_bmap_ptr_req *dreq,
1604 union nilfs_bmap_ptr_req *nreq,
1605 struct buffer_head *bh)
1607 struct nilfs_btree_node *node;
1611 /* free resources */
1612 if (btree->b_ops->bop_clear != NULL)
1613 btree->b_ops->bop_clear(btree);
1615 /* ptr must be a pointer to a buffer head. */
1616 set_buffer_nilfs_volatile((struct buffer_head *)((unsigned long)ptr));
1618 /* convert and insert */
1619 dat = NILFS_BMAP_USE_VBN(btree) ? nilfs_bmap_get_dat(btree) : NULL;
1620 nilfs_btree_init(btree);
1622 nilfs_bmap_commit_alloc_ptr(btree, dreq, dat);
1623 nilfs_bmap_commit_alloc_ptr(btree, nreq, dat);
1625 /* create child node at level 1 */
1626 node = (struct nilfs_btree_node *)bh->b_data;
1627 nilfs_btree_node_init(btree, node, 0, 1, n, keys, ptrs);
1628 nilfs_btree_node_insert(btree, node, key, dreq->bpr_ptr, n);
1629 if (!buffer_dirty(bh))
1630 nilfs_btnode_mark_dirty(bh);
1631 if (!nilfs_bmap_dirty(btree))
1632 nilfs_bmap_set_dirty(btree);
1636 /* create root node at level 2 */
1637 node = nilfs_btree_get_root(btree);
1638 tmpptr = nreq->bpr_ptr;
1639 nilfs_btree_node_init(btree, node, NILFS_BTREE_NODE_ROOT,
1640 2, 1, &keys[0], &tmpptr);
1642 nilfs_bmap_commit_alloc_ptr(btree, dreq, dat);
1644 /* create root node at level 1 */
1645 node = nilfs_btree_get_root(btree);
1646 nilfs_btree_node_init(btree, node, NILFS_BTREE_NODE_ROOT,
1648 nilfs_btree_node_insert(btree, node, key, dreq->bpr_ptr, n);
1649 if (!nilfs_bmap_dirty(btree))
1650 nilfs_bmap_set_dirty(btree);
1653 if (NILFS_BMAP_USE_VBN(btree))
1654 nilfs_bmap_set_target_v(btree, key, dreq->bpr_ptr);
1658 * nilfs_btree_convert_and_insert -
1666 int nilfs_btree_convert_and_insert(struct nilfs_bmap *btree,
1667 __u64 key, __u64 ptr,
1668 const __u64 *keys, const __u64 *ptrs, int n)
1670 struct buffer_head *bh;
1671 union nilfs_bmap_ptr_req dreq, nreq, *di, *ni;
1672 struct nilfs_bmap_stats stats;
1675 if (n + 1 <= NILFS_BTREE_ROOT_NCHILDREN_MAX) {
1678 } else if ((n + 1) <= NILFS_BTREE_NODE_NCHILDREN_MAX(
1679 1 << btree->b_inode->i_blkbits)) {
1688 ret = nilfs_btree_prepare_convert_and_insert(btree, key, di, ni, &bh,
1692 nilfs_btree_commit_convert_and_insert(btree, key, ptr, keys, ptrs, n,
1694 nilfs_bmap_add_blocks(btree, stats.bs_nblocks);
1698 static int nilfs_btree_propagate_p(struct nilfs_bmap *btree,
1699 struct nilfs_btree_path *path,
1701 struct buffer_head *bh)
1703 while ((++level < nilfs_btree_height(btree) - 1) &&
1704 !buffer_dirty(path[level].bp_bh))
1705 nilfs_btnode_mark_dirty(path[level].bp_bh);
1710 static int nilfs_btree_prepare_update_v(struct nilfs_bmap *btree,
1711 struct nilfs_btree_path *path,
1712 int level, struct inode *dat)
1714 struct nilfs_btree_node *parent;
1717 parent = nilfs_btree_get_node(btree, path, level + 1);
1718 path[level].bp_oldreq.bpr_ptr =
1719 nilfs_btree_node_get_ptr(btree, parent,
1720 path[level + 1].bp_index);
1721 path[level].bp_newreq.bpr_ptr = path[level].bp_oldreq.bpr_ptr + 1;
1722 ret = nilfs_dat_prepare_update(dat, &path[level].bp_oldreq.bpr_req,
1723 &path[level].bp_newreq.bpr_req);
1727 if (buffer_nilfs_node(path[level].bp_bh)) {
1728 path[level].bp_ctxt.oldkey = path[level].bp_oldreq.bpr_ptr;
1729 path[level].bp_ctxt.newkey = path[level].bp_newreq.bpr_ptr;
1730 path[level].bp_ctxt.bh = path[level].bp_bh;
1731 ret = nilfs_btnode_prepare_change_key(
1732 &NILFS_BMAP_I(btree)->i_btnode_cache,
1733 &path[level].bp_ctxt);
1735 nilfs_dat_abort_update(dat,
1736 &path[level].bp_oldreq.bpr_req,
1737 &path[level].bp_newreq.bpr_req);
1745 static void nilfs_btree_commit_update_v(struct nilfs_bmap *btree,
1746 struct nilfs_btree_path *path,
1747 int level, struct inode *dat)
1749 struct nilfs_btree_node *parent;
1751 nilfs_dat_commit_update(dat, &path[level].bp_oldreq.bpr_req,
1752 &path[level].bp_newreq.bpr_req,
1753 btree->b_ptr_type == NILFS_BMAP_PTR_VS);
1755 if (buffer_nilfs_node(path[level].bp_bh)) {
1756 nilfs_btnode_commit_change_key(
1757 &NILFS_BMAP_I(btree)->i_btnode_cache,
1758 &path[level].bp_ctxt);
1759 path[level].bp_bh = path[level].bp_ctxt.bh;
1761 set_buffer_nilfs_volatile(path[level].bp_bh);
1763 parent = nilfs_btree_get_node(btree, path, level + 1);
1764 nilfs_btree_node_set_ptr(btree, parent, path[level + 1].bp_index,
1765 path[level].bp_newreq.bpr_ptr);
1768 static void nilfs_btree_abort_update_v(struct nilfs_bmap *btree,
1769 struct nilfs_btree_path *path,
1770 int level, struct inode *dat)
1772 nilfs_dat_abort_update(dat, &path[level].bp_oldreq.bpr_req,
1773 &path[level].bp_newreq.bpr_req);
1774 if (buffer_nilfs_node(path[level].bp_bh))
1775 nilfs_btnode_abort_change_key(
1776 &NILFS_BMAP_I(btree)->i_btnode_cache,
1777 &path[level].bp_ctxt);
1780 static int nilfs_btree_prepare_propagate_v(struct nilfs_bmap *btree,
1781 struct nilfs_btree_path *path,
1782 int minlevel, int *maxlevelp,
1788 if (!buffer_nilfs_volatile(path[level].bp_bh)) {
1789 ret = nilfs_btree_prepare_update_v(btree, path, level, dat);
1793 while ((++level < nilfs_btree_height(btree) - 1) &&
1794 !buffer_dirty(path[level].bp_bh)) {
1796 WARN_ON(buffer_nilfs_volatile(path[level].bp_bh));
1797 ret = nilfs_btree_prepare_update_v(btree, path, level, dat);
1803 *maxlevelp = level - 1;
1808 while (--level > minlevel)
1809 nilfs_btree_abort_update_v(btree, path, level, dat);
1810 if (!buffer_nilfs_volatile(path[level].bp_bh))
1811 nilfs_btree_abort_update_v(btree, path, level, dat);
1815 static void nilfs_btree_commit_propagate_v(struct nilfs_bmap *btree,
1816 struct nilfs_btree_path *path,
1817 int minlevel, int maxlevel,
1818 struct buffer_head *bh,
1823 if (!buffer_nilfs_volatile(path[minlevel].bp_bh))
1824 nilfs_btree_commit_update_v(btree, path, minlevel, dat);
1826 for (level = minlevel + 1; level <= maxlevel; level++)
1827 nilfs_btree_commit_update_v(btree, path, level, dat);
1830 static int nilfs_btree_propagate_v(struct nilfs_bmap *btree,
1831 struct nilfs_btree_path *path,
1832 int level, struct buffer_head *bh)
1834 int maxlevel = 0, ret;
1835 struct nilfs_btree_node *parent;
1836 struct inode *dat = nilfs_bmap_get_dat(btree);
1840 path[level].bp_bh = bh;
1841 ret = nilfs_btree_prepare_propagate_v(btree, path, level, &maxlevel,
1846 if (buffer_nilfs_volatile(path[level].bp_bh)) {
1847 parent = nilfs_btree_get_node(btree, path, level + 1);
1848 ptr = nilfs_btree_node_get_ptr(btree, parent,
1849 path[level + 1].bp_index);
1850 ret = nilfs_dat_mark_dirty(dat, ptr);
1855 nilfs_btree_commit_propagate_v(btree, path, level, maxlevel, bh, dat);
1858 brelse(path[level].bp_bh);
1859 path[level].bp_bh = NULL;
1863 static int nilfs_btree_propagate(struct nilfs_bmap *btree,
1864 struct buffer_head *bh)
1866 struct nilfs_btree_path *path;
1867 struct nilfs_btree_node *node;
1871 WARN_ON(!buffer_dirty(bh));
1873 path = nilfs_btree_alloc_path();
1877 if (buffer_nilfs_node(bh)) {
1878 node = (struct nilfs_btree_node *)bh->b_data;
1879 key = nilfs_btree_node_get_key(node, 0);
1880 level = nilfs_btree_node_get_level(node);
1882 key = nilfs_bmap_data_get_key(btree, bh);
1883 level = NILFS_BTREE_LEVEL_DATA;
1886 ret = nilfs_btree_do_lookup(btree, path, key, NULL, level + 1);
1888 if (unlikely(ret == -ENOENT))
1889 printk(KERN_CRIT "%s: key = %llu, level == %d\n",
1890 __func__, (unsigned long long)key, level);
1894 ret = NILFS_BMAP_USE_VBN(btree) ?
1895 nilfs_btree_propagate_v(btree, path, level, bh) :
1896 nilfs_btree_propagate_p(btree, path, level, bh);
1899 nilfs_btree_free_path(path);
1904 static int nilfs_btree_propagate_gc(struct nilfs_bmap *btree,
1905 struct buffer_head *bh)
1907 return nilfs_dat_mark_dirty(nilfs_bmap_get_dat(btree), bh->b_blocknr);
1910 static void nilfs_btree_add_dirty_buffer(struct nilfs_bmap *btree,
1911 struct list_head *lists,
1912 struct buffer_head *bh)
1914 struct list_head *head;
1915 struct buffer_head *cbh;
1916 struct nilfs_btree_node *node, *cnode;
1921 node = (struct nilfs_btree_node *)bh->b_data;
1922 key = nilfs_btree_node_get_key(node, 0);
1923 level = nilfs_btree_node_get_level(node);
1924 if (level < NILFS_BTREE_LEVEL_NODE_MIN ||
1925 level >= NILFS_BTREE_LEVEL_MAX) {
1928 "%s: invalid btree level: %d (key=%llu, ino=%lu, "
1930 __func__, level, (unsigned long long)key,
1931 NILFS_BMAP_I(btree)->vfs_inode.i_ino,
1932 (unsigned long long)bh->b_blocknr);
1936 list_for_each(head, &lists[level]) {
1937 cbh = list_entry(head, struct buffer_head, b_assoc_buffers);
1938 cnode = (struct nilfs_btree_node *)cbh->b_data;
1939 ckey = nilfs_btree_node_get_key(cnode, 0);
1943 list_add_tail(&bh->b_assoc_buffers, head);
1946 static void nilfs_btree_lookup_dirty_buffers(struct nilfs_bmap *btree,
1947 struct list_head *listp)
1949 struct address_space *btcache = &NILFS_BMAP_I(btree)->i_btnode_cache;
1950 struct list_head lists[NILFS_BTREE_LEVEL_MAX];
1951 struct pagevec pvec;
1952 struct buffer_head *bh, *head;
1956 for (level = NILFS_BTREE_LEVEL_NODE_MIN;
1957 level < NILFS_BTREE_LEVEL_MAX;
1959 INIT_LIST_HEAD(&lists[level]);
1961 pagevec_init(&pvec, 0);
1963 while (pagevec_lookup_tag(&pvec, btcache, &index, PAGECACHE_TAG_DIRTY,
1965 for (i = 0; i < pagevec_count(&pvec); i++) {
1966 bh = head = page_buffers(pvec.pages[i]);
1968 if (buffer_dirty(bh))
1969 nilfs_btree_add_dirty_buffer(btree,
1971 } while ((bh = bh->b_this_page) != head);
1973 pagevec_release(&pvec);
1977 for (level = NILFS_BTREE_LEVEL_NODE_MIN;
1978 level < NILFS_BTREE_LEVEL_MAX;
1980 list_splice_tail(&lists[level], listp);
1983 static int nilfs_btree_assign_p(struct nilfs_bmap *btree,
1984 struct nilfs_btree_path *path,
1986 struct buffer_head **bh,
1988 union nilfs_binfo *binfo)
1990 struct nilfs_btree_node *parent;
1995 parent = nilfs_btree_get_node(btree, path, level + 1);
1996 ptr = nilfs_btree_node_get_ptr(btree, parent,
1997 path[level + 1].bp_index);
1998 if (buffer_nilfs_node(*bh)) {
1999 path[level].bp_ctxt.oldkey = ptr;
2000 path[level].bp_ctxt.newkey = blocknr;
2001 path[level].bp_ctxt.bh = *bh;
2002 ret = nilfs_btnode_prepare_change_key(
2003 &NILFS_BMAP_I(btree)->i_btnode_cache,
2004 &path[level].bp_ctxt);
2007 nilfs_btnode_commit_change_key(
2008 &NILFS_BMAP_I(btree)->i_btnode_cache,
2009 &path[level].bp_ctxt);
2010 *bh = path[level].bp_ctxt.bh;
2013 nilfs_btree_node_set_ptr(btree, parent,
2014 path[level + 1].bp_index, blocknr);
2016 key = nilfs_btree_node_get_key(parent, path[level + 1].bp_index);
2017 /* on-disk format */
2018 binfo->bi_dat.bi_blkoff = cpu_to_le64(key);
2019 binfo->bi_dat.bi_level = level;
2024 static int nilfs_btree_assign_v(struct nilfs_bmap *btree,
2025 struct nilfs_btree_path *path,
2027 struct buffer_head **bh,
2029 union nilfs_binfo *binfo)
2031 struct nilfs_btree_node *parent;
2032 struct inode *dat = nilfs_bmap_get_dat(btree);
2035 union nilfs_bmap_ptr_req req;
2038 parent = nilfs_btree_get_node(btree, path, level + 1);
2039 ptr = nilfs_btree_node_get_ptr(btree, parent, path[level + 1].bp_index);
2041 ret = nilfs_dat_prepare_start(dat, &req.bpr_req);
2044 nilfs_dat_commit_start(dat, &req.bpr_req, blocknr);
2046 key = nilfs_btree_node_get_key(parent, path[level + 1].bp_index);
2047 /* on-disk format */
2048 binfo->bi_v.bi_vblocknr = cpu_to_le64(ptr);
2049 binfo->bi_v.bi_blkoff = cpu_to_le64(key);
2054 static int nilfs_btree_assign(struct nilfs_bmap *btree,
2055 struct buffer_head **bh,
2057 union nilfs_binfo *binfo)
2059 struct nilfs_btree_path *path;
2060 struct nilfs_btree_node *node;
2064 path = nilfs_btree_alloc_path();
2068 if (buffer_nilfs_node(*bh)) {
2069 node = (struct nilfs_btree_node *)(*bh)->b_data;
2070 key = nilfs_btree_node_get_key(node, 0);
2071 level = nilfs_btree_node_get_level(node);
2073 key = nilfs_bmap_data_get_key(btree, *bh);
2074 level = NILFS_BTREE_LEVEL_DATA;
2077 ret = nilfs_btree_do_lookup(btree, path, key, NULL, level + 1);
2079 WARN_ON(ret == -ENOENT);
2083 ret = NILFS_BMAP_USE_VBN(btree) ?
2084 nilfs_btree_assign_v(btree, path, level, bh, blocknr, binfo) :
2085 nilfs_btree_assign_p(btree, path, level, bh, blocknr, binfo);
2088 nilfs_btree_free_path(path);
2093 static int nilfs_btree_assign_gc(struct nilfs_bmap *btree,
2094 struct buffer_head **bh,
2096 union nilfs_binfo *binfo)
2098 struct nilfs_btree_node *node;
2102 ret = nilfs_dat_move(nilfs_bmap_get_dat(btree), (*bh)->b_blocknr,
2107 if (buffer_nilfs_node(*bh)) {
2108 node = (struct nilfs_btree_node *)(*bh)->b_data;
2109 key = nilfs_btree_node_get_key(node, 0);
2111 key = nilfs_bmap_data_get_key(btree, *bh);
2113 /* on-disk format */
2114 binfo->bi_v.bi_vblocknr = cpu_to_le64((*bh)->b_blocknr);
2115 binfo->bi_v.bi_blkoff = cpu_to_le64(key);
2120 static int nilfs_btree_mark(struct nilfs_bmap *btree, __u64 key, int level)
2122 struct buffer_head *bh;
2123 struct nilfs_btree_path *path;
2127 path = nilfs_btree_alloc_path();
2131 ret = nilfs_btree_do_lookup(btree, path, key, &ptr, level + 1);
2133 WARN_ON(ret == -ENOENT);
2136 ret = nilfs_btree_get_block(btree, ptr, &bh);
2138 WARN_ON(ret == -ENOENT);
2142 if (!buffer_dirty(bh))
2143 nilfs_btnode_mark_dirty(bh);
2145 if (!nilfs_bmap_dirty(btree))
2146 nilfs_bmap_set_dirty(btree);
2149 nilfs_btree_free_path(path);
2153 static const struct nilfs_bmap_operations nilfs_btree_ops = {
2154 .bop_lookup = nilfs_btree_lookup,
2155 .bop_lookup_contig = nilfs_btree_lookup_contig,
2156 .bop_insert = nilfs_btree_insert,
2157 .bop_delete = nilfs_btree_delete,
2160 .bop_propagate = nilfs_btree_propagate,
2162 .bop_lookup_dirty_buffers = nilfs_btree_lookup_dirty_buffers,
2164 .bop_assign = nilfs_btree_assign,
2165 .bop_mark = nilfs_btree_mark,
2167 .bop_last_key = nilfs_btree_last_key,
2168 .bop_check_insert = NULL,
2169 .bop_check_delete = nilfs_btree_check_delete,
2170 .bop_gather_data = nilfs_btree_gather_data,
2173 static const struct nilfs_bmap_operations nilfs_btree_ops_gc = {
2175 .bop_lookup_contig = NULL,
2180 .bop_propagate = nilfs_btree_propagate_gc,
2182 .bop_lookup_dirty_buffers = nilfs_btree_lookup_dirty_buffers,
2184 .bop_assign = nilfs_btree_assign_gc,
2187 .bop_last_key = NULL,
2188 .bop_check_insert = NULL,
2189 .bop_check_delete = NULL,
2190 .bop_gather_data = NULL,
2193 int nilfs_btree_init(struct nilfs_bmap *bmap)
2195 bmap->b_ops = &nilfs_btree_ops;
2199 void nilfs_btree_init_gc(struct nilfs_bmap *bmap)
2201 bmap->b_ops = &nilfs_btree_ops_gc;