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