xref: /linux/fs/nilfs2/btree.c (revision b85d45947951d23cb22d90caecf4c1eb81342c96)
1 /*
2  * btree.c - NILFS B-tree.
3  *
4  * Copyright (C) 2005-2008 Nippon Telegraph and Telephone Corporation.
5  *
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.
10  *
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.
15  *
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
19  *
20  * Written by Koji Sato <koji@osrg.net>.
21  */
22 
23 #include <linux/slab.h>
24 #include <linux/string.h>
25 #include <linux/errno.h>
26 #include <linux/pagevec.h>
27 #include "nilfs.h"
28 #include "page.h"
29 #include "btnode.h"
30 #include "btree.h"
31 #include "alloc.h"
32 #include "dat.h"
33 
34 static void __nilfs_btree_init(struct nilfs_bmap *bmap);
35 
36 static struct nilfs_btree_path *nilfs_btree_alloc_path(void)
37 {
38 	struct nilfs_btree_path *path;
39 	int level = NILFS_BTREE_LEVEL_DATA;
40 
41 	path = kmem_cache_alloc(nilfs_btree_path_cache, GFP_NOFS);
42 	if (path == NULL)
43 		goto out;
44 
45 	for (; level < NILFS_BTREE_LEVEL_MAX; level++) {
46 		path[level].bp_bh = NULL;
47 		path[level].bp_sib_bh = NULL;
48 		path[level].bp_index = 0;
49 		path[level].bp_oldreq.bpr_ptr = NILFS_BMAP_INVALID_PTR;
50 		path[level].bp_newreq.bpr_ptr = NILFS_BMAP_INVALID_PTR;
51 		path[level].bp_op = NULL;
52 	}
53 
54 out:
55 	return path;
56 }
57 
58 static void nilfs_btree_free_path(struct nilfs_btree_path *path)
59 {
60 	int level = NILFS_BTREE_LEVEL_DATA;
61 
62 	for (; level < NILFS_BTREE_LEVEL_MAX; level++)
63 		brelse(path[level].bp_bh);
64 
65 	kmem_cache_free(nilfs_btree_path_cache, path);
66 }
67 
68 /*
69  * B-tree node operations
70  */
71 static int nilfs_btree_get_new_block(const struct nilfs_bmap *btree,
72 				     __u64 ptr, struct buffer_head **bhp)
73 {
74 	struct address_space *btnc = &NILFS_BMAP_I(btree)->i_btnode_cache;
75 	struct buffer_head *bh;
76 
77 	bh = nilfs_btnode_create_block(btnc, ptr);
78 	if (!bh)
79 		return -ENOMEM;
80 
81 	set_buffer_nilfs_volatile(bh);
82 	*bhp = bh;
83 	return 0;
84 }
85 
86 static int nilfs_btree_node_get_flags(const struct nilfs_btree_node *node)
87 {
88 	return node->bn_flags;
89 }
90 
91 static void
92 nilfs_btree_node_set_flags(struct nilfs_btree_node *node, int flags)
93 {
94 	node->bn_flags = flags;
95 }
96 
97 static int nilfs_btree_node_root(const struct nilfs_btree_node *node)
98 {
99 	return nilfs_btree_node_get_flags(node) & NILFS_BTREE_NODE_ROOT;
100 }
101 
102 static int nilfs_btree_node_get_level(const struct nilfs_btree_node *node)
103 {
104 	return node->bn_level;
105 }
106 
107 static void
108 nilfs_btree_node_set_level(struct nilfs_btree_node *node, int level)
109 {
110 	node->bn_level = level;
111 }
112 
113 static int nilfs_btree_node_get_nchildren(const struct nilfs_btree_node *node)
114 {
115 	return le16_to_cpu(node->bn_nchildren);
116 }
117 
118 static void
119 nilfs_btree_node_set_nchildren(struct nilfs_btree_node *node, int nchildren)
120 {
121 	node->bn_nchildren = cpu_to_le16(nchildren);
122 }
123 
124 static int nilfs_btree_node_size(const struct nilfs_bmap *btree)
125 {
126 	return 1 << btree->b_inode->i_blkbits;
127 }
128 
129 static int nilfs_btree_nchildren_per_block(const struct nilfs_bmap *btree)
130 {
131 	return btree->b_nchildren_per_block;
132 }
133 
134 static __le64 *
135 nilfs_btree_node_dkeys(const struct nilfs_btree_node *node)
136 {
137 	return (__le64 *)((char *)(node + 1) +
138 			  (nilfs_btree_node_root(node) ?
139 			   0 : NILFS_BTREE_NODE_EXTRA_PAD_SIZE));
140 }
141 
142 static __le64 *
143 nilfs_btree_node_dptrs(const struct nilfs_btree_node *node, int ncmax)
144 {
145 	return (__le64 *)(nilfs_btree_node_dkeys(node) + ncmax);
146 }
147 
148 static __u64
149 nilfs_btree_node_get_key(const struct nilfs_btree_node *node, int index)
150 {
151 	return le64_to_cpu(*(nilfs_btree_node_dkeys(node) + index));
152 }
153 
154 static void
155 nilfs_btree_node_set_key(struct nilfs_btree_node *node, int index, __u64 key)
156 {
157 	*(nilfs_btree_node_dkeys(node) + index) = cpu_to_le64(key);
158 }
159 
160 static __u64
161 nilfs_btree_node_get_ptr(const struct nilfs_btree_node *node, int index,
162 			 int ncmax)
163 {
164 	return le64_to_cpu(*(nilfs_btree_node_dptrs(node, ncmax) + index));
165 }
166 
167 static void
168 nilfs_btree_node_set_ptr(struct nilfs_btree_node *node, int index, __u64 ptr,
169 			 int ncmax)
170 {
171 	*(nilfs_btree_node_dptrs(node, ncmax) + index) = cpu_to_le64(ptr);
172 }
173 
174 static void nilfs_btree_node_init(struct nilfs_btree_node *node, int flags,
175 				  int level, int nchildren, int ncmax,
176 				  const __u64 *keys, const __u64 *ptrs)
177 {
178 	__le64 *dkeys;
179 	__le64 *dptrs;
180 	int i;
181 
182 	nilfs_btree_node_set_flags(node, flags);
183 	nilfs_btree_node_set_level(node, level);
184 	nilfs_btree_node_set_nchildren(node, nchildren);
185 
186 	dkeys = nilfs_btree_node_dkeys(node);
187 	dptrs = nilfs_btree_node_dptrs(node, ncmax);
188 	for (i = 0; i < nchildren; i++) {
189 		dkeys[i] = cpu_to_le64(keys[i]);
190 		dptrs[i] = cpu_to_le64(ptrs[i]);
191 	}
192 }
193 
194 /* Assume the buffer heads corresponding to left and right are locked. */
195 static void nilfs_btree_node_move_left(struct nilfs_btree_node *left,
196 				       struct nilfs_btree_node *right,
197 				       int n, int lncmax, int rncmax)
198 {
199 	__le64 *ldkeys, *rdkeys;
200 	__le64 *ldptrs, *rdptrs;
201 	int lnchildren, rnchildren;
202 
203 	ldkeys = nilfs_btree_node_dkeys(left);
204 	ldptrs = nilfs_btree_node_dptrs(left, lncmax);
205 	lnchildren = nilfs_btree_node_get_nchildren(left);
206 
207 	rdkeys = nilfs_btree_node_dkeys(right);
208 	rdptrs = nilfs_btree_node_dptrs(right, rncmax);
209 	rnchildren = nilfs_btree_node_get_nchildren(right);
210 
211 	memcpy(ldkeys + lnchildren, rdkeys, n * sizeof(*rdkeys));
212 	memcpy(ldptrs + lnchildren, rdptrs, n * sizeof(*rdptrs));
213 	memmove(rdkeys, rdkeys + n, (rnchildren - n) * sizeof(*rdkeys));
214 	memmove(rdptrs, rdptrs + n, (rnchildren - n) * sizeof(*rdptrs));
215 
216 	lnchildren += n;
217 	rnchildren -= n;
218 	nilfs_btree_node_set_nchildren(left, lnchildren);
219 	nilfs_btree_node_set_nchildren(right, rnchildren);
220 }
221 
222 /* Assume that the buffer heads corresponding to left and right are locked. */
223 static void nilfs_btree_node_move_right(struct nilfs_btree_node *left,
224 					struct nilfs_btree_node *right,
225 					int n, int lncmax, int rncmax)
226 {
227 	__le64 *ldkeys, *rdkeys;
228 	__le64 *ldptrs, *rdptrs;
229 	int lnchildren, rnchildren;
230 
231 	ldkeys = nilfs_btree_node_dkeys(left);
232 	ldptrs = nilfs_btree_node_dptrs(left, lncmax);
233 	lnchildren = nilfs_btree_node_get_nchildren(left);
234 
235 	rdkeys = nilfs_btree_node_dkeys(right);
236 	rdptrs = nilfs_btree_node_dptrs(right, rncmax);
237 	rnchildren = nilfs_btree_node_get_nchildren(right);
238 
239 	memmove(rdkeys + n, rdkeys, rnchildren * sizeof(*rdkeys));
240 	memmove(rdptrs + n, rdptrs, rnchildren * sizeof(*rdptrs));
241 	memcpy(rdkeys, ldkeys + lnchildren - n, n * sizeof(*rdkeys));
242 	memcpy(rdptrs, ldptrs + lnchildren - n, n * sizeof(*rdptrs));
243 
244 	lnchildren -= n;
245 	rnchildren += n;
246 	nilfs_btree_node_set_nchildren(left, lnchildren);
247 	nilfs_btree_node_set_nchildren(right, rnchildren);
248 }
249 
250 /* Assume that the buffer head corresponding to node is locked. */
251 static void nilfs_btree_node_insert(struct nilfs_btree_node *node, int index,
252 				    __u64 key, __u64 ptr, int ncmax)
253 {
254 	__le64 *dkeys;
255 	__le64 *dptrs;
256 	int nchildren;
257 
258 	dkeys = nilfs_btree_node_dkeys(node);
259 	dptrs = nilfs_btree_node_dptrs(node, ncmax);
260 	nchildren = nilfs_btree_node_get_nchildren(node);
261 	if (index < nchildren) {
262 		memmove(dkeys + index + 1, dkeys + index,
263 			(nchildren - index) * sizeof(*dkeys));
264 		memmove(dptrs + index + 1, dptrs + index,
265 			(nchildren - index) * sizeof(*dptrs));
266 	}
267 	dkeys[index] = cpu_to_le64(key);
268 	dptrs[index] = cpu_to_le64(ptr);
269 	nchildren++;
270 	nilfs_btree_node_set_nchildren(node, nchildren);
271 }
272 
273 /* Assume that the buffer head corresponding to node is locked. */
274 static void nilfs_btree_node_delete(struct nilfs_btree_node *node, int index,
275 				    __u64 *keyp, __u64 *ptrp, int ncmax)
276 {
277 	__u64 key;
278 	__u64 ptr;
279 	__le64 *dkeys;
280 	__le64 *dptrs;
281 	int nchildren;
282 
283 	dkeys = nilfs_btree_node_dkeys(node);
284 	dptrs = nilfs_btree_node_dptrs(node, ncmax);
285 	key = le64_to_cpu(dkeys[index]);
286 	ptr = le64_to_cpu(dptrs[index]);
287 	nchildren = nilfs_btree_node_get_nchildren(node);
288 	if (keyp != NULL)
289 		*keyp = key;
290 	if (ptrp != NULL)
291 		*ptrp = ptr;
292 
293 	if (index < nchildren - 1) {
294 		memmove(dkeys + index, dkeys + index + 1,
295 			(nchildren - index - 1) * sizeof(*dkeys));
296 		memmove(dptrs + index, dptrs + index + 1,
297 			(nchildren - index - 1) * sizeof(*dptrs));
298 	}
299 	nchildren--;
300 	nilfs_btree_node_set_nchildren(node, nchildren);
301 }
302 
303 static int nilfs_btree_node_lookup(const struct nilfs_btree_node *node,
304 				   __u64 key, int *indexp)
305 {
306 	__u64 nkey;
307 	int index, low, high, s;
308 
309 	/* binary search */
310 	low = 0;
311 	high = nilfs_btree_node_get_nchildren(node) - 1;
312 	index = 0;
313 	s = 0;
314 	while (low <= high) {
315 		index = (low + high) / 2;
316 		nkey = nilfs_btree_node_get_key(node, index);
317 		if (nkey == key) {
318 			s = 0;
319 			goto out;
320 		} else if (nkey < key) {
321 			low = index + 1;
322 			s = -1;
323 		} else {
324 			high = index - 1;
325 			s = 1;
326 		}
327 	}
328 
329 	/* adjust index */
330 	if (nilfs_btree_node_get_level(node) > NILFS_BTREE_LEVEL_NODE_MIN) {
331 		if (s > 0 && index > 0)
332 			index--;
333 	} else if (s < 0)
334 		index++;
335 
336  out:
337 	*indexp = index;
338 
339 	return s == 0;
340 }
341 
342 /**
343  * nilfs_btree_node_broken - verify consistency of btree node
344  * @node: btree node block to be examined
345  * @size: node size (in bytes)
346  * @blocknr: block number
347  *
348  * Return Value: If node is broken, 1 is returned. Otherwise, 0 is returned.
349  */
350 static int nilfs_btree_node_broken(const struct nilfs_btree_node *node,
351 				   size_t size, sector_t blocknr)
352 {
353 	int level, flags, nchildren;
354 	int ret = 0;
355 
356 	level = nilfs_btree_node_get_level(node);
357 	flags = nilfs_btree_node_get_flags(node);
358 	nchildren = nilfs_btree_node_get_nchildren(node);
359 
360 	if (unlikely(level < NILFS_BTREE_LEVEL_NODE_MIN ||
361 		     level >= NILFS_BTREE_LEVEL_MAX ||
362 		     (flags & NILFS_BTREE_NODE_ROOT) ||
363 		     nchildren < 0 ||
364 		     nchildren > NILFS_BTREE_NODE_NCHILDREN_MAX(size))) {
365 		printk(KERN_CRIT "NILFS: bad btree node (blocknr=%llu): "
366 		       "level = %d, flags = 0x%x, nchildren = %d\n",
367 		       (unsigned long long)blocknr, level, flags, nchildren);
368 		ret = 1;
369 	}
370 	return ret;
371 }
372 
373 /**
374  * nilfs_btree_root_broken - verify consistency of btree root node
375  * @node: btree root node to be examined
376  * @ino: inode number
377  *
378  * Return Value: If node is broken, 1 is returned. Otherwise, 0 is returned.
379  */
380 static int nilfs_btree_root_broken(const struct nilfs_btree_node *node,
381 				   unsigned long ino)
382 {
383 	int level, flags, nchildren;
384 	int ret = 0;
385 
386 	level = nilfs_btree_node_get_level(node);
387 	flags = nilfs_btree_node_get_flags(node);
388 	nchildren = nilfs_btree_node_get_nchildren(node);
389 
390 	if (unlikely(level < NILFS_BTREE_LEVEL_NODE_MIN ||
391 		     level >= NILFS_BTREE_LEVEL_MAX ||
392 		     nchildren < 0 ||
393 		     nchildren > NILFS_BTREE_ROOT_NCHILDREN_MAX)) {
394 		pr_crit("NILFS: bad btree root (inode number=%lu): level = %d, flags = 0x%x, nchildren = %d\n",
395 			ino, level, flags, nchildren);
396 		ret = 1;
397 	}
398 	return ret;
399 }
400 
401 int nilfs_btree_broken_node_block(struct buffer_head *bh)
402 {
403 	int ret;
404 
405 	if (buffer_nilfs_checked(bh))
406 		return 0;
407 
408 	ret = nilfs_btree_node_broken((struct nilfs_btree_node *)bh->b_data,
409 				       bh->b_size, bh->b_blocknr);
410 	if (likely(!ret))
411 		set_buffer_nilfs_checked(bh);
412 	return ret;
413 }
414 
415 static struct nilfs_btree_node *
416 nilfs_btree_get_root(const struct nilfs_bmap *btree)
417 {
418 	return (struct nilfs_btree_node *)btree->b_u.u_data;
419 }
420 
421 static struct nilfs_btree_node *
422 nilfs_btree_get_nonroot_node(const struct nilfs_btree_path *path, int level)
423 {
424 	return (struct nilfs_btree_node *)path[level].bp_bh->b_data;
425 }
426 
427 static struct nilfs_btree_node *
428 nilfs_btree_get_sib_node(const struct nilfs_btree_path *path, int level)
429 {
430 	return (struct nilfs_btree_node *)path[level].bp_sib_bh->b_data;
431 }
432 
433 static int nilfs_btree_height(const struct nilfs_bmap *btree)
434 {
435 	return nilfs_btree_node_get_level(nilfs_btree_get_root(btree)) + 1;
436 }
437 
438 static struct nilfs_btree_node *
439 nilfs_btree_get_node(const struct nilfs_bmap *btree,
440 		     const struct nilfs_btree_path *path,
441 		     int level, int *ncmaxp)
442 {
443 	struct nilfs_btree_node *node;
444 
445 	if (level == nilfs_btree_height(btree) - 1) {
446 		node = nilfs_btree_get_root(btree);
447 		*ncmaxp = NILFS_BTREE_ROOT_NCHILDREN_MAX;
448 	} else {
449 		node = nilfs_btree_get_nonroot_node(path, level);
450 		*ncmaxp = nilfs_btree_nchildren_per_block(btree);
451 	}
452 	return node;
453 }
454 
455 static int
456 nilfs_btree_bad_node(struct nilfs_btree_node *node, int level)
457 {
458 	if (unlikely(nilfs_btree_node_get_level(node) != level)) {
459 		dump_stack();
460 		printk(KERN_CRIT "NILFS: btree level mismatch: %d != %d\n",
461 		       nilfs_btree_node_get_level(node), level);
462 		return 1;
463 	}
464 	return 0;
465 }
466 
467 struct nilfs_btree_readahead_info {
468 	struct nilfs_btree_node *node;	/* parent node */
469 	int max_ra_blocks;		/* max nof blocks to read ahead */
470 	int index;			/* current index on the parent node */
471 	int ncmax;			/* nof children in the parent node */
472 };
473 
474 static int __nilfs_btree_get_block(const struct nilfs_bmap *btree, __u64 ptr,
475 				   struct buffer_head **bhp,
476 				   const struct nilfs_btree_readahead_info *ra)
477 {
478 	struct address_space *btnc = &NILFS_BMAP_I(btree)->i_btnode_cache;
479 	struct buffer_head *bh, *ra_bh;
480 	sector_t submit_ptr = 0;
481 	int ret;
482 
483 	ret = nilfs_btnode_submit_block(btnc, ptr, 0, READ, &bh, &submit_ptr);
484 	if (ret) {
485 		if (ret != -EEXIST)
486 			return ret;
487 		goto out_check;
488 	}
489 
490 	if (ra) {
491 		int i, n;
492 		__u64 ptr2;
493 
494 		/* read ahead sibling nodes */
495 		for (n = ra->max_ra_blocks, i = ra->index + 1;
496 		     n > 0 && i < ra->ncmax; n--, i++) {
497 			ptr2 = nilfs_btree_node_get_ptr(ra->node, i, ra->ncmax);
498 
499 			ret = nilfs_btnode_submit_block(btnc, ptr2, 0, READA,
500 							&ra_bh, &submit_ptr);
501 			if (likely(!ret || ret == -EEXIST))
502 				brelse(ra_bh);
503 			else if (ret != -EBUSY)
504 				break;
505 			if (!buffer_locked(bh))
506 				goto out_no_wait;
507 		}
508 	}
509 
510 	wait_on_buffer(bh);
511 
512  out_no_wait:
513 	if (!buffer_uptodate(bh)) {
514 		brelse(bh);
515 		return -EIO;
516 	}
517 
518  out_check:
519 	if (nilfs_btree_broken_node_block(bh)) {
520 		clear_buffer_uptodate(bh);
521 		brelse(bh);
522 		return -EINVAL;
523 	}
524 
525 	*bhp = bh;
526 	return 0;
527 }
528 
529 static int nilfs_btree_get_block(const struct nilfs_bmap *btree, __u64 ptr,
530 				   struct buffer_head **bhp)
531 {
532 	return __nilfs_btree_get_block(btree, ptr, bhp, NULL);
533 }
534 
535 static int nilfs_btree_do_lookup(const struct nilfs_bmap *btree,
536 				 struct nilfs_btree_path *path,
537 				 __u64 key, __u64 *ptrp, int minlevel,
538 				 int readahead)
539 {
540 	struct nilfs_btree_node *node;
541 	struct nilfs_btree_readahead_info p, *ra;
542 	__u64 ptr;
543 	int level, index, found, ncmax, ret;
544 
545 	node = nilfs_btree_get_root(btree);
546 	level = nilfs_btree_node_get_level(node);
547 	if (level < minlevel || nilfs_btree_node_get_nchildren(node) <= 0)
548 		return -ENOENT;
549 
550 	found = nilfs_btree_node_lookup(node, key, &index);
551 	ptr = nilfs_btree_node_get_ptr(node, index,
552 				       NILFS_BTREE_ROOT_NCHILDREN_MAX);
553 	path[level].bp_bh = NULL;
554 	path[level].bp_index = index;
555 
556 	ncmax = nilfs_btree_nchildren_per_block(btree);
557 
558 	while (--level >= minlevel) {
559 		ra = NULL;
560 		if (level == NILFS_BTREE_LEVEL_NODE_MIN && readahead) {
561 			p.node = nilfs_btree_get_node(btree, path, level + 1,
562 						      &p.ncmax);
563 			p.index = index;
564 			p.max_ra_blocks = 7;
565 			ra = &p;
566 		}
567 		ret = __nilfs_btree_get_block(btree, ptr, &path[level].bp_bh,
568 					      ra);
569 		if (ret < 0)
570 			return ret;
571 
572 		node = nilfs_btree_get_nonroot_node(path, level);
573 		if (nilfs_btree_bad_node(node, level))
574 			return -EINVAL;
575 		if (!found)
576 			found = nilfs_btree_node_lookup(node, key, &index);
577 		else
578 			index = 0;
579 		if (index < ncmax) {
580 			ptr = nilfs_btree_node_get_ptr(node, index, ncmax);
581 		} else {
582 			WARN_ON(found || level != NILFS_BTREE_LEVEL_NODE_MIN);
583 			/* insert */
584 			ptr = NILFS_BMAP_INVALID_PTR;
585 		}
586 		path[level].bp_index = index;
587 	}
588 	if (!found)
589 		return -ENOENT;
590 
591 	if (ptrp != NULL)
592 		*ptrp = ptr;
593 
594 	return 0;
595 }
596 
597 static int nilfs_btree_do_lookup_last(const struct nilfs_bmap *btree,
598 				      struct nilfs_btree_path *path,
599 				      __u64 *keyp, __u64 *ptrp)
600 {
601 	struct nilfs_btree_node *node;
602 	__u64 ptr;
603 	int index, level, ncmax, ret;
604 
605 	node = nilfs_btree_get_root(btree);
606 	index = nilfs_btree_node_get_nchildren(node) - 1;
607 	if (index < 0)
608 		return -ENOENT;
609 	level = nilfs_btree_node_get_level(node);
610 	ptr = nilfs_btree_node_get_ptr(node, index,
611 				       NILFS_BTREE_ROOT_NCHILDREN_MAX);
612 	path[level].bp_bh = NULL;
613 	path[level].bp_index = index;
614 	ncmax = nilfs_btree_nchildren_per_block(btree);
615 
616 	for (level--; level > 0; level--) {
617 		ret = nilfs_btree_get_block(btree, ptr, &path[level].bp_bh);
618 		if (ret < 0)
619 			return ret;
620 		node = nilfs_btree_get_nonroot_node(path, level);
621 		if (nilfs_btree_bad_node(node, level))
622 			return -EINVAL;
623 		index = nilfs_btree_node_get_nchildren(node) - 1;
624 		ptr = nilfs_btree_node_get_ptr(node, index, ncmax);
625 		path[level].bp_index = index;
626 	}
627 
628 	if (keyp != NULL)
629 		*keyp = nilfs_btree_node_get_key(node, index);
630 	if (ptrp != NULL)
631 		*ptrp = ptr;
632 
633 	return 0;
634 }
635 
636 /**
637  * nilfs_btree_get_next_key - get next valid key from btree path array
638  * @btree: bmap struct of btree
639  * @path: array of nilfs_btree_path struct
640  * @minlevel: start level
641  * @nextkey: place to store the next valid key
642  *
643  * Return Value: If a next key was found, 0 is returned. Otherwise,
644  * -ENOENT is returned.
645  */
646 static int nilfs_btree_get_next_key(const struct nilfs_bmap *btree,
647 				    const struct nilfs_btree_path *path,
648 				    int minlevel, __u64 *nextkey)
649 {
650 	struct nilfs_btree_node *node;
651 	int maxlevel = nilfs_btree_height(btree) - 1;
652 	int index, next_adj, level;
653 
654 	/* Next index is already set to bp_index for leaf nodes. */
655 	next_adj = 0;
656 	for (level = minlevel; level <= maxlevel; level++) {
657 		if (level == maxlevel)
658 			node = nilfs_btree_get_root(btree);
659 		else
660 			node = nilfs_btree_get_nonroot_node(path, level);
661 
662 		index = path[level].bp_index + next_adj;
663 		if (index < nilfs_btree_node_get_nchildren(node)) {
664 			/* Next key is in this node */
665 			*nextkey = nilfs_btree_node_get_key(node, index);
666 			return 0;
667 		}
668 		/* For non-leaf nodes, next index is stored at bp_index + 1. */
669 		next_adj = 1;
670 	}
671 	return -ENOENT;
672 }
673 
674 static int nilfs_btree_lookup(const struct nilfs_bmap *btree,
675 			      __u64 key, int level, __u64 *ptrp)
676 {
677 	struct nilfs_btree_path *path;
678 	int ret;
679 
680 	path = nilfs_btree_alloc_path();
681 	if (path == NULL)
682 		return -ENOMEM;
683 
684 	ret = nilfs_btree_do_lookup(btree, path, key, ptrp, level, 0);
685 
686 	nilfs_btree_free_path(path);
687 
688 	return ret;
689 }
690 
691 static int nilfs_btree_lookup_contig(const struct nilfs_bmap *btree,
692 				     __u64 key, __u64 *ptrp, unsigned maxblocks)
693 {
694 	struct nilfs_btree_path *path;
695 	struct nilfs_btree_node *node;
696 	struct inode *dat = NULL;
697 	__u64 ptr, ptr2;
698 	sector_t blocknr;
699 	int level = NILFS_BTREE_LEVEL_NODE_MIN;
700 	int ret, cnt, index, maxlevel, ncmax;
701 	struct nilfs_btree_readahead_info p;
702 
703 	path = nilfs_btree_alloc_path();
704 	if (path == NULL)
705 		return -ENOMEM;
706 
707 	ret = nilfs_btree_do_lookup(btree, path, key, &ptr, level, 1);
708 	if (ret < 0)
709 		goto out;
710 
711 	if (NILFS_BMAP_USE_VBN(btree)) {
712 		dat = nilfs_bmap_get_dat(btree);
713 		ret = nilfs_dat_translate(dat, ptr, &blocknr);
714 		if (ret < 0)
715 			goto out;
716 		ptr = blocknr;
717 	}
718 	cnt = 1;
719 	if (cnt == maxblocks)
720 		goto end;
721 
722 	maxlevel = nilfs_btree_height(btree) - 1;
723 	node = nilfs_btree_get_node(btree, path, level, &ncmax);
724 	index = path[level].bp_index + 1;
725 	for (;;) {
726 		while (index < nilfs_btree_node_get_nchildren(node)) {
727 			if (nilfs_btree_node_get_key(node, index) !=
728 			    key + cnt)
729 				goto end;
730 			ptr2 = nilfs_btree_node_get_ptr(node, index, ncmax);
731 			if (dat) {
732 				ret = nilfs_dat_translate(dat, ptr2, &blocknr);
733 				if (ret < 0)
734 					goto out;
735 				ptr2 = blocknr;
736 			}
737 			if (ptr2 != ptr + cnt || ++cnt == maxblocks)
738 				goto end;
739 			index++;
740 			continue;
741 		}
742 		if (level == maxlevel)
743 			break;
744 
745 		/* look-up right sibling node */
746 		p.node = nilfs_btree_get_node(btree, path, level + 1, &p.ncmax);
747 		p.index = path[level + 1].bp_index + 1;
748 		p.max_ra_blocks = 7;
749 		if (p.index >= nilfs_btree_node_get_nchildren(p.node) ||
750 		    nilfs_btree_node_get_key(p.node, p.index) != key + cnt)
751 			break;
752 		ptr2 = nilfs_btree_node_get_ptr(p.node, p.index, p.ncmax);
753 		path[level + 1].bp_index = p.index;
754 
755 		brelse(path[level].bp_bh);
756 		path[level].bp_bh = NULL;
757 
758 		ret = __nilfs_btree_get_block(btree, ptr2, &path[level].bp_bh,
759 					      &p);
760 		if (ret < 0)
761 			goto out;
762 		node = nilfs_btree_get_nonroot_node(path, level);
763 		ncmax = nilfs_btree_nchildren_per_block(btree);
764 		index = 0;
765 		path[level].bp_index = index;
766 	}
767  end:
768 	*ptrp = ptr;
769 	ret = cnt;
770  out:
771 	nilfs_btree_free_path(path);
772 	return ret;
773 }
774 
775 static void nilfs_btree_promote_key(struct nilfs_bmap *btree,
776 				    struct nilfs_btree_path *path,
777 				    int level, __u64 key)
778 {
779 	if (level < nilfs_btree_height(btree) - 1) {
780 		do {
781 			nilfs_btree_node_set_key(
782 				nilfs_btree_get_nonroot_node(path, level),
783 				path[level].bp_index, key);
784 			if (!buffer_dirty(path[level].bp_bh))
785 				mark_buffer_dirty(path[level].bp_bh);
786 		} while ((path[level].bp_index == 0) &&
787 			 (++level < nilfs_btree_height(btree) - 1));
788 	}
789 
790 	/* root */
791 	if (level == nilfs_btree_height(btree) - 1) {
792 		nilfs_btree_node_set_key(nilfs_btree_get_root(btree),
793 					 path[level].bp_index, key);
794 	}
795 }
796 
797 static void nilfs_btree_do_insert(struct nilfs_bmap *btree,
798 				  struct nilfs_btree_path *path,
799 				  int level, __u64 *keyp, __u64 *ptrp)
800 {
801 	struct nilfs_btree_node *node;
802 	int ncblk;
803 
804 	if (level < nilfs_btree_height(btree) - 1) {
805 		node = nilfs_btree_get_nonroot_node(path, level);
806 		ncblk = nilfs_btree_nchildren_per_block(btree);
807 		nilfs_btree_node_insert(node, path[level].bp_index,
808 					*keyp, *ptrp, ncblk);
809 		if (!buffer_dirty(path[level].bp_bh))
810 			mark_buffer_dirty(path[level].bp_bh);
811 
812 		if (path[level].bp_index == 0)
813 			nilfs_btree_promote_key(btree, path, level + 1,
814 						nilfs_btree_node_get_key(node,
815 									 0));
816 	} else {
817 		node = nilfs_btree_get_root(btree);
818 		nilfs_btree_node_insert(node, path[level].bp_index,
819 					*keyp, *ptrp,
820 					NILFS_BTREE_ROOT_NCHILDREN_MAX);
821 	}
822 }
823 
824 static void nilfs_btree_carry_left(struct nilfs_bmap *btree,
825 				   struct nilfs_btree_path *path,
826 				   int level, __u64 *keyp, __u64 *ptrp)
827 {
828 	struct nilfs_btree_node *node, *left;
829 	int nchildren, lnchildren, n, move, ncblk;
830 
831 	node = nilfs_btree_get_nonroot_node(path, level);
832 	left = nilfs_btree_get_sib_node(path, level);
833 	nchildren = nilfs_btree_node_get_nchildren(node);
834 	lnchildren = nilfs_btree_node_get_nchildren(left);
835 	ncblk = nilfs_btree_nchildren_per_block(btree);
836 	move = 0;
837 
838 	n = (nchildren + lnchildren + 1) / 2 - lnchildren;
839 	if (n > path[level].bp_index) {
840 		/* move insert point */
841 		n--;
842 		move = 1;
843 	}
844 
845 	nilfs_btree_node_move_left(left, node, n, ncblk, ncblk);
846 
847 	if (!buffer_dirty(path[level].bp_bh))
848 		mark_buffer_dirty(path[level].bp_bh);
849 	if (!buffer_dirty(path[level].bp_sib_bh))
850 		mark_buffer_dirty(path[level].bp_sib_bh);
851 
852 	nilfs_btree_promote_key(btree, path, level + 1,
853 				nilfs_btree_node_get_key(node, 0));
854 
855 	if (move) {
856 		brelse(path[level].bp_bh);
857 		path[level].bp_bh = path[level].bp_sib_bh;
858 		path[level].bp_sib_bh = NULL;
859 		path[level].bp_index += lnchildren;
860 		path[level + 1].bp_index--;
861 	} else {
862 		brelse(path[level].bp_sib_bh);
863 		path[level].bp_sib_bh = NULL;
864 		path[level].bp_index -= n;
865 	}
866 
867 	nilfs_btree_do_insert(btree, path, level, keyp, ptrp);
868 }
869 
870 static void nilfs_btree_carry_right(struct nilfs_bmap *btree,
871 				    struct nilfs_btree_path *path,
872 				    int level, __u64 *keyp, __u64 *ptrp)
873 {
874 	struct nilfs_btree_node *node, *right;
875 	int nchildren, rnchildren, n, move, ncblk;
876 
877 	node = nilfs_btree_get_nonroot_node(path, level);
878 	right = nilfs_btree_get_sib_node(path, level);
879 	nchildren = nilfs_btree_node_get_nchildren(node);
880 	rnchildren = nilfs_btree_node_get_nchildren(right);
881 	ncblk = nilfs_btree_nchildren_per_block(btree);
882 	move = 0;
883 
884 	n = (nchildren + rnchildren + 1) / 2 - rnchildren;
885 	if (n > nchildren - path[level].bp_index) {
886 		/* move insert point */
887 		n--;
888 		move = 1;
889 	}
890 
891 	nilfs_btree_node_move_right(node, right, n, ncblk, ncblk);
892 
893 	if (!buffer_dirty(path[level].bp_bh))
894 		mark_buffer_dirty(path[level].bp_bh);
895 	if (!buffer_dirty(path[level].bp_sib_bh))
896 		mark_buffer_dirty(path[level].bp_sib_bh);
897 
898 	path[level + 1].bp_index++;
899 	nilfs_btree_promote_key(btree, path, level + 1,
900 				nilfs_btree_node_get_key(right, 0));
901 	path[level + 1].bp_index--;
902 
903 	if (move) {
904 		brelse(path[level].bp_bh);
905 		path[level].bp_bh = path[level].bp_sib_bh;
906 		path[level].bp_sib_bh = NULL;
907 		path[level].bp_index -= nilfs_btree_node_get_nchildren(node);
908 		path[level + 1].bp_index++;
909 	} else {
910 		brelse(path[level].bp_sib_bh);
911 		path[level].bp_sib_bh = NULL;
912 	}
913 
914 	nilfs_btree_do_insert(btree, path, level, keyp, ptrp);
915 }
916 
917 static void nilfs_btree_split(struct nilfs_bmap *btree,
918 			      struct nilfs_btree_path *path,
919 			      int level, __u64 *keyp, __u64 *ptrp)
920 {
921 	struct nilfs_btree_node *node, *right;
922 	__u64 newkey;
923 	__u64 newptr;
924 	int nchildren, n, move, ncblk;
925 
926 	node = nilfs_btree_get_nonroot_node(path, level);
927 	right = nilfs_btree_get_sib_node(path, level);
928 	nchildren = nilfs_btree_node_get_nchildren(node);
929 	ncblk = nilfs_btree_nchildren_per_block(btree);
930 	move = 0;
931 
932 	n = (nchildren + 1) / 2;
933 	if (n > nchildren - path[level].bp_index) {
934 		n--;
935 		move = 1;
936 	}
937 
938 	nilfs_btree_node_move_right(node, right, n, ncblk, ncblk);
939 
940 	if (!buffer_dirty(path[level].bp_bh))
941 		mark_buffer_dirty(path[level].bp_bh);
942 	if (!buffer_dirty(path[level].bp_sib_bh))
943 		mark_buffer_dirty(path[level].bp_sib_bh);
944 
945 	newkey = nilfs_btree_node_get_key(right, 0);
946 	newptr = path[level].bp_newreq.bpr_ptr;
947 
948 	if (move) {
949 		path[level].bp_index -= nilfs_btree_node_get_nchildren(node);
950 		nilfs_btree_node_insert(right, path[level].bp_index,
951 					*keyp, *ptrp, ncblk);
952 
953 		*keyp = nilfs_btree_node_get_key(right, 0);
954 		*ptrp = path[level].bp_newreq.bpr_ptr;
955 
956 		brelse(path[level].bp_bh);
957 		path[level].bp_bh = path[level].bp_sib_bh;
958 		path[level].bp_sib_bh = NULL;
959 	} else {
960 		nilfs_btree_do_insert(btree, path, level, keyp, ptrp);
961 
962 		*keyp = nilfs_btree_node_get_key(right, 0);
963 		*ptrp = path[level].bp_newreq.bpr_ptr;
964 
965 		brelse(path[level].bp_sib_bh);
966 		path[level].bp_sib_bh = NULL;
967 	}
968 
969 	path[level + 1].bp_index++;
970 }
971 
972 static void nilfs_btree_grow(struct nilfs_bmap *btree,
973 			     struct nilfs_btree_path *path,
974 			     int level, __u64 *keyp, __u64 *ptrp)
975 {
976 	struct nilfs_btree_node *root, *child;
977 	int n, ncblk;
978 
979 	root = nilfs_btree_get_root(btree);
980 	child = nilfs_btree_get_sib_node(path, level);
981 	ncblk = nilfs_btree_nchildren_per_block(btree);
982 
983 	n = nilfs_btree_node_get_nchildren(root);
984 
985 	nilfs_btree_node_move_right(root, child, n,
986 				    NILFS_BTREE_ROOT_NCHILDREN_MAX, ncblk);
987 	nilfs_btree_node_set_level(root, level + 1);
988 
989 	if (!buffer_dirty(path[level].bp_sib_bh))
990 		mark_buffer_dirty(path[level].bp_sib_bh);
991 
992 	path[level].bp_bh = path[level].bp_sib_bh;
993 	path[level].bp_sib_bh = NULL;
994 
995 	nilfs_btree_do_insert(btree, path, level, keyp, ptrp);
996 
997 	*keyp = nilfs_btree_node_get_key(child, 0);
998 	*ptrp = path[level].bp_newreq.bpr_ptr;
999 }
1000 
1001 static __u64 nilfs_btree_find_near(const struct nilfs_bmap *btree,
1002 				   const struct nilfs_btree_path *path)
1003 {
1004 	struct nilfs_btree_node *node;
1005 	int level, ncmax;
1006 
1007 	if (path == NULL)
1008 		return NILFS_BMAP_INVALID_PTR;
1009 
1010 	/* left sibling */
1011 	level = NILFS_BTREE_LEVEL_NODE_MIN;
1012 	if (path[level].bp_index > 0) {
1013 		node = nilfs_btree_get_node(btree, path, level, &ncmax);
1014 		return nilfs_btree_node_get_ptr(node,
1015 						path[level].bp_index - 1,
1016 						ncmax);
1017 	}
1018 
1019 	/* parent */
1020 	level = NILFS_BTREE_LEVEL_NODE_MIN + 1;
1021 	if (level <= nilfs_btree_height(btree) - 1) {
1022 		node = nilfs_btree_get_node(btree, path, level, &ncmax);
1023 		return nilfs_btree_node_get_ptr(node, path[level].bp_index,
1024 						ncmax);
1025 	}
1026 
1027 	return NILFS_BMAP_INVALID_PTR;
1028 }
1029 
1030 static __u64 nilfs_btree_find_target_v(const struct nilfs_bmap *btree,
1031 				       const struct nilfs_btree_path *path,
1032 				       __u64 key)
1033 {
1034 	__u64 ptr;
1035 
1036 	ptr = nilfs_bmap_find_target_seq(btree, key);
1037 	if (ptr != NILFS_BMAP_INVALID_PTR)
1038 		/* sequential access */
1039 		return ptr;
1040 	else {
1041 		ptr = nilfs_btree_find_near(btree, path);
1042 		if (ptr != NILFS_BMAP_INVALID_PTR)
1043 			/* near */
1044 			return ptr;
1045 	}
1046 	/* block group */
1047 	return nilfs_bmap_find_target_in_group(btree);
1048 }
1049 
1050 static int nilfs_btree_prepare_insert(struct nilfs_bmap *btree,
1051 				      struct nilfs_btree_path *path,
1052 				      int *levelp, __u64 key, __u64 ptr,
1053 				      struct nilfs_bmap_stats *stats)
1054 {
1055 	struct buffer_head *bh;
1056 	struct nilfs_btree_node *node, *parent, *sib;
1057 	__u64 sibptr;
1058 	int pindex, level, ncmax, ncblk, ret;
1059 	struct inode *dat = NULL;
1060 
1061 	stats->bs_nblocks = 0;
1062 	level = NILFS_BTREE_LEVEL_DATA;
1063 
1064 	/* allocate a new ptr for data block */
1065 	if (NILFS_BMAP_USE_VBN(btree)) {
1066 		path[level].bp_newreq.bpr_ptr =
1067 			nilfs_btree_find_target_v(btree, path, key);
1068 		dat = nilfs_bmap_get_dat(btree);
1069 	}
1070 
1071 	ret = nilfs_bmap_prepare_alloc_ptr(btree, &path[level].bp_newreq, dat);
1072 	if (ret < 0)
1073 		goto err_out_data;
1074 
1075 	ncblk = nilfs_btree_nchildren_per_block(btree);
1076 
1077 	for (level = NILFS_BTREE_LEVEL_NODE_MIN;
1078 	     level < nilfs_btree_height(btree) - 1;
1079 	     level++) {
1080 		node = nilfs_btree_get_nonroot_node(path, level);
1081 		if (nilfs_btree_node_get_nchildren(node) < ncblk) {
1082 			path[level].bp_op = nilfs_btree_do_insert;
1083 			stats->bs_nblocks++;
1084 			goto out;
1085 		}
1086 
1087 		parent = nilfs_btree_get_node(btree, path, level + 1, &ncmax);
1088 		pindex = path[level + 1].bp_index;
1089 
1090 		/* left sibling */
1091 		if (pindex > 0) {
1092 			sibptr = nilfs_btree_node_get_ptr(parent, pindex - 1,
1093 							  ncmax);
1094 			ret = nilfs_btree_get_block(btree, sibptr, &bh);
1095 			if (ret < 0)
1096 				goto err_out_child_node;
1097 			sib = (struct nilfs_btree_node *)bh->b_data;
1098 			if (nilfs_btree_node_get_nchildren(sib) < ncblk) {
1099 				path[level].bp_sib_bh = bh;
1100 				path[level].bp_op = nilfs_btree_carry_left;
1101 				stats->bs_nblocks++;
1102 				goto out;
1103 			} else {
1104 				brelse(bh);
1105 			}
1106 		}
1107 
1108 		/* right sibling */
1109 		if (pindex < nilfs_btree_node_get_nchildren(parent) - 1) {
1110 			sibptr = nilfs_btree_node_get_ptr(parent, pindex + 1,
1111 							  ncmax);
1112 			ret = nilfs_btree_get_block(btree, sibptr, &bh);
1113 			if (ret < 0)
1114 				goto err_out_child_node;
1115 			sib = (struct nilfs_btree_node *)bh->b_data;
1116 			if (nilfs_btree_node_get_nchildren(sib) < ncblk) {
1117 				path[level].bp_sib_bh = bh;
1118 				path[level].bp_op = nilfs_btree_carry_right;
1119 				stats->bs_nblocks++;
1120 				goto out;
1121 			} else {
1122 				brelse(bh);
1123 			}
1124 		}
1125 
1126 		/* split */
1127 		path[level].bp_newreq.bpr_ptr =
1128 			path[level - 1].bp_newreq.bpr_ptr + 1;
1129 		ret = nilfs_bmap_prepare_alloc_ptr(btree,
1130 						   &path[level].bp_newreq, dat);
1131 		if (ret < 0)
1132 			goto err_out_child_node;
1133 		ret = nilfs_btree_get_new_block(btree,
1134 						path[level].bp_newreq.bpr_ptr,
1135 						&bh);
1136 		if (ret < 0)
1137 			goto err_out_curr_node;
1138 
1139 		stats->bs_nblocks++;
1140 
1141 		sib = (struct nilfs_btree_node *)bh->b_data;
1142 		nilfs_btree_node_init(sib, 0, level, 0, ncblk, NULL, NULL);
1143 		path[level].bp_sib_bh = bh;
1144 		path[level].bp_op = nilfs_btree_split;
1145 	}
1146 
1147 	/* root */
1148 	node = nilfs_btree_get_root(btree);
1149 	if (nilfs_btree_node_get_nchildren(node) <
1150 	    NILFS_BTREE_ROOT_NCHILDREN_MAX) {
1151 		path[level].bp_op = nilfs_btree_do_insert;
1152 		stats->bs_nblocks++;
1153 		goto out;
1154 	}
1155 
1156 	/* grow */
1157 	path[level].bp_newreq.bpr_ptr = path[level - 1].bp_newreq.bpr_ptr + 1;
1158 	ret = nilfs_bmap_prepare_alloc_ptr(btree, &path[level].bp_newreq, dat);
1159 	if (ret < 0)
1160 		goto err_out_child_node;
1161 	ret = nilfs_btree_get_new_block(btree, path[level].bp_newreq.bpr_ptr,
1162 					&bh);
1163 	if (ret < 0)
1164 		goto err_out_curr_node;
1165 
1166 	nilfs_btree_node_init((struct nilfs_btree_node *)bh->b_data,
1167 			      0, level, 0, ncblk, NULL, NULL);
1168 	path[level].bp_sib_bh = bh;
1169 	path[level].bp_op = nilfs_btree_grow;
1170 
1171 	level++;
1172 	path[level].bp_op = nilfs_btree_do_insert;
1173 
1174 	/* a newly-created node block and a data block are added */
1175 	stats->bs_nblocks += 2;
1176 
1177 	/* success */
1178  out:
1179 	*levelp = level;
1180 	return ret;
1181 
1182 	/* error */
1183  err_out_curr_node:
1184 	nilfs_bmap_abort_alloc_ptr(btree, &path[level].bp_newreq, dat);
1185  err_out_child_node:
1186 	for (level--; level > NILFS_BTREE_LEVEL_DATA; level--) {
1187 		nilfs_btnode_delete(path[level].bp_sib_bh);
1188 		nilfs_bmap_abort_alloc_ptr(btree, &path[level].bp_newreq, dat);
1189 
1190 	}
1191 
1192 	nilfs_bmap_abort_alloc_ptr(btree, &path[level].bp_newreq, dat);
1193  err_out_data:
1194 	*levelp = level;
1195 	stats->bs_nblocks = 0;
1196 	return ret;
1197 }
1198 
1199 static void nilfs_btree_commit_insert(struct nilfs_bmap *btree,
1200 				      struct nilfs_btree_path *path,
1201 				      int maxlevel, __u64 key, __u64 ptr)
1202 {
1203 	struct inode *dat = NULL;
1204 	int level;
1205 
1206 	set_buffer_nilfs_volatile((struct buffer_head *)((unsigned long)ptr));
1207 	ptr = path[NILFS_BTREE_LEVEL_DATA].bp_newreq.bpr_ptr;
1208 	if (NILFS_BMAP_USE_VBN(btree)) {
1209 		nilfs_bmap_set_target_v(btree, key, ptr);
1210 		dat = nilfs_bmap_get_dat(btree);
1211 	}
1212 
1213 	for (level = NILFS_BTREE_LEVEL_NODE_MIN; level <= maxlevel; level++) {
1214 		nilfs_bmap_commit_alloc_ptr(btree,
1215 					    &path[level - 1].bp_newreq, dat);
1216 		path[level].bp_op(btree, path, level, &key, &ptr);
1217 	}
1218 
1219 	if (!nilfs_bmap_dirty(btree))
1220 		nilfs_bmap_set_dirty(btree);
1221 }
1222 
1223 static int nilfs_btree_insert(struct nilfs_bmap *btree, __u64 key, __u64 ptr)
1224 {
1225 	struct nilfs_btree_path *path;
1226 	struct nilfs_bmap_stats stats;
1227 	int level, ret;
1228 
1229 	path = nilfs_btree_alloc_path();
1230 	if (path == NULL)
1231 		return -ENOMEM;
1232 
1233 	ret = nilfs_btree_do_lookup(btree, path, key, NULL,
1234 				    NILFS_BTREE_LEVEL_NODE_MIN, 0);
1235 	if (ret != -ENOENT) {
1236 		if (ret == 0)
1237 			ret = -EEXIST;
1238 		goto out;
1239 	}
1240 
1241 	ret = nilfs_btree_prepare_insert(btree, path, &level, key, ptr, &stats);
1242 	if (ret < 0)
1243 		goto out;
1244 	nilfs_btree_commit_insert(btree, path, level, key, ptr);
1245 	nilfs_inode_add_blocks(btree->b_inode, stats.bs_nblocks);
1246 
1247  out:
1248 	nilfs_btree_free_path(path);
1249 	return ret;
1250 }
1251 
1252 static void nilfs_btree_do_delete(struct nilfs_bmap *btree,
1253 				  struct nilfs_btree_path *path,
1254 				  int level, __u64 *keyp, __u64 *ptrp)
1255 {
1256 	struct nilfs_btree_node *node;
1257 	int ncblk;
1258 
1259 	if (level < nilfs_btree_height(btree) - 1) {
1260 		node = nilfs_btree_get_nonroot_node(path, level);
1261 		ncblk = nilfs_btree_nchildren_per_block(btree);
1262 		nilfs_btree_node_delete(node, path[level].bp_index,
1263 					keyp, ptrp, ncblk);
1264 		if (!buffer_dirty(path[level].bp_bh))
1265 			mark_buffer_dirty(path[level].bp_bh);
1266 		if (path[level].bp_index == 0)
1267 			nilfs_btree_promote_key(btree, path, level + 1,
1268 				nilfs_btree_node_get_key(node, 0));
1269 	} else {
1270 		node = nilfs_btree_get_root(btree);
1271 		nilfs_btree_node_delete(node, path[level].bp_index,
1272 					keyp, ptrp,
1273 					NILFS_BTREE_ROOT_NCHILDREN_MAX);
1274 	}
1275 }
1276 
1277 static void nilfs_btree_borrow_left(struct nilfs_bmap *btree,
1278 				    struct nilfs_btree_path *path,
1279 				    int level, __u64 *keyp, __u64 *ptrp)
1280 {
1281 	struct nilfs_btree_node *node, *left;
1282 	int nchildren, lnchildren, n, ncblk;
1283 
1284 	nilfs_btree_do_delete(btree, path, level, keyp, ptrp);
1285 
1286 	node = nilfs_btree_get_nonroot_node(path, level);
1287 	left = nilfs_btree_get_sib_node(path, level);
1288 	nchildren = nilfs_btree_node_get_nchildren(node);
1289 	lnchildren = nilfs_btree_node_get_nchildren(left);
1290 	ncblk = nilfs_btree_nchildren_per_block(btree);
1291 
1292 	n = (nchildren + lnchildren) / 2 - nchildren;
1293 
1294 	nilfs_btree_node_move_right(left, node, n, ncblk, ncblk);
1295 
1296 	if (!buffer_dirty(path[level].bp_bh))
1297 		mark_buffer_dirty(path[level].bp_bh);
1298 	if (!buffer_dirty(path[level].bp_sib_bh))
1299 		mark_buffer_dirty(path[level].bp_sib_bh);
1300 
1301 	nilfs_btree_promote_key(btree, path, level + 1,
1302 				nilfs_btree_node_get_key(node, 0));
1303 
1304 	brelse(path[level].bp_sib_bh);
1305 	path[level].bp_sib_bh = NULL;
1306 	path[level].bp_index += n;
1307 }
1308 
1309 static void nilfs_btree_borrow_right(struct nilfs_bmap *btree,
1310 				     struct nilfs_btree_path *path,
1311 				     int level, __u64 *keyp, __u64 *ptrp)
1312 {
1313 	struct nilfs_btree_node *node, *right;
1314 	int nchildren, rnchildren, n, ncblk;
1315 
1316 	nilfs_btree_do_delete(btree, path, level, keyp, ptrp);
1317 
1318 	node = nilfs_btree_get_nonroot_node(path, level);
1319 	right = nilfs_btree_get_sib_node(path, level);
1320 	nchildren = nilfs_btree_node_get_nchildren(node);
1321 	rnchildren = nilfs_btree_node_get_nchildren(right);
1322 	ncblk = nilfs_btree_nchildren_per_block(btree);
1323 
1324 	n = (nchildren + rnchildren) / 2 - nchildren;
1325 
1326 	nilfs_btree_node_move_left(node, right, n, ncblk, ncblk);
1327 
1328 	if (!buffer_dirty(path[level].bp_bh))
1329 		mark_buffer_dirty(path[level].bp_bh);
1330 	if (!buffer_dirty(path[level].bp_sib_bh))
1331 		mark_buffer_dirty(path[level].bp_sib_bh);
1332 
1333 	path[level + 1].bp_index++;
1334 	nilfs_btree_promote_key(btree, path, level + 1,
1335 				nilfs_btree_node_get_key(right, 0));
1336 	path[level + 1].bp_index--;
1337 
1338 	brelse(path[level].bp_sib_bh);
1339 	path[level].bp_sib_bh = NULL;
1340 }
1341 
1342 static void nilfs_btree_concat_left(struct nilfs_bmap *btree,
1343 				    struct nilfs_btree_path *path,
1344 				    int level, __u64 *keyp, __u64 *ptrp)
1345 {
1346 	struct nilfs_btree_node *node, *left;
1347 	int n, ncblk;
1348 
1349 	nilfs_btree_do_delete(btree, path, level, keyp, ptrp);
1350 
1351 	node = nilfs_btree_get_nonroot_node(path, level);
1352 	left = nilfs_btree_get_sib_node(path, level);
1353 	ncblk = nilfs_btree_nchildren_per_block(btree);
1354 
1355 	n = nilfs_btree_node_get_nchildren(node);
1356 
1357 	nilfs_btree_node_move_left(left, node, n, ncblk, ncblk);
1358 
1359 	if (!buffer_dirty(path[level].bp_sib_bh))
1360 		mark_buffer_dirty(path[level].bp_sib_bh);
1361 
1362 	nilfs_btnode_delete(path[level].bp_bh);
1363 	path[level].bp_bh = path[level].bp_sib_bh;
1364 	path[level].bp_sib_bh = NULL;
1365 	path[level].bp_index += nilfs_btree_node_get_nchildren(left);
1366 }
1367 
1368 static void nilfs_btree_concat_right(struct nilfs_bmap *btree,
1369 				     struct nilfs_btree_path *path,
1370 				     int level, __u64 *keyp, __u64 *ptrp)
1371 {
1372 	struct nilfs_btree_node *node, *right;
1373 	int n, ncblk;
1374 
1375 	nilfs_btree_do_delete(btree, path, level, keyp, ptrp);
1376 
1377 	node = nilfs_btree_get_nonroot_node(path, level);
1378 	right = nilfs_btree_get_sib_node(path, level);
1379 	ncblk = nilfs_btree_nchildren_per_block(btree);
1380 
1381 	n = nilfs_btree_node_get_nchildren(right);
1382 
1383 	nilfs_btree_node_move_left(node, right, n, ncblk, ncblk);
1384 
1385 	if (!buffer_dirty(path[level].bp_bh))
1386 		mark_buffer_dirty(path[level].bp_bh);
1387 
1388 	nilfs_btnode_delete(path[level].bp_sib_bh);
1389 	path[level].bp_sib_bh = NULL;
1390 	path[level + 1].bp_index++;
1391 }
1392 
1393 static void nilfs_btree_shrink(struct nilfs_bmap *btree,
1394 			       struct nilfs_btree_path *path,
1395 			       int level, __u64 *keyp, __u64 *ptrp)
1396 {
1397 	struct nilfs_btree_node *root, *child;
1398 	int n, ncblk;
1399 
1400 	nilfs_btree_do_delete(btree, path, level, keyp, ptrp);
1401 
1402 	root = nilfs_btree_get_root(btree);
1403 	child = nilfs_btree_get_nonroot_node(path, level);
1404 	ncblk = nilfs_btree_nchildren_per_block(btree);
1405 
1406 	nilfs_btree_node_delete(root, 0, NULL, NULL,
1407 				NILFS_BTREE_ROOT_NCHILDREN_MAX);
1408 	nilfs_btree_node_set_level(root, level);
1409 	n = nilfs_btree_node_get_nchildren(child);
1410 	nilfs_btree_node_move_left(root, child, n,
1411 				   NILFS_BTREE_ROOT_NCHILDREN_MAX, ncblk);
1412 
1413 	nilfs_btnode_delete(path[level].bp_bh);
1414 	path[level].bp_bh = NULL;
1415 }
1416 
1417 static void nilfs_btree_nop(struct nilfs_bmap *btree,
1418 			    struct nilfs_btree_path *path,
1419 			    int level, __u64 *keyp, __u64 *ptrp)
1420 {
1421 }
1422 
1423 static int nilfs_btree_prepare_delete(struct nilfs_bmap *btree,
1424 				      struct nilfs_btree_path *path,
1425 				      int *levelp,
1426 				      struct nilfs_bmap_stats *stats,
1427 				      struct inode *dat)
1428 {
1429 	struct buffer_head *bh;
1430 	struct nilfs_btree_node *node, *parent, *sib;
1431 	__u64 sibptr;
1432 	int pindex, dindex, level, ncmin, ncmax, ncblk, ret;
1433 
1434 	ret = 0;
1435 	stats->bs_nblocks = 0;
1436 	ncmin = NILFS_BTREE_NODE_NCHILDREN_MIN(nilfs_btree_node_size(btree));
1437 	ncblk = nilfs_btree_nchildren_per_block(btree);
1438 
1439 	for (level = NILFS_BTREE_LEVEL_NODE_MIN, dindex = path[level].bp_index;
1440 	     level < nilfs_btree_height(btree) - 1;
1441 	     level++) {
1442 		node = nilfs_btree_get_nonroot_node(path, level);
1443 		path[level].bp_oldreq.bpr_ptr =
1444 			nilfs_btree_node_get_ptr(node, dindex, ncblk);
1445 		ret = nilfs_bmap_prepare_end_ptr(btree,
1446 						 &path[level].bp_oldreq, dat);
1447 		if (ret < 0)
1448 			goto err_out_child_node;
1449 
1450 		if (nilfs_btree_node_get_nchildren(node) > ncmin) {
1451 			path[level].bp_op = nilfs_btree_do_delete;
1452 			stats->bs_nblocks++;
1453 			goto out;
1454 		}
1455 
1456 		parent = nilfs_btree_get_node(btree, path, level + 1, &ncmax);
1457 		pindex = path[level + 1].bp_index;
1458 		dindex = pindex;
1459 
1460 		if (pindex > 0) {
1461 			/* left sibling */
1462 			sibptr = nilfs_btree_node_get_ptr(parent, pindex - 1,
1463 							  ncmax);
1464 			ret = nilfs_btree_get_block(btree, sibptr, &bh);
1465 			if (ret < 0)
1466 				goto err_out_curr_node;
1467 			sib = (struct nilfs_btree_node *)bh->b_data;
1468 			if (nilfs_btree_node_get_nchildren(sib) > ncmin) {
1469 				path[level].bp_sib_bh = bh;
1470 				path[level].bp_op = nilfs_btree_borrow_left;
1471 				stats->bs_nblocks++;
1472 				goto out;
1473 			} else {
1474 				path[level].bp_sib_bh = bh;
1475 				path[level].bp_op = nilfs_btree_concat_left;
1476 				stats->bs_nblocks++;
1477 				/* continue; */
1478 			}
1479 		} else if (pindex <
1480 			   nilfs_btree_node_get_nchildren(parent) - 1) {
1481 			/* right sibling */
1482 			sibptr = nilfs_btree_node_get_ptr(parent, pindex + 1,
1483 							  ncmax);
1484 			ret = nilfs_btree_get_block(btree, sibptr, &bh);
1485 			if (ret < 0)
1486 				goto err_out_curr_node;
1487 			sib = (struct nilfs_btree_node *)bh->b_data;
1488 			if (nilfs_btree_node_get_nchildren(sib) > ncmin) {
1489 				path[level].bp_sib_bh = bh;
1490 				path[level].bp_op = nilfs_btree_borrow_right;
1491 				stats->bs_nblocks++;
1492 				goto out;
1493 			} else {
1494 				path[level].bp_sib_bh = bh;
1495 				path[level].bp_op = nilfs_btree_concat_right;
1496 				stats->bs_nblocks++;
1497 				/*
1498 				 * When merging right sibling node
1499 				 * into the current node, pointer to
1500 				 * the right sibling node must be
1501 				 * terminated instead.  The adjustment
1502 				 * below is required for that.
1503 				 */
1504 				dindex = pindex + 1;
1505 				/* continue; */
1506 			}
1507 		} else {
1508 			/* no siblings */
1509 			/* the only child of the root node */
1510 			WARN_ON(level != nilfs_btree_height(btree) - 2);
1511 			if (nilfs_btree_node_get_nchildren(node) - 1 <=
1512 			    NILFS_BTREE_ROOT_NCHILDREN_MAX) {
1513 				path[level].bp_op = nilfs_btree_shrink;
1514 				stats->bs_nblocks += 2;
1515 				level++;
1516 				path[level].bp_op = nilfs_btree_nop;
1517 				goto shrink_root_child;
1518 			} else {
1519 				path[level].bp_op = nilfs_btree_do_delete;
1520 				stats->bs_nblocks++;
1521 				goto out;
1522 			}
1523 		}
1524 	}
1525 
1526 	/* child of the root node is deleted */
1527 	path[level].bp_op = nilfs_btree_do_delete;
1528 	stats->bs_nblocks++;
1529 
1530 shrink_root_child:
1531 	node = nilfs_btree_get_root(btree);
1532 	path[level].bp_oldreq.bpr_ptr =
1533 		nilfs_btree_node_get_ptr(node, dindex,
1534 					 NILFS_BTREE_ROOT_NCHILDREN_MAX);
1535 
1536 	ret = nilfs_bmap_prepare_end_ptr(btree, &path[level].bp_oldreq, dat);
1537 	if (ret < 0)
1538 		goto err_out_child_node;
1539 
1540 	/* success */
1541  out:
1542 	*levelp = level;
1543 	return ret;
1544 
1545 	/* error */
1546  err_out_curr_node:
1547 	nilfs_bmap_abort_end_ptr(btree, &path[level].bp_oldreq, dat);
1548  err_out_child_node:
1549 	for (level--; level >= NILFS_BTREE_LEVEL_NODE_MIN; level--) {
1550 		brelse(path[level].bp_sib_bh);
1551 		nilfs_bmap_abort_end_ptr(btree, &path[level].bp_oldreq, dat);
1552 	}
1553 	*levelp = level;
1554 	stats->bs_nblocks = 0;
1555 	return ret;
1556 }
1557 
1558 static void nilfs_btree_commit_delete(struct nilfs_bmap *btree,
1559 				      struct nilfs_btree_path *path,
1560 				      int maxlevel, struct inode *dat)
1561 {
1562 	int level;
1563 
1564 	for (level = NILFS_BTREE_LEVEL_NODE_MIN; level <= maxlevel; level++) {
1565 		nilfs_bmap_commit_end_ptr(btree, &path[level].bp_oldreq, dat);
1566 		path[level].bp_op(btree, path, level, NULL, NULL);
1567 	}
1568 
1569 	if (!nilfs_bmap_dirty(btree))
1570 		nilfs_bmap_set_dirty(btree);
1571 }
1572 
1573 static int nilfs_btree_delete(struct nilfs_bmap *btree, __u64 key)
1574 
1575 {
1576 	struct nilfs_btree_path *path;
1577 	struct nilfs_bmap_stats stats;
1578 	struct inode *dat;
1579 	int level, ret;
1580 
1581 	path = nilfs_btree_alloc_path();
1582 	if (path == NULL)
1583 		return -ENOMEM;
1584 
1585 	ret = nilfs_btree_do_lookup(btree, path, key, NULL,
1586 				    NILFS_BTREE_LEVEL_NODE_MIN, 0);
1587 	if (ret < 0)
1588 		goto out;
1589 
1590 
1591 	dat = NILFS_BMAP_USE_VBN(btree) ? nilfs_bmap_get_dat(btree) : NULL;
1592 
1593 	ret = nilfs_btree_prepare_delete(btree, path, &level, &stats, dat);
1594 	if (ret < 0)
1595 		goto out;
1596 	nilfs_btree_commit_delete(btree, path, level, dat);
1597 	nilfs_inode_sub_blocks(btree->b_inode, stats.bs_nblocks);
1598 
1599 out:
1600 	nilfs_btree_free_path(path);
1601 	return ret;
1602 }
1603 
1604 static int nilfs_btree_seek_key(const struct nilfs_bmap *btree, __u64 start,
1605 				__u64 *keyp)
1606 {
1607 	struct nilfs_btree_path *path;
1608 	const int minlevel = NILFS_BTREE_LEVEL_NODE_MIN;
1609 	int ret;
1610 
1611 	path = nilfs_btree_alloc_path();
1612 	if (!path)
1613 		return -ENOMEM;
1614 
1615 	ret = nilfs_btree_do_lookup(btree, path, start, NULL, minlevel, 0);
1616 	if (!ret)
1617 		*keyp = start;
1618 	else if (ret == -ENOENT)
1619 		ret = nilfs_btree_get_next_key(btree, path, minlevel, keyp);
1620 
1621 	nilfs_btree_free_path(path);
1622 	return ret;
1623 }
1624 
1625 static int nilfs_btree_last_key(const struct nilfs_bmap *btree, __u64 *keyp)
1626 {
1627 	struct nilfs_btree_path *path;
1628 	int ret;
1629 
1630 	path = nilfs_btree_alloc_path();
1631 	if (path == NULL)
1632 		return -ENOMEM;
1633 
1634 	ret = nilfs_btree_do_lookup_last(btree, path, keyp, NULL);
1635 
1636 	nilfs_btree_free_path(path);
1637 
1638 	return ret;
1639 }
1640 
1641 static int nilfs_btree_check_delete(struct nilfs_bmap *btree, __u64 key)
1642 {
1643 	struct buffer_head *bh;
1644 	struct nilfs_btree_node *root, *node;
1645 	__u64 maxkey, nextmaxkey;
1646 	__u64 ptr;
1647 	int nchildren, ret;
1648 
1649 	root = nilfs_btree_get_root(btree);
1650 	switch (nilfs_btree_height(btree)) {
1651 	case 2:
1652 		bh = NULL;
1653 		node = root;
1654 		break;
1655 	case 3:
1656 		nchildren = nilfs_btree_node_get_nchildren(root);
1657 		if (nchildren > 1)
1658 			return 0;
1659 		ptr = nilfs_btree_node_get_ptr(root, nchildren - 1,
1660 					       NILFS_BTREE_ROOT_NCHILDREN_MAX);
1661 		ret = nilfs_btree_get_block(btree, ptr, &bh);
1662 		if (ret < 0)
1663 			return ret;
1664 		node = (struct nilfs_btree_node *)bh->b_data;
1665 		break;
1666 	default:
1667 		return 0;
1668 	}
1669 
1670 	nchildren = nilfs_btree_node_get_nchildren(node);
1671 	maxkey = nilfs_btree_node_get_key(node, nchildren - 1);
1672 	nextmaxkey = (nchildren > 1) ?
1673 		nilfs_btree_node_get_key(node, nchildren - 2) : 0;
1674 	if (bh != NULL)
1675 		brelse(bh);
1676 
1677 	return (maxkey == key) && (nextmaxkey < NILFS_BMAP_LARGE_LOW);
1678 }
1679 
1680 static int nilfs_btree_gather_data(struct nilfs_bmap *btree,
1681 				   __u64 *keys, __u64 *ptrs, int nitems)
1682 {
1683 	struct buffer_head *bh;
1684 	struct nilfs_btree_node *node, *root;
1685 	__le64 *dkeys;
1686 	__le64 *dptrs;
1687 	__u64 ptr;
1688 	int nchildren, ncmax, i, ret;
1689 
1690 	root = nilfs_btree_get_root(btree);
1691 	switch (nilfs_btree_height(btree)) {
1692 	case 2:
1693 		bh = NULL;
1694 		node = root;
1695 		ncmax = NILFS_BTREE_ROOT_NCHILDREN_MAX;
1696 		break;
1697 	case 3:
1698 		nchildren = nilfs_btree_node_get_nchildren(root);
1699 		WARN_ON(nchildren > 1);
1700 		ptr = nilfs_btree_node_get_ptr(root, nchildren - 1,
1701 					       NILFS_BTREE_ROOT_NCHILDREN_MAX);
1702 		ret = nilfs_btree_get_block(btree, ptr, &bh);
1703 		if (ret < 0)
1704 			return ret;
1705 		node = (struct nilfs_btree_node *)bh->b_data;
1706 		ncmax = nilfs_btree_nchildren_per_block(btree);
1707 		break;
1708 	default:
1709 		node = NULL;
1710 		return -EINVAL;
1711 	}
1712 
1713 	nchildren = nilfs_btree_node_get_nchildren(node);
1714 	if (nchildren < nitems)
1715 		nitems = nchildren;
1716 	dkeys = nilfs_btree_node_dkeys(node);
1717 	dptrs = nilfs_btree_node_dptrs(node, ncmax);
1718 	for (i = 0; i < nitems; i++) {
1719 		keys[i] = le64_to_cpu(dkeys[i]);
1720 		ptrs[i] = le64_to_cpu(dptrs[i]);
1721 	}
1722 
1723 	if (bh != NULL)
1724 		brelse(bh);
1725 
1726 	return nitems;
1727 }
1728 
1729 static int
1730 nilfs_btree_prepare_convert_and_insert(struct nilfs_bmap *btree, __u64 key,
1731 				       union nilfs_bmap_ptr_req *dreq,
1732 				       union nilfs_bmap_ptr_req *nreq,
1733 				       struct buffer_head **bhp,
1734 				       struct nilfs_bmap_stats *stats)
1735 {
1736 	struct buffer_head *bh;
1737 	struct inode *dat = NULL;
1738 	int ret;
1739 
1740 	stats->bs_nblocks = 0;
1741 
1742 	/* for data */
1743 	/* cannot find near ptr */
1744 	if (NILFS_BMAP_USE_VBN(btree)) {
1745 		dreq->bpr_ptr = nilfs_btree_find_target_v(btree, NULL, key);
1746 		dat = nilfs_bmap_get_dat(btree);
1747 	}
1748 
1749 	ret = nilfs_bmap_prepare_alloc_ptr(btree, dreq, dat);
1750 	if (ret < 0)
1751 		return ret;
1752 
1753 	*bhp = NULL;
1754 	stats->bs_nblocks++;
1755 	if (nreq != NULL) {
1756 		nreq->bpr_ptr = dreq->bpr_ptr + 1;
1757 		ret = nilfs_bmap_prepare_alloc_ptr(btree, nreq, dat);
1758 		if (ret < 0)
1759 			goto err_out_dreq;
1760 
1761 		ret = nilfs_btree_get_new_block(btree, nreq->bpr_ptr, &bh);
1762 		if (ret < 0)
1763 			goto err_out_nreq;
1764 
1765 		*bhp = bh;
1766 		stats->bs_nblocks++;
1767 	}
1768 
1769 	/* success */
1770 	return 0;
1771 
1772 	/* error */
1773  err_out_nreq:
1774 	nilfs_bmap_abort_alloc_ptr(btree, nreq, dat);
1775  err_out_dreq:
1776 	nilfs_bmap_abort_alloc_ptr(btree, dreq, dat);
1777 	stats->bs_nblocks = 0;
1778 	return ret;
1779 
1780 }
1781 
1782 static void
1783 nilfs_btree_commit_convert_and_insert(struct nilfs_bmap *btree,
1784 				      __u64 key, __u64 ptr,
1785 				      const __u64 *keys, const __u64 *ptrs,
1786 				      int n,
1787 				      union nilfs_bmap_ptr_req *dreq,
1788 				      union nilfs_bmap_ptr_req *nreq,
1789 				      struct buffer_head *bh)
1790 {
1791 	struct nilfs_btree_node *node;
1792 	struct inode *dat;
1793 	__u64 tmpptr;
1794 	int ncblk;
1795 
1796 	/* free resources */
1797 	if (btree->b_ops->bop_clear != NULL)
1798 		btree->b_ops->bop_clear(btree);
1799 
1800 	/* ptr must be a pointer to a buffer head. */
1801 	set_buffer_nilfs_volatile((struct buffer_head *)((unsigned long)ptr));
1802 
1803 	/* convert and insert */
1804 	dat = NILFS_BMAP_USE_VBN(btree) ? nilfs_bmap_get_dat(btree) : NULL;
1805 	__nilfs_btree_init(btree);
1806 	if (nreq != NULL) {
1807 		nilfs_bmap_commit_alloc_ptr(btree, dreq, dat);
1808 		nilfs_bmap_commit_alloc_ptr(btree, nreq, dat);
1809 
1810 		/* create child node at level 1 */
1811 		node = (struct nilfs_btree_node *)bh->b_data;
1812 		ncblk = nilfs_btree_nchildren_per_block(btree);
1813 		nilfs_btree_node_init(node, 0, 1, n, ncblk, keys, ptrs);
1814 		nilfs_btree_node_insert(node, n, key, dreq->bpr_ptr, ncblk);
1815 		if (!buffer_dirty(bh))
1816 			mark_buffer_dirty(bh);
1817 		if (!nilfs_bmap_dirty(btree))
1818 			nilfs_bmap_set_dirty(btree);
1819 
1820 		brelse(bh);
1821 
1822 		/* create root node at level 2 */
1823 		node = nilfs_btree_get_root(btree);
1824 		tmpptr = nreq->bpr_ptr;
1825 		nilfs_btree_node_init(node, NILFS_BTREE_NODE_ROOT, 2, 1,
1826 				      NILFS_BTREE_ROOT_NCHILDREN_MAX,
1827 				      &keys[0], &tmpptr);
1828 	} else {
1829 		nilfs_bmap_commit_alloc_ptr(btree, dreq, dat);
1830 
1831 		/* create root node at level 1 */
1832 		node = nilfs_btree_get_root(btree);
1833 		nilfs_btree_node_init(node, NILFS_BTREE_NODE_ROOT, 1, n,
1834 				      NILFS_BTREE_ROOT_NCHILDREN_MAX,
1835 				      keys, ptrs);
1836 		nilfs_btree_node_insert(node, n, key, dreq->bpr_ptr,
1837 					NILFS_BTREE_ROOT_NCHILDREN_MAX);
1838 		if (!nilfs_bmap_dirty(btree))
1839 			nilfs_bmap_set_dirty(btree);
1840 	}
1841 
1842 	if (NILFS_BMAP_USE_VBN(btree))
1843 		nilfs_bmap_set_target_v(btree, key, dreq->bpr_ptr);
1844 }
1845 
1846 /**
1847  * nilfs_btree_convert_and_insert -
1848  * @bmap:
1849  * @key:
1850  * @ptr:
1851  * @keys:
1852  * @ptrs:
1853  * @n:
1854  */
1855 int nilfs_btree_convert_and_insert(struct nilfs_bmap *btree,
1856 				   __u64 key, __u64 ptr,
1857 				   const __u64 *keys, const __u64 *ptrs, int n)
1858 {
1859 	struct buffer_head *bh;
1860 	union nilfs_bmap_ptr_req dreq, nreq, *di, *ni;
1861 	struct nilfs_bmap_stats stats;
1862 	int ret;
1863 
1864 	if (n + 1 <= NILFS_BTREE_ROOT_NCHILDREN_MAX) {
1865 		di = &dreq;
1866 		ni = NULL;
1867 	} else if ((n + 1) <= NILFS_BTREE_NODE_NCHILDREN_MAX(
1868 			   1 << btree->b_inode->i_blkbits)) {
1869 		di = &dreq;
1870 		ni = &nreq;
1871 	} else {
1872 		di = NULL;
1873 		ni = NULL;
1874 		BUG();
1875 	}
1876 
1877 	ret = nilfs_btree_prepare_convert_and_insert(btree, key, di, ni, &bh,
1878 						     &stats);
1879 	if (ret < 0)
1880 		return ret;
1881 	nilfs_btree_commit_convert_and_insert(btree, key, ptr, keys, ptrs, n,
1882 					      di, ni, bh);
1883 	nilfs_inode_add_blocks(btree->b_inode, stats.bs_nblocks);
1884 	return 0;
1885 }
1886 
1887 static int nilfs_btree_propagate_p(struct nilfs_bmap *btree,
1888 				   struct nilfs_btree_path *path,
1889 				   int level,
1890 				   struct buffer_head *bh)
1891 {
1892 	while ((++level < nilfs_btree_height(btree) - 1) &&
1893 	       !buffer_dirty(path[level].bp_bh))
1894 		mark_buffer_dirty(path[level].bp_bh);
1895 
1896 	return 0;
1897 }
1898 
1899 static int nilfs_btree_prepare_update_v(struct nilfs_bmap *btree,
1900 					struct nilfs_btree_path *path,
1901 					int level, struct inode *dat)
1902 {
1903 	struct nilfs_btree_node *parent;
1904 	int ncmax, ret;
1905 
1906 	parent = nilfs_btree_get_node(btree, path, level + 1, &ncmax);
1907 	path[level].bp_oldreq.bpr_ptr =
1908 		nilfs_btree_node_get_ptr(parent, path[level + 1].bp_index,
1909 					 ncmax);
1910 	path[level].bp_newreq.bpr_ptr = path[level].bp_oldreq.bpr_ptr + 1;
1911 	ret = nilfs_dat_prepare_update(dat, &path[level].bp_oldreq.bpr_req,
1912 				       &path[level].bp_newreq.bpr_req);
1913 	if (ret < 0)
1914 		return ret;
1915 
1916 	if (buffer_nilfs_node(path[level].bp_bh)) {
1917 		path[level].bp_ctxt.oldkey = path[level].bp_oldreq.bpr_ptr;
1918 		path[level].bp_ctxt.newkey = path[level].bp_newreq.bpr_ptr;
1919 		path[level].bp_ctxt.bh = path[level].bp_bh;
1920 		ret = nilfs_btnode_prepare_change_key(
1921 			&NILFS_BMAP_I(btree)->i_btnode_cache,
1922 			&path[level].bp_ctxt);
1923 		if (ret < 0) {
1924 			nilfs_dat_abort_update(dat,
1925 					       &path[level].bp_oldreq.bpr_req,
1926 					       &path[level].bp_newreq.bpr_req);
1927 			return ret;
1928 		}
1929 	}
1930 
1931 	return 0;
1932 }
1933 
1934 static void nilfs_btree_commit_update_v(struct nilfs_bmap *btree,
1935 					struct nilfs_btree_path *path,
1936 					int level, struct inode *dat)
1937 {
1938 	struct nilfs_btree_node *parent;
1939 	int ncmax;
1940 
1941 	nilfs_dat_commit_update(dat, &path[level].bp_oldreq.bpr_req,
1942 				&path[level].bp_newreq.bpr_req,
1943 				btree->b_ptr_type == NILFS_BMAP_PTR_VS);
1944 
1945 	if (buffer_nilfs_node(path[level].bp_bh)) {
1946 		nilfs_btnode_commit_change_key(
1947 			&NILFS_BMAP_I(btree)->i_btnode_cache,
1948 			&path[level].bp_ctxt);
1949 		path[level].bp_bh = path[level].bp_ctxt.bh;
1950 	}
1951 	set_buffer_nilfs_volatile(path[level].bp_bh);
1952 
1953 	parent = nilfs_btree_get_node(btree, path, level + 1, &ncmax);
1954 	nilfs_btree_node_set_ptr(parent, path[level + 1].bp_index,
1955 				 path[level].bp_newreq.bpr_ptr, ncmax);
1956 }
1957 
1958 static void nilfs_btree_abort_update_v(struct nilfs_bmap *btree,
1959 				       struct nilfs_btree_path *path,
1960 				       int level, struct inode *dat)
1961 {
1962 	nilfs_dat_abort_update(dat, &path[level].bp_oldreq.bpr_req,
1963 			       &path[level].bp_newreq.bpr_req);
1964 	if (buffer_nilfs_node(path[level].bp_bh))
1965 		nilfs_btnode_abort_change_key(
1966 			&NILFS_BMAP_I(btree)->i_btnode_cache,
1967 			&path[level].bp_ctxt);
1968 }
1969 
1970 static int nilfs_btree_prepare_propagate_v(struct nilfs_bmap *btree,
1971 					   struct nilfs_btree_path *path,
1972 					   int minlevel, int *maxlevelp,
1973 					   struct inode *dat)
1974 {
1975 	int level, ret;
1976 
1977 	level = minlevel;
1978 	if (!buffer_nilfs_volatile(path[level].bp_bh)) {
1979 		ret = nilfs_btree_prepare_update_v(btree, path, level, dat);
1980 		if (ret < 0)
1981 			return ret;
1982 	}
1983 	while ((++level < nilfs_btree_height(btree) - 1) &&
1984 	       !buffer_dirty(path[level].bp_bh)) {
1985 
1986 		WARN_ON(buffer_nilfs_volatile(path[level].bp_bh));
1987 		ret = nilfs_btree_prepare_update_v(btree, path, level, dat);
1988 		if (ret < 0)
1989 			goto out;
1990 	}
1991 
1992 	/* success */
1993 	*maxlevelp = level - 1;
1994 	return 0;
1995 
1996 	/* error */
1997  out:
1998 	while (--level > minlevel)
1999 		nilfs_btree_abort_update_v(btree, path, level, dat);
2000 	if (!buffer_nilfs_volatile(path[level].bp_bh))
2001 		nilfs_btree_abort_update_v(btree, path, level, dat);
2002 	return ret;
2003 }
2004 
2005 static void nilfs_btree_commit_propagate_v(struct nilfs_bmap *btree,
2006 					   struct nilfs_btree_path *path,
2007 					   int minlevel, int maxlevel,
2008 					   struct buffer_head *bh,
2009 					   struct inode *dat)
2010 {
2011 	int level;
2012 
2013 	if (!buffer_nilfs_volatile(path[minlevel].bp_bh))
2014 		nilfs_btree_commit_update_v(btree, path, minlevel, dat);
2015 
2016 	for (level = minlevel + 1; level <= maxlevel; level++)
2017 		nilfs_btree_commit_update_v(btree, path, level, dat);
2018 }
2019 
2020 static int nilfs_btree_propagate_v(struct nilfs_bmap *btree,
2021 				   struct nilfs_btree_path *path,
2022 				   int level, struct buffer_head *bh)
2023 {
2024 	int maxlevel = 0, ret;
2025 	struct nilfs_btree_node *parent;
2026 	struct inode *dat = nilfs_bmap_get_dat(btree);
2027 	__u64 ptr;
2028 	int ncmax;
2029 
2030 	get_bh(bh);
2031 	path[level].bp_bh = bh;
2032 	ret = nilfs_btree_prepare_propagate_v(btree, path, level, &maxlevel,
2033 					      dat);
2034 	if (ret < 0)
2035 		goto out;
2036 
2037 	if (buffer_nilfs_volatile(path[level].bp_bh)) {
2038 		parent = nilfs_btree_get_node(btree, path, level + 1, &ncmax);
2039 		ptr = nilfs_btree_node_get_ptr(parent,
2040 					       path[level + 1].bp_index,
2041 					       ncmax);
2042 		ret = nilfs_dat_mark_dirty(dat, ptr);
2043 		if (ret < 0)
2044 			goto out;
2045 	}
2046 
2047 	nilfs_btree_commit_propagate_v(btree, path, level, maxlevel, bh, dat);
2048 
2049  out:
2050 	brelse(path[level].bp_bh);
2051 	path[level].bp_bh = NULL;
2052 	return ret;
2053 }
2054 
2055 static int nilfs_btree_propagate(struct nilfs_bmap *btree,
2056 				 struct buffer_head *bh)
2057 {
2058 	struct nilfs_btree_path *path;
2059 	struct nilfs_btree_node *node;
2060 	__u64 key;
2061 	int level, ret;
2062 
2063 	WARN_ON(!buffer_dirty(bh));
2064 
2065 	path = nilfs_btree_alloc_path();
2066 	if (path == NULL)
2067 		return -ENOMEM;
2068 
2069 	if (buffer_nilfs_node(bh)) {
2070 		node = (struct nilfs_btree_node *)bh->b_data;
2071 		key = nilfs_btree_node_get_key(node, 0);
2072 		level = nilfs_btree_node_get_level(node);
2073 	} else {
2074 		key = nilfs_bmap_data_get_key(btree, bh);
2075 		level = NILFS_BTREE_LEVEL_DATA;
2076 	}
2077 
2078 	ret = nilfs_btree_do_lookup(btree, path, key, NULL, level + 1, 0);
2079 	if (ret < 0) {
2080 		if (unlikely(ret == -ENOENT))
2081 			printk(KERN_CRIT "%s: key = %llu, level == %d\n",
2082 			       __func__, (unsigned long long)key, level);
2083 		goto out;
2084 	}
2085 
2086 	ret = NILFS_BMAP_USE_VBN(btree) ?
2087 		nilfs_btree_propagate_v(btree, path, level, bh) :
2088 		nilfs_btree_propagate_p(btree, path, level, bh);
2089 
2090  out:
2091 	nilfs_btree_free_path(path);
2092 
2093 	return ret;
2094 }
2095 
2096 static int nilfs_btree_propagate_gc(struct nilfs_bmap *btree,
2097 				    struct buffer_head *bh)
2098 {
2099 	return nilfs_dat_mark_dirty(nilfs_bmap_get_dat(btree), bh->b_blocknr);
2100 }
2101 
2102 static void nilfs_btree_add_dirty_buffer(struct nilfs_bmap *btree,
2103 					 struct list_head *lists,
2104 					 struct buffer_head *bh)
2105 {
2106 	struct list_head *head;
2107 	struct buffer_head *cbh;
2108 	struct nilfs_btree_node *node, *cnode;
2109 	__u64 key, ckey;
2110 	int level;
2111 
2112 	get_bh(bh);
2113 	node = (struct nilfs_btree_node *)bh->b_data;
2114 	key = nilfs_btree_node_get_key(node, 0);
2115 	level = nilfs_btree_node_get_level(node);
2116 	if (level < NILFS_BTREE_LEVEL_NODE_MIN ||
2117 	    level >= NILFS_BTREE_LEVEL_MAX) {
2118 		dump_stack();
2119 		printk(KERN_WARNING
2120 		       "%s: invalid btree level: %d (key=%llu, ino=%lu, "
2121 		       "blocknr=%llu)\n",
2122 		       __func__, level, (unsigned long long)key,
2123 		       NILFS_BMAP_I(btree)->vfs_inode.i_ino,
2124 		       (unsigned long long)bh->b_blocknr);
2125 		return;
2126 	}
2127 
2128 	list_for_each(head, &lists[level]) {
2129 		cbh = list_entry(head, struct buffer_head, b_assoc_buffers);
2130 		cnode = (struct nilfs_btree_node *)cbh->b_data;
2131 		ckey = nilfs_btree_node_get_key(cnode, 0);
2132 		if (key < ckey)
2133 			break;
2134 	}
2135 	list_add_tail(&bh->b_assoc_buffers, head);
2136 }
2137 
2138 static void nilfs_btree_lookup_dirty_buffers(struct nilfs_bmap *btree,
2139 					     struct list_head *listp)
2140 {
2141 	struct address_space *btcache = &NILFS_BMAP_I(btree)->i_btnode_cache;
2142 	struct list_head lists[NILFS_BTREE_LEVEL_MAX];
2143 	struct pagevec pvec;
2144 	struct buffer_head *bh, *head;
2145 	pgoff_t index = 0;
2146 	int level, i;
2147 
2148 	for (level = NILFS_BTREE_LEVEL_NODE_MIN;
2149 	     level < NILFS_BTREE_LEVEL_MAX;
2150 	     level++)
2151 		INIT_LIST_HEAD(&lists[level]);
2152 
2153 	pagevec_init(&pvec, 0);
2154 
2155 	while (pagevec_lookup_tag(&pvec, btcache, &index, PAGECACHE_TAG_DIRTY,
2156 				  PAGEVEC_SIZE)) {
2157 		for (i = 0; i < pagevec_count(&pvec); i++) {
2158 			bh = head = page_buffers(pvec.pages[i]);
2159 			do {
2160 				if (buffer_dirty(bh))
2161 					nilfs_btree_add_dirty_buffer(btree,
2162 								     lists, bh);
2163 			} while ((bh = bh->b_this_page) != head);
2164 		}
2165 		pagevec_release(&pvec);
2166 		cond_resched();
2167 	}
2168 
2169 	for (level = NILFS_BTREE_LEVEL_NODE_MIN;
2170 	     level < NILFS_BTREE_LEVEL_MAX;
2171 	     level++)
2172 		list_splice_tail(&lists[level], listp);
2173 }
2174 
2175 static int nilfs_btree_assign_p(struct nilfs_bmap *btree,
2176 				struct nilfs_btree_path *path,
2177 				int level,
2178 				struct buffer_head **bh,
2179 				sector_t blocknr,
2180 				union nilfs_binfo *binfo)
2181 {
2182 	struct nilfs_btree_node *parent;
2183 	__u64 key;
2184 	__u64 ptr;
2185 	int ncmax, ret;
2186 
2187 	parent = nilfs_btree_get_node(btree, path, level + 1, &ncmax);
2188 	ptr = nilfs_btree_node_get_ptr(parent, path[level + 1].bp_index,
2189 				       ncmax);
2190 	if (buffer_nilfs_node(*bh)) {
2191 		path[level].bp_ctxt.oldkey = ptr;
2192 		path[level].bp_ctxt.newkey = blocknr;
2193 		path[level].bp_ctxt.bh = *bh;
2194 		ret = nilfs_btnode_prepare_change_key(
2195 			&NILFS_BMAP_I(btree)->i_btnode_cache,
2196 			&path[level].bp_ctxt);
2197 		if (ret < 0)
2198 			return ret;
2199 		nilfs_btnode_commit_change_key(
2200 			&NILFS_BMAP_I(btree)->i_btnode_cache,
2201 			&path[level].bp_ctxt);
2202 		*bh = path[level].bp_ctxt.bh;
2203 	}
2204 
2205 	nilfs_btree_node_set_ptr(parent, path[level + 1].bp_index, blocknr,
2206 				 ncmax);
2207 
2208 	key = nilfs_btree_node_get_key(parent, path[level + 1].bp_index);
2209 	/* on-disk format */
2210 	binfo->bi_dat.bi_blkoff = cpu_to_le64(key);
2211 	binfo->bi_dat.bi_level = level;
2212 
2213 	return 0;
2214 }
2215 
2216 static int nilfs_btree_assign_v(struct nilfs_bmap *btree,
2217 				struct nilfs_btree_path *path,
2218 				int level,
2219 				struct buffer_head **bh,
2220 				sector_t blocknr,
2221 				union nilfs_binfo *binfo)
2222 {
2223 	struct nilfs_btree_node *parent;
2224 	struct inode *dat = nilfs_bmap_get_dat(btree);
2225 	__u64 key;
2226 	__u64 ptr;
2227 	union nilfs_bmap_ptr_req req;
2228 	int ncmax, ret;
2229 
2230 	parent = nilfs_btree_get_node(btree, path, level + 1, &ncmax);
2231 	ptr = nilfs_btree_node_get_ptr(parent, path[level + 1].bp_index,
2232 				       ncmax);
2233 	req.bpr_ptr = ptr;
2234 	ret = nilfs_dat_prepare_start(dat, &req.bpr_req);
2235 	if (ret < 0)
2236 		return ret;
2237 	nilfs_dat_commit_start(dat, &req.bpr_req, blocknr);
2238 
2239 	key = nilfs_btree_node_get_key(parent, path[level + 1].bp_index);
2240 	/* on-disk format */
2241 	binfo->bi_v.bi_vblocknr = cpu_to_le64(ptr);
2242 	binfo->bi_v.bi_blkoff = cpu_to_le64(key);
2243 
2244 	return 0;
2245 }
2246 
2247 static int nilfs_btree_assign(struct nilfs_bmap *btree,
2248 			      struct buffer_head **bh,
2249 			      sector_t blocknr,
2250 			      union nilfs_binfo *binfo)
2251 {
2252 	struct nilfs_btree_path *path;
2253 	struct nilfs_btree_node *node;
2254 	__u64 key;
2255 	int level, ret;
2256 
2257 	path = nilfs_btree_alloc_path();
2258 	if (path == NULL)
2259 		return -ENOMEM;
2260 
2261 	if (buffer_nilfs_node(*bh)) {
2262 		node = (struct nilfs_btree_node *)(*bh)->b_data;
2263 		key = nilfs_btree_node_get_key(node, 0);
2264 		level = nilfs_btree_node_get_level(node);
2265 	} else {
2266 		key = nilfs_bmap_data_get_key(btree, *bh);
2267 		level = NILFS_BTREE_LEVEL_DATA;
2268 	}
2269 
2270 	ret = nilfs_btree_do_lookup(btree, path, key, NULL, level + 1, 0);
2271 	if (ret < 0) {
2272 		WARN_ON(ret == -ENOENT);
2273 		goto out;
2274 	}
2275 
2276 	ret = NILFS_BMAP_USE_VBN(btree) ?
2277 		nilfs_btree_assign_v(btree, path, level, bh, blocknr, binfo) :
2278 		nilfs_btree_assign_p(btree, path, level, bh, blocknr, binfo);
2279 
2280  out:
2281 	nilfs_btree_free_path(path);
2282 
2283 	return ret;
2284 }
2285 
2286 static int nilfs_btree_assign_gc(struct nilfs_bmap *btree,
2287 				 struct buffer_head **bh,
2288 				 sector_t blocknr,
2289 				 union nilfs_binfo *binfo)
2290 {
2291 	struct nilfs_btree_node *node;
2292 	__u64 key;
2293 	int ret;
2294 
2295 	ret = nilfs_dat_move(nilfs_bmap_get_dat(btree), (*bh)->b_blocknr,
2296 			     blocknr);
2297 	if (ret < 0)
2298 		return ret;
2299 
2300 	if (buffer_nilfs_node(*bh)) {
2301 		node = (struct nilfs_btree_node *)(*bh)->b_data;
2302 		key = nilfs_btree_node_get_key(node, 0);
2303 	} else
2304 		key = nilfs_bmap_data_get_key(btree, *bh);
2305 
2306 	/* on-disk format */
2307 	binfo->bi_v.bi_vblocknr = cpu_to_le64((*bh)->b_blocknr);
2308 	binfo->bi_v.bi_blkoff = cpu_to_le64(key);
2309 
2310 	return 0;
2311 }
2312 
2313 static int nilfs_btree_mark(struct nilfs_bmap *btree, __u64 key, int level)
2314 {
2315 	struct buffer_head *bh;
2316 	struct nilfs_btree_path *path;
2317 	__u64 ptr;
2318 	int ret;
2319 
2320 	path = nilfs_btree_alloc_path();
2321 	if (path == NULL)
2322 		return -ENOMEM;
2323 
2324 	ret = nilfs_btree_do_lookup(btree, path, key, &ptr, level + 1, 0);
2325 	if (ret < 0) {
2326 		WARN_ON(ret == -ENOENT);
2327 		goto out;
2328 	}
2329 	ret = nilfs_btree_get_block(btree, ptr, &bh);
2330 	if (ret < 0) {
2331 		WARN_ON(ret == -ENOENT);
2332 		goto out;
2333 	}
2334 
2335 	if (!buffer_dirty(bh))
2336 		mark_buffer_dirty(bh);
2337 	brelse(bh);
2338 	if (!nilfs_bmap_dirty(btree))
2339 		nilfs_bmap_set_dirty(btree);
2340 
2341  out:
2342 	nilfs_btree_free_path(path);
2343 	return ret;
2344 }
2345 
2346 static const struct nilfs_bmap_operations nilfs_btree_ops = {
2347 	.bop_lookup		=	nilfs_btree_lookup,
2348 	.bop_lookup_contig	=	nilfs_btree_lookup_contig,
2349 	.bop_insert		=	nilfs_btree_insert,
2350 	.bop_delete		=	nilfs_btree_delete,
2351 	.bop_clear		=	NULL,
2352 
2353 	.bop_propagate		=	nilfs_btree_propagate,
2354 
2355 	.bop_lookup_dirty_buffers =	nilfs_btree_lookup_dirty_buffers,
2356 
2357 	.bop_assign		=	nilfs_btree_assign,
2358 	.bop_mark		=	nilfs_btree_mark,
2359 
2360 	.bop_seek_key		=	nilfs_btree_seek_key,
2361 	.bop_last_key		=	nilfs_btree_last_key,
2362 
2363 	.bop_check_insert	=	NULL,
2364 	.bop_check_delete	=	nilfs_btree_check_delete,
2365 	.bop_gather_data	=	nilfs_btree_gather_data,
2366 };
2367 
2368 static const struct nilfs_bmap_operations nilfs_btree_ops_gc = {
2369 	.bop_lookup		=	NULL,
2370 	.bop_lookup_contig	=	NULL,
2371 	.bop_insert		=	NULL,
2372 	.bop_delete		=	NULL,
2373 	.bop_clear		=	NULL,
2374 
2375 	.bop_propagate		=	nilfs_btree_propagate_gc,
2376 
2377 	.bop_lookup_dirty_buffers =	nilfs_btree_lookup_dirty_buffers,
2378 
2379 	.bop_assign		=	nilfs_btree_assign_gc,
2380 	.bop_mark		=	NULL,
2381 
2382 	.bop_seek_key		=	NULL,
2383 	.bop_last_key		=	NULL,
2384 
2385 	.bop_check_insert	=	NULL,
2386 	.bop_check_delete	=	NULL,
2387 	.bop_gather_data	=	NULL,
2388 };
2389 
2390 static void __nilfs_btree_init(struct nilfs_bmap *bmap)
2391 {
2392 	bmap->b_ops = &nilfs_btree_ops;
2393 	bmap->b_nchildren_per_block =
2394 		NILFS_BTREE_NODE_NCHILDREN_MAX(nilfs_btree_node_size(bmap));
2395 }
2396 
2397 int nilfs_btree_init(struct nilfs_bmap *bmap)
2398 {
2399 	int ret = 0;
2400 
2401 	__nilfs_btree_init(bmap);
2402 
2403 	if (nilfs_btree_root_broken(nilfs_btree_get_root(bmap),
2404 				    bmap->b_inode->i_ino))
2405 		ret = -EIO;
2406 	return ret;
2407 }
2408 
2409 void nilfs_btree_init_gc(struct nilfs_bmap *bmap)
2410 {
2411 	bmap->b_ops = &nilfs_btree_ops_gc;
2412 	bmap->b_nchildren_per_block =
2413 		NILFS_BTREE_NODE_NCHILDREN_MAX(nilfs_btree_node_size(bmap));
2414 }
2415