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;
561 path = nilfs_btree_alloc_path();
565 ret = nilfs_btree_do_lookup(btree, path, key, &ptr, level);
570 nilfs_btree_free_path(path);
575 static int nilfs_btree_lookup_contig(const struct nilfs_bmap *btree,
576 __u64 key, __u64 *ptrp, unsigned maxblocks)
578 struct nilfs_btree_path *path;
579 struct nilfs_btree_node *node;
580 struct inode *dat = NULL;
583 int level = NILFS_BTREE_LEVEL_NODE_MIN;
584 int ret, cnt, index, maxlevel;
586 path = nilfs_btree_alloc_path();
590 ret = nilfs_btree_do_lookup(btree, path, key, &ptr, level);
594 if (NILFS_BMAP_USE_VBN(btree)) {
595 dat = nilfs_bmap_get_dat(btree);
596 ret = nilfs_dat_translate(dat, ptr, &blocknr);
602 if (cnt == maxblocks)
605 maxlevel = nilfs_btree_height(btree) - 1;
606 node = nilfs_btree_get_node(btree, path, level);
607 index = path[level].bp_index + 1;
609 while (index < nilfs_btree_node_get_nchildren(node)) {
610 if (nilfs_btree_node_get_key(node, index) !=
613 ptr2 = nilfs_btree_node_get_ptr(btree, node, index);
615 ret = nilfs_dat_translate(dat, ptr2, &blocknr);
620 if (ptr2 != ptr + cnt || ++cnt == maxblocks)
625 if (level == maxlevel)
628 /* look-up right sibling node */
629 node = nilfs_btree_get_node(btree, path, level + 1);
630 index = path[level + 1].bp_index + 1;
631 if (index >= nilfs_btree_node_get_nchildren(node) ||
632 nilfs_btree_node_get_key(node, index) != key + cnt)
634 ptr2 = nilfs_btree_node_get_ptr(btree, node, index);
635 path[level + 1].bp_index = index;
637 brelse(path[level].bp_bh);
638 path[level].bp_bh = NULL;
639 ret = nilfs_btree_get_block(btree, ptr2, &path[level].bp_bh);
642 node = nilfs_btree_get_nonroot_node(path, level);
644 path[level].bp_index = index;
650 nilfs_btree_free_path(path);
654 static void nilfs_btree_promote_key(struct nilfs_bmap *btree,
655 struct nilfs_btree_path *path,
656 int level, __u64 key)
658 if (level < nilfs_btree_height(btree) - 1) {
660 nilfs_btree_node_set_key(
661 nilfs_btree_get_nonroot_node(path, level),
662 path[level].bp_index, key);
663 if (!buffer_dirty(path[level].bp_bh))
664 nilfs_btnode_mark_dirty(path[level].bp_bh);
665 } while ((path[level].bp_index == 0) &&
666 (++level < nilfs_btree_height(btree) - 1));
670 if (level == nilfs_btree_height(btree) - 1) {
671 nilfs_btree_node_set_key(nilfs_btree_get_root(btree),
672 path[level].bp_index, key);
676 static void nilfs_btree_do_insert(struct nilfs_bmap *btree,
677 struct nilfs_btree_path *path,
678 int level, __u64 *keyp, __u64 *ptrp)
680 struct nilfs_btree_node *node;
682 if (level < nilfs_btree_height(btree) - 1) {
683 node = nilfs_btree_get_nonroot_node(path, level);
684 nilfs_btree_node_insert(btree, node, *keyp, *ptrp,
685 path[level].bp_index);
686 if (!buffer_dirty(path[level].bp_bh))
687 nilfs_btnode_mark_dirty(path[level].bp_bh);
689 if (path[level].bp_index == 0)
690 nilfs_btree_promote_key(btree, path, level + 1,
691 nilfs_btree_node_get_key(node,
694 node = nilfs_btree_get_root(btree);
695 nilfs_btree_node_insert(btree, node, *keyp, *ptrp,
696 path[level].bp_index);
700 static void nilfs_btree_carry_left(struct nilfs_bmap *btree,
701 struct nilfs_btree_path *path,
702 int level, __u64 *keyp, __u64 *ptrp)
704 struct nilfs_btree_node *node, *left;
705 int nchildren, lnchildren, n, move;
707 node = nilfs_btree_get_nonroot_node(path, level);
708 left = nilfs_btree_get_sib_node(path, level);
709 nchildren = nilfs_btree_node_get_nchildren(node);
710 lnchildren = nilfs_btree_node_get_nchildren(left);
713 n = (nchildren + lnchildren + 1) / 2 - lnchildren;
714 if (n > path[level].bp_index) {
715 /* move insert point */
720 nilfs_btree_node_move_left(btree, left, node, n);
722 if (!buffer_dirty(path[level].bp_bh))
723 nilfs_btnode_mark_dirty(path[level].bp_bh);
724 if (!buffer_dirty(path[level].bp_sib_bh))
725 nilfs_btnode_mark_dirty(path[level].bp_sib_bh);
727 nilfs_btree_promote_key(btree, path, level + 1,
728 nilfs_btree_node_get_key(node, 0));
731 brelse(path[level].bp_bh);
732 path[level].bp_bh = path[level].bp_sib_bh;
733 path[level].bp_sib_bh = NULL;
734 path[level].bp_index += lnchildren;
735 path[level + 1].bp_index--;
737 brelse(path[level].bp_sib_bh);
738 path[level].bp_sib_bh = NULL;
739 path[level].bp_index -= n;
742 nilfs_btree_do_insert(btree, path, level, keyp, ptrp);
745 static void nilfs_btree_carry_right(struct nilfs_bmap *btree,
746 struct nilfs_btree_path *path,
747 int level, __u64 *keyp, __u64 *ptrp)
749 struct nilfs_btree_node *node, *right;
750 int nchildren, rnchildren, n, move;
752 node = nilfs_btree_get_nonroot_node(path, level);
753 right = nilfs_btree_get_sib_node(path, level);
754 nchildren = nilfs_btree_node_get_nchildren(node);
755 rnchildren = nilfs_btree_node_get_nchildren(right);
758 n = (nchildren + rnchildren + 1) / 2 - rnchildren;
759 if (n > nchildren - path[level].bp_index) {
760 /* move insert point */
765 nilfs_btree_node_move_right(btree, node, right, n);
767 if (!buffer_dirty(path[level].bp_bh))
768 nilfs_btnode_mark_dirty(path[level].bp_bh);
769 if (!buffer_dirty(path[level].bp_sib_bh))
770 nilfs_btnode_mark_dirty(path[level].bp_sib_bh);
772 path[level + 1].bp_index++;
773 nilfs_btree_promote_key(btree, path, level + 1,
774 nilfs_btree_node_get_key(right, 0));
775 path[level + 1].bp_index--;
778 brelse(path[level].bp_bh);
779 path[level].bp_bh = path[level].bp_sib_bh;
780 path[level].bp_sib_bh = NULL;
781 path[level].bp_index -= nilfs_btree_node_get_nchildren(node);
782 path[level + 1].bp_index++;
784 brelse(path[level].bp_sib_bh);
785 path[level].bp_sib_bh = NULL;
788 nilfs_btree_do_insert(btree, path, level, keyp, ptrp);
791 static void nilfs_btree_split(struct nilfs_bmap *btree,
792 struct nilfs_btree_path *path,
793 int level, __u64 *keyp, __u64 *ptrp)
795 struct nilfs_btree_node *node, *right;
798 int nchildren, n, move;
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 newkey = nilfs_btree_node_get_key(right, 0);
819 newptr = path[level].bp_newreq.bpr_ptr;
822 path[level].bp_index -= nilfs_btree_node_get_nchildren(node);
823 nilfs_btree_node_insert(btree, right, *keyp, *ptrp,
824 path[level].bp_index);
826 *keyp = nilfs_btree_node_get_key(right, 0);
827 *ptrp = path[level].bp_newreq.bpr_ptr;
829 brelse(path[level].bp_bh);
830 path[level].bp_bh = path[level].bp_sib_bh;
831 path[level].bp_sib_bh = NULL;
833 nilfs_btree_do_insert(btree, path, level, keyp, ptrp);
835 *keyp = nilfs_btree_node_get_key(right, 0);
836 *ptrp = path[level].bp_newreq.bpr_ptr;
838 brelse(path[level].bp_sib_bh);
839 path[level].bp_sib_bh = NULL;
842 path[level + 1].bp_index++;
845 static void nilfs_btree_grow(struct nilfs_bmap *btree,
846 struct nilfs_btree_path *path,
847 int level, __u64 *keyp, __u64 *ptrp)
849 struct nilfs_btree_node *root, *child;
852 root = nilfs_btree_get_root(btree);
853 child = nilfs_btree_get_sib_node(path, level);
855 n = nilfs_btree_node_get_nchildren(root);
857 nilfs_btree_node_move_right(btree, root, child, n);
858 nilfs_btree_node_set_level(root, level + 1);
860 if (!buffer_dirty(path[level].bp_sib_bh))
861 nilfs_btnode_mark_dirty(path[level].bp_sib_bh);
863 path[level].bp_bh = path[level].bp_sib_bh;
864 path[level].bp_sib_bh = NULL;
866 nilfs_btree_do_insert(btree, path, level, keyp, ptrp);
868 *keyp = nilfs_btree_node_get_key(child, 0);
869 *ptrp = path[level].bp_newreq.bpr_ptr;
872 static __u64 nilfs_btree_find_near(const struct nilfs_bmap *btree,
873 const struct nilfs_btree_path *path)
875 struct nilfs_btree_node *node;
879 return NILFS_BMAP_INVALID_PTR;
882 level = NILFS_BTREE_LEVEL_NODE_MIN;
883 if (path[level].bp_index > 0) {
884 node = nilfs_btree_get_node(btree, path, level);
885 return nilfs_btree_node_get_ptr(btree, node,
886 path[level].bp_index - 1);
890 level = NILFS_BTREE_LEVEL_NODE_MIN + 1;
891 if (level <= nilfs_btree_height(btree) - 1) {
892 node = nilfs_btree_get_node(btree, path, level);
893 return nilfs_btree_node_get_ptr(btree, node,
894 path[level].bp_index);
897 return NILFS_BMAP_INVALID_PTR;
900 static __u64 nilfs_btree_find_target_v(const struct nilfs_bmap *btree,
901 const struct nilfs_btree_path *path,
906 ptr = nilfs_bmap_find_target_seq(btree, key);
907 if (ptr != NILFS_BMAP_INVALID_PTR)
908 /* sequential access */
911 ptr = nilfs_btree_find_near(btree, path);
912 if (ptr != NILFS_BMAP_INVALID_PTR)
917 return nilfs_bmap_find_target_in_group(btree);
920 static int nilfs_btree_prepare_insert(struct nilfs_bmap *btree,
921 struct nilfs_btree_path *path,
922 int *levelp, __u64 key, __u64 ptr,
923 struct nilfs_bmap_stats *stats)
925 struct buffer_head *bh;
926 struct nilfs_btree_node *node, *parent, *sib;
928 int pindex, level, ret;
929 struct inode *dat = NULL;
931 stats->bs_nblocks = 0;
932 level = NILFS_BTREE_LEVEL_DATA;
934 /* allocate a new ptr for data block */
935 if (NILFS_BMAP_USE_VBN(btree)) {
936 path[level].bp_newreq.bpr_ptr =
937 nilfs_btree_find_target_v(btree, path, key);
938 dat = nilfs_bmap_get_dat(btree);
941 ret = nilfs_bmap_prepare_alloc_ptr(btree, &path[level].bp_newreq, dat);
945 for (level = NILFS_BTREE_LEVEL_NODE_MIN;
946 level < nilfs_btree_height(btree) - 1;
948 node = nilfs_btree_get_nonroot_node(path, level);
949 if (nilfs_btree_node_get_nchildren(node) <
950 nilfs_btree_node_nchildren_max(node, btree)) {
951 path[level].bp_op = nilfs_btree_do_insert;
956 parent = nilfs_btree_get_node(btree, path, level + 1);
957 pindex = path[level + 1].bp_index;
961 sibptr = nilfs_btree_node_get_ptr(btree, parent,
963 ret = nilfs_btree_get_block(btree, sibptr, &bh);
965 goto err_out_child_node;
966 sib = (struct nilfs_btree_node *)bh->b_data;
967 if (nilfs_btree_node_get_nchildren(sib) <
968 nilfs_btree_node_nchildren_max(sib, btree)) {
969 path[level].bp_sib_bh = bh;
970 path[level].bp_op = nilfs_btree_carry_left;
979 nilfs_btree_node_get_nchildren(parent) - 1) {
980 sibptr = nilfs_btree_node_get_ptr(btree, parent,
982 ret = nilfs_btree_get_block(btree, sibptr, &bh);
984 goto err_out_child_node;
985 sib = (struct nilfs_btree_node *)bh->b_data;
986 if (nilfs_btree_node_get_nchildren(sib) <
987 nilfs_btree_node_nchildren_max(sib, btree)) {
988 path[level].bp_sib_bh = bh;
989 path[level].bp_op = nilfs_btree_carry_right;
997 path[level].bp_newreq.bpr_ptr =
998 path[level - 1].bp_newreq.bpr_ptr + 1;
999 ret = nilfs_bmap_prepare_alloc_ptr(btree,
1000 &path[level].bp_newreq, dat);
1002 goto err_out_child_node;
1003 ret = nilfs_btree_get_new_block(btree,
1004 path[level].bp_newreq.bpr_ptr,
1007 goto err_out_curr_node;
1009 stats->bs_nblocks++;
1011 nilfs_btree_node_init(btree,
1012 (struct nilfs_btree_node *)bh->b_data,
1013 0, level, 0, NULL, NULL);
1014 path[level].bp_sib_bh = bh;
1015 path[level].bp_op = nilfs_btree_split;
1019 node = nilfs_btree_get_root(btree);
1020 if (nilfs_btree_node_get_nchildren(node) <
1021 nilfs_btree_node_nchildren_max(node, btree)) {
1022 path[level].bp_op = nilfs_btree_do_insert;
1023 stats->bs_nblocks++;
1028 path[level].bp_newreq.bpr_ptr = path[level - 1].bp_newreq.bpr_ptr + 1;
1029 ret = nilfs_bmap_prepare_alloc_ptr(btree, &path[level].bp_newreq, dat);
1031 goto err_out_child_node;
1032 ret = nilfs_btree_get_new_block(btree, path[level].bp_newreq.bpr_ptr,
1035 goto err_out_curr_node;
1037 nilfs_btree_node_init(btree, (struct nilfs_btree_node *)bh->b_data,
1038 0, level, 0, NULL, NULL);
1039 path[level].bp_sib_bh = bh;
1040 path[level].bp_op = nilfs_btree_grow;
1043 path[level].bp_op = nilfs_btree_do_insert;
1045 /* a newly-created node block and a data block are added */
1046 stats->bs_nblocks += 2;
1055 nilfs_bmap_abort_alloc_ptr(btree, &path[level].bp_newreq, dat);
1057 for (level--; level > NILFS_BTREE_LEVEL_DATA; level--) {
1058 nilfs_btnode_delete(path[level].bp_sib_bh);
1059 nilfs_bmap_abort_alloc_ptr(btree, &path[level].bp_newreq, dat);
1063 nilfs_bmap_abort_alloc_ptr(btree, &path[level].bp_newreq, dat);
1066 stats->bs_nblocks = 0;
1070 static void nilfs_btree_commit_insert(struct nilfs_bmap *btree,
1071 struct nilfs_btree_path *path,
1072 int maxlevel, __u64 key, __u64 ptr)
1074 struct inode *dat = NULL;
1077 set_buffer_nilfs_volatile((struct buffer_head *)((unsigned long)ptr));
1078 ptr = path[NILFS_BTREE_LEVEL_DATA].bp_newreq.bpr_ptr;
1079 if (NILFS_BMAP_USE_VBN(btree)) {
1080 nilfs_bmap_set_target_v(btree, key, ptr);
1081 dat = nilfs_bmap_get_dat(btree);
1084 for (level = NILFS_BTREE_LEVEL_NODE_MIN; level <= maxlevel; level++) {
1085 nilfs_bmap_commit_alloc_ptr(btree,
1086 &path[level - 1].bp_newreq, dat);
1087 path[level].bp_op(btree, path, level, &key, &ptr);
1090 if (!nilfs_bmap_dirty(btree))
1091 nilfs_bmap_set_dirty(btree);
1094 static int nilfs_btree_insert(struct nilfs_bmap *btree, __u64 key, __u64 ptr)
1096 struct nilfs_btree_path *path;
1097 struct nilfs_bmap_stats stats;
1100 path = nilfs_btree_alloc_path();
1104 ret = nilfs_btree_do_lookup(btree, path, key, NULL,
1105 NILFS_BTREE_LEVEL_NODE_MIN);
1106 if (ret != -ENOENT) {
1112 ret = nilfs_btree_prepare_insert(btree, path, &level, key, ptr, &stats);
1115 nilfs_btree_commit_insert(btree, path, level, key, ptr);
1116 nilfs_bmap_add_blocks(btree, stats.bs_nblocks);
1119 nilfs_btree_free_path(path);
1123 static void nilfs_btree_do_delete(struct nilfs_bmap *btree,
1124 struct nilfs_btree_path *path,
1125 int level, __u64 *keyp, __u64 *ptrp)
1127 struct nilfs_btree_node *node;
1129 if (level < nilfs_btree_height(btree) - 1) {
1130 node = nilfs_btree_get_nonroot_node(path, level);
1131 nilfs_btree_node_delete(btree, node, keyp, ptrp,
1132 path[level].bp_index);
1133 if (!buffer_dirty(path[level].bp_bh))
1134 nilfs_btnode_mark_dirty(path[level].bp_bh);
1135 if (path[level].bp_index == 0)
1136 nilfs_btree_promote_key(btree, path, level + 1,
1137 nilfs_btree_node_get_key(node, 0));
1139 node = nilfs_btree_get_root(btree);
1140 nilfs_btree_node_delete(btree, node, keyp, ptrp,
1141 path[level].bp_index);
1145 static void nilfs_btree_borrow_left(struct nilfs_bmap *btree,
1146 struct nilfs_btree_path *path,
1147 int level, __u64 *keyp, __u64 *ptrp)
1149 struct nilfs_btree_node *node, *left;
1150 int nchildren, lnchildren, n;
1152 nilfs_btree_do_delete(btree, path, level, keyp, ptrp);
1154 node = nilfs_btree_get_nonroot_node(path, level);
1155 left = nilfs_btree_get_sib_node(path, level);
1156 nchildren = nilfs_btree_node_get_nchildren(node);
1157 lnchildren = nilfs_btree_node_get_nchildren(left);
1159 n = (nchildren + lnchildren) / 2 - nchildren;
1161 nilfs_btree_node_move_right(btree, left, node, n);
1163 if (!buffer_dirty(path[level].bp_bh))
1164 nilfs_btnode_mark_dirty(path[level].bp_bh);
1165 if (!buffer_dirty(path[level].bp_sib_bh))
1166 nilfs_btnode_mark_dirty(path[level].bp_sib_bh);
1168 nilfs_btree_promote_key(btree, path, level + 1,
1169 nilfs_btree_node_get_key(node, 0));
1171 brelse(path[level].bp_sib_bh);
1172 path[level].bp_sib_bh = NULL;
1173 path[level].bp_index += n;
1176 static void nilfs_btree_borrow_right(struct nilfs_bmap *btree,
1177 struct nilfs_btree_path *path,
1178 int level, __u64 *keyp, __u64 *ptrp)
1180 struct nilfs_btree_node *node, *right;
1181 int nchildren, rnchildren, n;
1183 nilfs_btree_do_delete(btree, path, level, keyp, ptrp);
1185 node = nilfs_btree_get_nonroot_node(path, level);
1186 right = nilfs_btree_get_sib_node(path, level);
1187 nchildren = nilfs_btree_node_get_nchildren(node);
1188 rnchildren = nilfs_btree_node_get_nchildren(right);
1190 n = (nchildren + rnchildren) / 2 - nchildren;
1192 nilfs_btree_node_move_left(btree, node, right, n);
1194 if (!buffer_dirty(path[level].bp_bh))
1195 nilfs_btnode_mark_dirty(path[level].bp_bh);
1196 if (!buffer_dirty(path[level].bp_sib_bh))
1197 nilfs_btnode_mark_dirty(path[level].bp_sib_bh);
1199 path[level + 1].bp_index++;
1200 nilfs_btree_promote_key(btree, path, level + 1,
1201 nilfs_btree_node_get_key(right, 0));
1202 path[level + 1].bp_index--;
1204 brelse(path[level].bp_sib_bh);
1205 path[level].bp_sib_bh = NULL;
1208 static void nilfs_btree_concat_left(struct nilfs_bmap *btree,
1209 struct nilfs_btree_path *path,
1210 int level, __u64 *keyp, __u64 *ptrp)
1212 struct nilfs_btree_node *node, *left;
1215 nilfs_btree_do_delete(btree, path, level, keyp, ptrp);
1217 node = nilfs_btree_get_nonroot_node(path, level);
1218 left = nilfs_btree_get_sib_node(path, level);
1220 n = nilfs_btree_node_get_nchildren(node);
1222 nilfs_btree_node_move_left(btree, left, node, n);
1224 if (!buffer_dirty(path[level].bp_sib_bh))
1225 nilfs_btnode_mark_dirty(path[level].bp_sib_bh);
1227 nilfs_btnode_delete(path[level].bp_bh);
1228 path[level].bp_bh = path[level].bp_sib_bh;
1229 path[level].bp_sib_bh = NULL;
1230 path[level].bp_index += nilfs_btree_node_get_nchildren(left);
1233 static void nilfs_btree_concat_right(struct nilfs_bmap *btree,
1234 struct nilfs_btree_path *path,
1235 int level, __u64 *keyp, __u64 *ptrp)
1237 struct nilfs_btree_node *node, *right;
1240 nilfs_btree_do_delete(btree, path, level, keyp, ptrp);
1242 node = nilfs_btree_get_nonroot_node(path, level);
1243 right = nilfs_btree_get_sib_node(path, level);
1245 n = nilfs_btree_node_get_nchildren(right);
1247 nilfs_btree_node_move_left(btree, node, right, n);
1249 if (!buffer_dirty(path[level].bp_bh))
1250 nilfs_btnode_mark_dirty(path[level].bp_bh);
1252 nilfs_btnode_delete(path[level].bp_sib_bh);
1253 path[level].bp_sib_bh = NULL;
1254 path[level + 1].bp_index++;
1257 static void nilfs_btree_shrink(struct nilfs_bmap *btree,
1258 struct nilfs_btree_path *path,
1259 int level, __u64 *keyp, __u64 *ptrp)
1261 struct nilfs_btree_node *root, *child;
1264 nilfs_btree_do_delete(btree, path, level, keyp, ptrp);
1266 root = nilfs_btree_get_root(btree);
1267 child = nilfs_btree_get_nonroot_node(path, level);
1269 nilfs_btree_node_delete(btree, root, NULL, NULL, 0);
1270 nilfs_btree_node_set_level(root, level);
1271 n = nilfs_btree_node_get_nchildren(child);
1272 nilfs_btree_node_move_left(btree, root, child, n);
1274 nilfs_btnode_delete(path[level].bp_bh);
1275 path[level].bp_bh = NULL;
1279 static int nilfs_btree_prepare_delete(struct nilfs_bmap *btree,
1280 struct nilfs_btree_path *path,
1282 struct nilfs_bmap_stats *stats,
1285 struct buffer_head *bh;
1286 struct nilfs_btree_node *node, *parent, *sib;
1288 int pindex, level, ret;
1291 stats->bs_nblocks = 0;
1292 for (level = NILFS_BTREE_LEVEL_NODE_MIN;
1293 level < nilfs_btree_height(btree) - 1;
1295 node = nilfs_btree_get_nonroot_node(path, level);
1296 path[level].bp_oldreq.bpr_ptr =
1297 nilfs_btree_node_get_ptr(btree, node,
1298 path[level].bp_index);
1299 ret = nilfs_bmap_prepare_end_ptr(btree,
1300 &path[level].bp_oldreq, dat);
1302 goto err_out_child_node;
1304 if (nilfs_btree_node_get_nchildren(node) >
1305 nilfs_btree_node_nchildren_min(node, btree)) {
1306 path[level].bp_op = nilfs_btree_do_delete;
1307 stats->bs_nblocks++;
1311 parent = nilfs_btree_get_node(btree, path, level + 1);
1312 pindex = path[level + 1].bp_index;
1316 sibptr = nilfs_btree_node_get_ptr(btree, parent,
1318 ret = nilfs_btree_get_block(btree, sibptr, &bh);
1320 goto err_out_curr_node;
1321 sib = (struct nilfs_btree_node *)bh->b_data;
1322 if (nilfs_btree_node_get_nchildren(sib) >
1323 nilfs_btree_node_nchildren_min(sib, btree)) {
1324 path[level].bp_sib_bh = bh;
1325 path[level].bp_op = nilfs_btree_borrow_left;
1326 stats->bs_nblocks++;
1329 path[level].bp_sib_bh = bh;
1330 path[level].bp_op = nilfs_btree_concat_left;
1331 stats->bs_nblocks++;
1335 nilfs_btree_node_get_nchildren(parent) - 1) {
1337 sibptr = nilfs_btree_node_get_ptr(btree, parent,
1339 ret = nilfs_btree_get_block(btree, sibptr, &bh);
1341 goto err_out_curr_node;
1342 sib = (struct nilfs_btree_node *)bh->b_data;
1343 if (nilfs_btree_node_get_nchildren(sib) >
1344 nilfs_btree_node_nchildren_min(sib, btree)) {
1345 path[level].bp_sib_bh = bh;
1346 path[level].bp_op = nilfs_btree_borrow_right;
1347 stats->bs_nblocks++;
1350 path[level].bp_sib_bh = bh;
1351 path[level].bp_op = nilfs_btree_concat_right;
1352 stats->bs_nblocks++;
1357 /* the only child of the root node */
1358 WARN_ON(level != nilfs_btree_height(btree) - 2);
1359 if (nilfs_btree_node_get_nchildren(node) - 1 <=
1360 NILFS_BTREE_ROOT_NCHILDREN_MAX) {
1361 path[level].bp_op = nilfs_btree_shrink;
1362 stats->bs_nblocks += 2;
1364 path[level].bp_op = nilfs_btree_do_delete;
1365 stats->bs_nblocks++;
1373 node = nilfs_btree_get_root(btree);
1374 path[level].bp_oldreq.bpr_ptr =
1375 nilfs_btree_node_get_ptr(btree, node, path[level].bp_index);
1377 ret = nilfs_bmap_prepare_end_ptr(btree, &path[level].bp_oldreq, dat);
1379 goto err_out_child_node;
1381 /* child of the root node is deleted */
1382 path[level].bp_op = nilfs_btree_do_delete;
1383 stats->bs_nblocks++;
1392 nilfs_bmap_abort_end_ptr(btree, &path[level].bp_oldreq, dat);
1394 for (level--; level >= NILFS_BTREE_LEVEL_NODE_MIN; level--) {
1395 brelse(path[level].bp_sib_bh);
1396 nilfs_bmap_abort_end_ptr(btree, &path[level].bp_oldreq, dat);
1399 stats->bs_nblocks = 0;
1403 static void nilfs_btree_commit_delete(struct nilfs_bmap *btree,
1404 struct nilfs_btree_path *path,
1405 int maxlevel, struct inode *dat)
1409 for (level = NILFS_BTREE_LEVEL_NODE_MIN; level <= maxlevel; level++) {
1410 nilfs_bmap_commit_end_ptr(btree, &path[level].bp_oldreq, dat);
1411 path[level].bp_op(btree, path, level, NULL, NULL);
1414 if (!nilfs_bmap_dirty(btree))
1415 nilfs_bmap_set_dirty(btree);
1418 static int nilfs_btree_delete(struct nilfs_bmap *btree, __u64 key)
1421 struct nilfs_btree_path *path;
1422 struct nilfs_bmap_stats stats;
1426 path = nilfs_btree_alloc_path();
1430 ret = nilfs_btree_do_lookup(btree, path, key, NULL,
1431 NILFS_BTREE_LEVEL_NODE_MIN);
1436 dat = NILFS_BMAP_USE_VBN(btree) ? nilfs_bmap_get_dat(btree) : NULL;
1438 ret = nilfs_btree_prepare_delete(btree, path, &level, &stats, dat);
1441 nilfs_btree_commit_delete(btree, path, level, dat);
1442 nilfs_bmap_sub_blocks(btree, stats.bs_nblocks);
1445 nilfs_btree_free_path(path);
1449 static int nilfs_btree_last_key(const struct nilfs_bmap *btree, __u64 *keyp)
1451 struct nilfs_btree_path *path;
1454 path = nilfs_btree_alloc_path();
1458 ret = nilfs_btree_do_lookup_last(btree, path, keyp, NULL);
1460 nilfs_btree_free_path(path);
1465 static int nilfs_btree_check_delete(struct nilfs_bmap *btree, __u64 key)
1467 struct buffer_head *bh;
1468 struct nilfs_btree_node *root, *node;
1469 __u64 maxkey, nextmaxkey;
1473 root = nilfs_btree_get_root(btree);
1474 switch (nilfs_btree_height(btree)) {
1480 nchildren = nilfs_btree_node_get_nchildren(root);
1483 ptr = nilfs_btree_node_get_ptr(btree, root, nchildren - 1);
1484 ret = nilfs_btree_get_block(btree, ptr, &bh);
1487 node = (struct nilfs_btree_node *)bh->b_data;
1493 nchildren = nilfs_btree_node_get_nchildren(node);
1494 maxkey = nilfs_btree_node_get_key(node, nchildren - 1);
1495 nextmaxkey = (nchildren > 1) ?
1496 nilfs_btree_node_get_key(node, nchildren - 2) : 0;
1500 return (maxkey == key) && (nextmaxkey < NILFS_BMAP_LARGE_LOW);
1503 static int nilfs_btree_gather_data(struct nilfs_bmap *btree,
1504 __u64 *keys, __u64 *ptrs, int nitems)
1506 struct buffer_head *bh;
1507 struct nilfs_btree_node *node, *root;
1511 int nchildren, i, ret;
1513 root = nilfs_btree_get_root(btree);
1514 switch (nilfs_btree_height(btree)) {
1520 nchildren = nilfs_btree_node_get_nchildren(root);
1521 WARN_ON(nchildren > 1);
1522 ptr = nilfs_btree_node_get_ptr(btree, root, nchildren - 1);
1523 ret = nilfs_btree_get_block(btree, ptr, &bh);
1526 node = (struct nilfs_btree_node *)bh->b_data;
1533 nchildren = nilfs_btree_node_get_nchildren(node);
1534 if (nchildren < nitems)
1536 dkeys = nilfs_btree_node_dkeys(node);
1537 dptrs = nilfs_btree_node_dptrs(node, btree);
1538 for (i = 0; i < nitems; i++) {
1539 keys[i] = le64_to_cpu(dkeys[i]);
1540 ptrs[i] = le64_to_cpu(dptrs[i]);
1550 nilfs_btree_prepare_convert_and_insert(struct nilfs_bmap *btree, __u64 key,
1551 union nilfs_bmap_ptr_req *dreq,
1552 union nilfs_bmap_ptr_req *nreq,
1553 struct buffer_head **bhp,
1554 struct nilfs_bmap_stats *stats)
1556 struct buffer_head *bh;
1557 struct inode *dat = NULL;
1560 stats->bs_nblocks = 0;
1563 /* cannot find near ptr */
1564 if (NILFS_BMAP_USE_VBN(btree)) {
1565 dreq->bpr_ptr = nilfs_btree_find_target_v(btree, NULL, key);
1566 dat = nilfs_bmap_get_dat(btree);
1569 ret = nilfs_bmap_prepare_alloc_ptr(btree, dreq, dat);
1574 stats->bs_nblocks++;
1576 nreq->bpr_ptr = dreq->bpr_ptr + 1;
1577 ret = nilfs_bmap_prepare_alloc_ptr(btree, nreq, dat);
1581 ret = nilfs_btree_get_new_block(btree, nreq->bpr_ptr, &bh);
1586 stats->bs_nblocks++;
1594 nilfs_bmap_abort_alloc_ptr(btree, nreq, dat);
1596 nilfs_bmap_abort_alloc_ptr(btree, dreq, dat);
1597 stats->bs_nblocks = 0;
1603 nilfs_btree_commit_convert_and_insert(struct nilfs_bmap *btree,
1604 __u64 key, __u64 ptr,
1605 const __u64 *keys, const __u64 *ptrs,
1607 union nilfs_bmap_ptr_req *dreq,
1608 union nilfs_bmap_ptr_req *nreq,
1609 struct buffer_head *bh)
1611 struct nilfs_btree_node *node;
1615 /* free resources */
1616 if (btree->b_ops->bop_clear != NULL)
1617 btree->b_ops->bop_clear(btree);
1619 /* ptr must be a pointer to a buffer head. */
1620 set_buffer_nilfs_volatile((struct buffer_head *)((unsigned long)ptr));
1622 /* convert and insert */
1623 dat = NILFS_BMAP_USE_VBN(btree) ? nilfs_bmap_get_dat(btree) : NULL;
1624 nilfs_btree_init(btree);
1626 nilfs_bmap_commit_alloc_ptr(btree, dreq, dat);
1627 nilfs_bmap_commit_alloc_ptr(btree, nreq, dat);
1629 /* create child node at level 1 */
1630 node = (struct nilfs_btree_node *)bh->b_data;
1631 nilfs_btree_node_init(btree, node, 0, 1, n, keys, ptrs);
1632 nilfs_btree_node_insert(btree, node, key, dreq->bpr_ptr, n);
1633 if (!buffer_dirty(bh))
1634 nilfs_btnode_mark_dirty(bh);
1635 if (!nilfs_bmap_dirty(btree))
1636 nilfs_bmap_set_dirty(btree);
1640 /* create root node at level 2 */
1641 node = nilfs_btree_get_root(btree);
1642 tmpptr = nreq->bpr_ptr;
1643 nilfs_btree_node_init(btree, node, NILFS_BTREE_NODE_ROOT,
1644 2, 1, &keys[0], &tmpptr);
1646 nilfs_bmap_commit_alloc_ptr(btree, dreq, dat);
1648 /* create root node at level 1 */
1649 node = nilfs_btree_get_root(btree);
1650 nilfs_btree_node_init(btree, node, NILFS_BTREE_NODE_ROOT,
1652 nilfs_btree_node_insert(btree, node, key, dreq->bpr_ptr, n);
1653 if (!nilfs_bmap_dirty(btree))
1654 nilfs_bmap_set_dirty(btree);
1657 if (NILFS_BMAP_USE_VBN(btree))
1658 nilfs_bmap_set_target_v(btree, key, dreq->bpr_ptr);
1662 * nilfs_btree_convert_and_insert -
1670 int nilfs_btree_convert_and_insert(struct nilfs_bmap *btree,
1671 __u64 key, __u64 ptr,
1672 const __u64 *keys, const __u64 *ptrs, int n)
1674 struct buffer_head *bh;
1675 union nilfs_bmap_ptr_req dreq, nreq, *di, *ni;
1676 struct nilfs_bmap_stats stats;
1679 if (n + 1 <= NILFS_BTREE_ROOT_NCHILDREN_MAX) {
1682 } else if ((n + 1) <= NILFS_BTREE_NODE_NCHILDREN_MAX(
1683 1 << btree->b_inode->i_blkbits)) {
1692 ret = nilfs_btree_prepare_convert_and_insert(btree, key, di, ni, &bh,
1696 nilfs_btree_commit_convert_and_insert(btree, key, ptr, keys, ptrs, n,
1698 nilfs_bmap_add_blocks(btree, stats.bs_nblocks);
1702 static int nilfs_btree_propagate_p(struct nilfs_bmap *btree,
1703 struct nilfs_btree_path *path,
1705 struct buffer_head *bh)
1707 while ((++level < nilfs_btree_height(btree) - 1) &&
1708 !buffer_dirty(path[level].bp_bh))
1709 nilfs_btnode_mark_dirty(path[level].bp_bh);
1714 static int nilfs_btree_prepare_update_v(struct nilfs_bmap *btree,
1715 struct nilfs_btree_path *path,
1716 int level, struct inode *dat)
1718 struct nilfs_btree_node *parent;
1721 parent = nilfs_btree_get_node(btree, path, level + 1);
1722 path[level].bp_oldreq.bpr_ptr =
1723 nilfs_btree_node_get_ptr(btree, parent,
1724 path[level + 1].bp_index);
1725 path[level].bp_newreq.bpr_ptr = path[level].bp_oldreq.bpr_ptr + 1;
1726 ret = nilfs_dat_prepare_update(dat, &path[level].bp_oldreq.bpr_req,
1727 &path[level].bp_newreq.bpr_req);
1731 if (buffer_nilfs_node(path[level].bp_bh)) {
1732 path[level].bp_ctxt.oldkey = path[level].bp_oldreq.bpr_ptr;
1733 path[level].bp_ctxt.newkey = path[level].bp_newreq.bpr_ptr;
1734 path[level].bp_ctxt.bh = path[level].bp_bh;
1735 ret = nilfs_btnode_prepare_change_key(
1736 &NILFS_BMAP_I(btree)->i_btnode_cache,
1737 &path[level].bp_ctxt);
1739 nilfs_dat_abort_update(dat,
1740 &path[level].bp_oldreq.bpr_req,
1741 &path[level].bp_newreq.bpr_req);
1749 static void nilfs_btree_commit_update_v(struct nilfs_bmap *btree,
1750 struct nilfs_btree_path *path,
1751 int level, struct inode *dat)
1753 struct nilfs_btree_node *parent;
1755 nilfs_dat_commit_update(dat, &path[level].bp_oldreq.bpr_req,
1756 &path[level].bp_newreq.bpr_req,
1757 btree->b_ptr_type == NILFS_BMAP_PTR_VS);
1759 if (buffer_nilfs_node(path[level].bp_bh)) {
1760 nilfs_btnode_commit_change_key(
1761 &NILFS_BMAP_I(btree)->i_btnode_cache,
1762 &path[level].bp_ctxt);
1763 path[level].bp_bh = path[level].bp_ctxt.bh;
1765 set_buffer_nilfs_volatile(path[level].bp_bh);
1767 parent = nilfs_btree_get_node(btree, path, level + 1);
1768 nilfs_btree_node_set_ptr(btree, parent, path[level + 1].bp_index,
1769 path[level].bp_newreq.bpr_ptr);
1772 static void nilfs_btree_abort_update_v(struct nilfs_bmap *btree,
1773 struct nilfs_btree_path *path,
1774 int level, struct inode *dat)
1776 nilfs_dat_abort_update(dat, &path[level].bp_oldreq.bpr_req,
1777 &path[level].bp_newreq.bpr_req);
1778 if (buffer_nilfs_node(path[level].bp_bh))
1779 nilfs_btnode_abort_change_key(
1780 &NILFS_BMAP_I(btree)->i_btnode_cache,
1781 &path[level].bp_ctxt);
1784 static int nilfs_btree_prepare_propagate_v(struct nilfs_bmap *btree,
1785 struct nilfs_btree_path *path,
1786 int minlevel, int *maxlevelp,
1792 if (!buffer_nilfs_volatile(path[level].bp_bh)) {
1793 ret = nilfs_btree_prepare_update_v(btree, path, level, dat);
1797 while ((++level < nilfs_btree_height(btree) - 1) &&
1798 !buffer_dirty(path[level].bp_bh)) {
1800 WARN_ON(buffer_nilfs_volatile(path[level].bp_bh));
1801 ret = nilfs_btree_prepare_update_v(btree, path, level, dat);
1807 *maxlevelp = level - 1;
1812 while (--level > minlevel)
1813 nilfs_btree_abort_update_v(btree, path, level, dat);
1814 if (!buffer_nilfs_volatile(path[level].bp_bh))
1815 nilfs_btree_abort_update_v(btree, path, level, dat);
1819 static void nilfs_btree_commit_propagate_v(struct nilfs_bmap *btree,
1820 struct nilfs_btree_path *path,
1821 int minlevel, int maxlevel,
1822 struct buffer_head *bh,
1827 if (!buffer_nilfs_volatile(path[minlevel].bp_bh))
1828 nilfs_btree_commit_update_v(btree, path, minlevel, dat);
1830 for (level = minlevel + 1; level <= maxlevel; level++)
1831 nilfs_btree_commit_update_v(btree, path, level, dat);
1834 static int nilfs_btree_propagate_v(struct nilfs_bmap *btree,
1835 struct nilfs_btree_path *path,
1836 int level, struct buffer_head *bh)
1838 int maxlevel = 0, ret;
1839 struct nilfs_btree_node *parent;
1840 struct inode *dat = nilfs_bmap_get_dat(btree);
1844 path[level].bp_bh = bh;
1845 ret = nilfs_btree_prepare_propagate_v(btree, path, level, &maxlevel,
1850 if (buffer_nilfs_volatile(path[level].bp_bh)) {
1851 parent = nilfs_btree_get_node(btree, path, level + 1);
1852 ptr = nilfs_btree_node_get_ptr(btree, parent,
1853 path[level + 1].bp_index);
1854 ret = nilfs_dat_mark_dirty(dat, ptr);
1859 nilfs_btree_commit_propagate_v(btree, path, level, maxlevel, bh, dat);
1862 brelse(path[level].bp_bh);
1863 path[level].bp_bh = NULL;
1867 static int nilfs_btree_propagate(struct nilfs_bmap *btree,
1868 struct buffer_head *bh)
1870 struct nilfs_btree_path *path;
1871 struct nilfs_btree_node *node;
1875 WARN_ON(!buffer_dirty(bh));
1877 path = nilfs_btree_alloc_path();
1881 if (buffer_nilfs_node(bh)) {
1882 node = (struct nilfs_btree_node *)bh->b_data;
1883 key = nilfs_btree_node_get_key(node, 0);
1884 level = nilfs_btree_node_get_level(node);
1886 key = nilfs_bmap_data_get_key(btree, bh);
1887 level = NILFS_BTREE_LEVEL_DATA;
1890 ret = nilfs_btree_do_lookup(btree, path, key, NULL, level + 1);
1892 if (unlikely(ret == -ENOENT))
1893 printk(KERN_CRIT "%s: key = %llu, level == %d\n",
1894 __func__, (unsigned long long)key, level);
1898 ret = NILFS_BMAP_USE_VBN(btree) ?
1899 nilfs_btree_propagate_v(btree, path, level, bh) :
1900 nilfs_btree_propagate_p(btree, path, level, bh);
1903 nilfs_btree_free_path(path);
1908 static int nilfs_btree_propagate_gc(struct nilfs_bmap *btree,
1909 struct buffer_head *bh)
1911 return nilfs_dat_mark_dirty(nilfs_bmap_get_dat(btree), bh->b_blocknr);
1914 static void nilfs_btree_add_dirty_buffer(struct nilfs_bmap *btree,
1915 struct list_head *lists,
1916 struct buffer_head *bh)
1918 struct list_head *head;
1919 struct buffer_head *cbh;
1920 struct nilfs_btree_node *node, *cnode;
1925 node = (struct nilfs_btree_node *)bh->b_data;
1926 key = nilfs_btree_node_get_key(node, 0);
1927 level = nilfs_btree_node_get_level(node);
1928 if (level < NILFS_BTREE_LEVEL_NODE_MIN ||
1929 level >= NILFS_BTREE_LEVEL_MAX) {
1932 "%s: invalid btree level: %d (key=%llu, ino=%lu, "
1934 __func__, level, (unsigned long long)key,
1935 NILFS_BMAP_I(btree)->vfs_inode.i_ino,
1936 (unsigned long long)bh->b_blocknr);
1940 list_for_each(head, &lists[level]) {
1941 cbh = list_entry(head, struct buffer_head, b_assoc_buffers);
1942 cnode = (struct nilfs_btree_node *)cbh->b_data;
1943 ckey = nilfs_btree_node_get_key(cnode, 0);
1947 list_add_tail(&bh->b_assoc_buffers, head);
1950 static void nilfs_btree_lookup_dirty_buffers(struct nilfs_bmap *btree,
1951 struct list_head *listp)
1953 struct address_space *btcache = &NILFS_BMAP_I(btree)->i_btnode_cache;
1954 struct list_head lists[NILFS_BTREE_LEVEL_MAX];
1955 struct pagevec pvec;
1956 struct buffer_head *bh, *head;
1960 for (level = NILFS_BTREE_LEVEL_NODE_MIN;
1961 level < NILFS_BTREE_LEVEL_MAX;
1963 INIT_LIST_HEAD(&lists[level]);
1965 pagevec_init(&pvec, 0);
1967 while (pagevec_lookup_tag(&pvec, btcache, &index, PAGECACHE_TAG_DIRTY,
1969 for (i = 0; i < pagevec_count(&pvec); i++) {
1970 bh = head = page_buffers(pvec.pages[i]);
1972 if (buffer_dirty(bh))
1973 nilfs_btree_add_dirty_buffer(btree,
1975 } while ((bh = bh->b_this_page) != head);
1977 pagevec_release(&pvec);
1981 for (level = NILFS_BTREE_LEVEL_NODE_MIN;
1982 level < NILFS_BTREE_LEVEL_MAX;
1984 list_splice_tail(&lists[level], listp);
1987 static int nilfs_btree_assign_p(struct nilfs_bmap *btree,
1988 struct nilfs_btree_path *path,
1990 struct buffer_head **bh,
1992 union nilfs_binfo *binfo)
1994 struct nilfs_btree_node *parent;
1999 parent = nilfs_btree_get_node(btree, path, level + 1);
2000 ptr = nilfs_btree_node_get_ptr(btree, parent,
2001 path[level + 1].bp_index);
2002 if (buffer_nilfs_node(*bh)) {
2003 path[level].bp_ctxt.oldkey = ptr;
2004 path[level].bp_ctxt.newkey = blocknr;
2005 path[level].bp_ctxt.bh = *bh;
2006 ret = nilfs_btnode_prepare_change_key(
2007 &NILFS_BMAP_I(btree)->i_btnode_cache,
2008 &path[level].bp_ctxt);
2011 nilfs_btnode_commit_change_key(
2012 &NILFS_BMAP_I(btree)->i_btnode_cache,
2013 &path[level].bp_ctxt);
2014 *bh = path[level].bp_ctxt.bh;
2017 nilfs_btree_node_set_ptr(btree, parent,
2018 path[level + 1].bp_index, blocknr);
2020 key = nilfs_btree_node_get_key(parent, path[level + 1].bp_index);
2021 /* on-disk format */
2022 binfo->bi_dat.bi_blkoff = cpu_to_le64(key);
2023 binfo->bi_dat.bi_level = level;
2028 static int nilfs_btree_assign_v(struct nilfs_bmap *btree,
2029 struct nilfs_btree_path *path,
2031 struct buffer_head **bh,
2033 union nilfs_binfo *binfo)
2035 struct nilfs_btree_node *parent;
2036 struct inode *dat = nilfs_bmap_get_dat(btree);
2039 union nilfs_bmap_ptr_req req;
2042 parent = nilfs_btree_get_node(btree, path, level + 1);
2043 ptr = nilfs_btree_node_get_ptr(btree, parent, path[level + 1].bp_index);
2045 ret = nilfs_dat_prepare_start(dat, &req.bpr_req);
2048 nilfs_dat_commit_start(dat, &req.bpr_req, blocknr);
2050 key = nilfs_btree_node_get_key(parent, path[level + 1].bp_index);
2051 /* on-disk format */
2052 binfo->bi_v.bi_vblocknr = cpu_to_le64(ptr);
2053 binfo->bi_v.bi_blkoff = cpu_to_le64(key);
2058 static int nilfs_btree_assign(struct nilfs_bmap *btree,
2059 struct buffer_head **bh,
2061 union nilfs_binfo *binfo)
2063 struct nilfs_btree_path *path;
2064 struct nilfs_btree_node *node;
2068 path = nilfs_btree_alloc_path();
2072 if (buffer_nilfs_node(*bh)) {
2073 node = (struct nilfs_btree_node *)(*bh)->b_data;
2074 key = nilfs_btree_node_get_key(node, 0);
2075 level = nilfs_btree_node_get_level(node);
2077 key = nilfs_bmap_data_get_key(btree, *bh);
2078 level = NILFS_BTREE_LEVEL_DATA;
2081 ret = nilfs_btree_do_lookup(btree, path, key, NULL, level + 1);
2083 WARN_ON(ret == -ENOENT);
2087 ret = NILFS_BMAP_USE_VBN(btree) ?
2088 nilfs_btree_assign_v(btree, path, level, bh, blocknr, binfo) :
2089 nilfs_btree_assign_p(btree, path, level, bh, blocknr, binfo);
2092 nilfs_btree_free_path(path);
2097 static int nilfs_btree_assign_gc(struct nilfs_bmap *btree,
2098 struct buffer_head **bh,
2100 union nilfs_binfo *binfo)
2102 struct nilfs_btree_node *node;
2106 ret = nilfs_dat_move(nilfs_bmap_get_dat(btree), (*bh)->b_blocknr,
2111 if (buffer_nilfs_node(*bh)) {
2112 node = (struct nilfs_btree_node *)(*bh)->b_data;
2113 key = nilfs_btree_node_get_key(node, 0);
2115 key = nilfs_bmap_data_get_key(btree, *bh);
2117 /* on-disk format */
2118 binfo->bi_v.bi_vblocknr = cpu_to_le64((*bh)->b_blocknr);
2119 binfo->bi_v.bi_blkoff = cpu_to_le64(key);
2124 static int nilfs_btree_mark(struct nilfs_bmap *btree, __u64 key, int level)
2126 struct buffer_head *bh;
2127 struct nilfs_btree_path *path;
2131 path = nilfs_btree_alloc_path();
2135 ret = nilfs_btree_do_lookup(btree, path, key, &ptr, level + 1);
2137 WARN_ON(ret == -ENOENT);
2140 ret = nilfs_btree_get_block(btree, ptr, &bh);
2142 WARN_ON(ret == -ENOENT);
2146 if (!buffer_dirty(bh))
2147 nilfs_btnode_mark_dirty(bh);
2149 if (!nilfs_bmap_dirty(btree))
2150 nilfs_bmap_set_dirty(btree);
2153 nilfs_btree_free_path(path);
2157 static const struct nilfs_bmap_operations nilfs_btree_ops = {
2158 .bop_lookup = nilfs_btree_lookup,
2159 .bop_lookup_contig = nilfs_btree_lookup_contig,
2160 .bop_insert = nilfs_btree_insert,
2161 .bop_delete = nilfs_btree_delete,
2164 .bop_propagate = nilfs_btree_propagate,
2166 .bop_lookup_dirty_buffers = nilfs_btree_lookup_dirty_buffers,
2168 .bop_assign = nilfs_btree_assign,
2169 .bop_mark = nilfs_btree_mark,
2171 .bop_last_key = nilfs_btree_last_key,
2172 .bop_check_insert = NULL,
2173 .bop_check_delete = nilfs_btree_check_delete,
2174 .bop_gather_data = nilfs_btree_gather_data,
2177 static const struct nilfs_bmap_operations nilfs_btree_ops_gc = {
2179 .bop_lookup_contig = NULL,
2184 .bop_propagate = nilfs_btree_propagate_gc,
2186 .bop_lookup_dirty_buffers = nilfs_btree_lookup_dirty_buffers,
2188 .bop_assign = nilfs_btree_assign_gc,
2191 .bop_last_key = NULL,
2192 .bop_check_insert = NULL,
2193 .bop_check_delete = NULL,
2194 .bop_gather_data = NULL,
2197 int nilfs_btree_init(struct nilfs_bmap *bmap)
2199 bmap->b_ops = &nilfs_btree_ops;
2203 void nilfs_btree_init_gc(struct nilfs_bmap *bmap)
2205 bmap->b_ops = &nilfs_btree_ops_gc;