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.c36
1 files changed, 18 insertions, 18 deletions
diff --git a/fs/nilfs2/btree.c b/fs/nilfs2/btree.c
index 18bb965c66b5..c0266f7f0b26 100644
--- a/fs/nilfs2/btree.c
+++ b/fs/nilfs2/btree.c
@@ -473,7 +473,7 @@ static int nilfs_btree_do_lookup(const struct nilfs_bmap *btree,
473{ 473{
474 struct nilfs_btree_node *node; 474 struct nilfs_btree_node *node;
475 __u64 ptr; 475 __u64 ptr;
476 int level, index, found, ret; 476 int level, index, found, ncmax, ret;
477 477
478 node = nilfs_btree_get_root(btree); 478 node = nilfs_btree_get_root(btree);
479 level = nilfs_btree_node_get_level(node); 479 level = nilfs_btree_node_get_level(node);
@@ -485,6 +485,8 @@ static int nilfs_btree_do_lookup(const struct nilfs_bmap *btree,
485 path[level].bp_bh = NULL; 485 path[level].bp_bh = NULL;
486 path[level].bp_index = index; 486 path[level].bp_index = index;
487 487
488 ncmax = NILFS_BTREE_NODE_NCHILDREN_MAX(nilfs_btree_node_size(btree));
489
488 for (level--; level >= minlevel; level--) { 490 for (level--; level >= minlevel; level--) {
489 ret = nilfs_btree_get_block(btree, ptr, &path[level].bp_bh); 491 ret = nilfs_btree_get_block(btree, ptr, &path[level].bp_bh);
490 if (ret < 0) 492 if (ret < 0)
@@ -496,9 +498,9 @@ static int nilfs_btree_do_lookup(const struct nilfs_bmap *btree,
496 found = nilfs_btree_node_lookup(node, key, &index); 498 found = nilfs_btree_node_lookup(node, key, &index);
497 else 499 else
498 index = 0; 500 index = 0;
499 if (index < nilfs_btree_node_nchildren_max(node, btree)) 501 if (index < ncmax) {
500 ptr = nilfs_btree_node_get_ptr(btree, node, index); 502 ptr = nilfs_btree_node_get_ptr(btree, node, index);
501 else { 503 } else {
502 WARN_ON(found || level != NILFS_BTREE_LEVEL_NODE_MIN); 504 WARN_ON(found || level != NILFS_BTREE_LEVEL_NODE_MIN);
503 /* insert */ 505 /* insert */
504 ptr = NILFS_BMAP_INVALID_PTR; 506 ptr = NILFS_BMAP_INVALID_PTR;
@@ -921,7 +923,7 @@ static int nilfs_btree_prepare_insert(struct nilfs_bmap *btree,
921 struct buffer_head *bh; 923 struct buffer_head *bh;
922 struct nilfs_btree_node *node, *parent, *sib; 924 struct nilfs_btree_node *node, *parent, *sib;
923 __u64 sibptr; 925 __u64 sibptr;
924 int pindex, level, ret; 926 int pindex, level, ncmax, ret;
925 struct inode *dat = NULL; 927 struct inode *dat = NULL;
926 928
927 stats->bs_nblocks = 0; 929 stats->bs_nblocks = 0;
@@ -938,12 +940,13 @@ static int nilfs_btree_prepare_insert(struct nilfs_bmap *btree,
938 if (ret < 0) 940 if (ret < 0)
939 goto err_out_data; 941 goto err_out_data;
940 942
943 ncmax = NILFS_BTREE_NODE_NCHILDREN_MAX(nilfs_btree_node_size(btree));
944
941 for (level = NILFS_BTREE_LEVEL_NODE_MIN; 945 for (level = NILFS_BTREE_LEVEL_NODE_MIN;
942 level < nilfs_btree_height(btree) - 1; 946 level < nilfs_btree_height(btree) - 1;
943 level++) { 947 level++) {
944 node = nilfs_btree_get_nonroot_node(path, level); 948 node = nilfs_btree_get_nonroot_node(path, level);
945 if (nilfs_btree_node_get_nchildren(node) < 949 if (nilfs_btree_node_get_nchildren(node) < ncmax) {
946 nilfs_btree_node_nchildren_max(node, btree)) {
947 path[level].bp_op = nilfs_btree_do_insert; 950 path[level].bp_op = nilfs_btree_do_insert;
948 stats->bs_nblocks++; 951 stats->bs_nblocks++;
949 goto out; 952 goto out;
@@ -960,8 +963,7 @@ static int nilfs_btree_prepare_insert(struct nilfs_bmap *btree,
960 if (ret < 0) 963 if (ret < 0)
961 goto err_out_child_node; 964 goto err_out_child_node;
962 sib = (struct nilfs_btree_node *)bh->b_data; 965 sib = (struct nilfs_btree_node *)bh->b_data;
963 if (nilfs_btree_node_get_nchildren(sib) < 966 if (nilfs_btree_node_get_nchildren(sib) < ncmax) {
964 nilfs_btree_node_nchildren_max(sib, btree)) {
965 path[level].bp_sib_bh = bh; 967 path[level].bp_sib_bh = bh;
966 path[level].bp_op = nilfs_btree_carry_left; 968 path[level].bp_op = nilfs_btree_carry_left;
967 stats->bs_nblocks++; 969 stats->bs_nblocks++;
@@ -979,8 +981,7 @@ static int nilfs_btree_prepare_insert(struct nilfs_bmap *btree,
979 if (ret < 0) 981 if (ret < 0)
980 goto err_out_child_node; 982 goto err_out_child_node;
981 sib = (struct nilfs_btree_node *)bh->b_data; 983 sib = (struct nilfs_btree_node *)bh->b_data;
982 if (nilfs_btree_node_get_nchildren(sib) < 984 if (nilfs_btree_node_get_nchildren(sib) < ncmax) {
983 nilfs_btree_node_nchildren_max(sib, btree)) {
984 path[level].bp_sib_bh = bh; 985 path[level].bp_sib_bh = bh;
985 path[level].bp_op = nilfs_btree_carry_right; 986 path[level].bp_op = nilfs_btree_carry_right;
986 stats->bs_nblocks++; 987 stats->bs_nblocks++;
@@ -1014,7 +1015,7 @@ static int nilfs_btree_prepare_insert(struct nilfs_bmap *btree,
1014 /* root */ 1015 /* root */
1015 node = nilfs_btree_get_root(btree); 1016 node = nilfs_btree_get_root(btree);
1016 if (nilfs_btree_node_get_nchildren(node) < 1017 if (nilfs_btree_node_get_nchildren(node) <
1017 nilfs_btree_node_nchildren_max(node, btree)) { 1018 NILFS_BTREE_ROOT_NCHILDREN_MAX) {
1018 path[level].bp_op = nilfs_btree_do_insert; 1019 path[level].bp_op = nilfs_btree_do_insert;
1019 stats->bs_nblocks++; 1020 stats->bs_nblocks++;
1020 goto out; 1021 goto out;
@@ -1281,10 +1282,12 @@ static int nilfs_btree_prepare_delete(struct nilfs_bmap *btree,
1281 struct buffer_head *bh; 1282 struct buffer_head *bh;
1282 struct nilfs_btree_node *node, *parent, *sib; 1283 struct nilfs_btree_node *node, *parent, *sib;
1283 __u64 sibptr; 1284 __u64 sibptr;
1284 int pindex, level, ret; 1285 int pindex, level, ncmin, ret;
1285 1286
1286 ret = 0; 1287 ret = 0;
1287 stats->bs_nblocks = 0; 1288 stats->bs_nblocks = 0;
1289 ncmin = NILFS_BTREE_NODE_NCHILDREN_MIN(nilfs_btree_node_size(btree));
1290
1288 for (level = NILFS_BTREE_LEVEL_NODE_MIN; 1291 for (level = NILFS_BTREE_LEVEL_NODE_MIN;
1289 level < nilfs_btree_height(btree) - 1; 1292 level < nilfs_btree_height(btree) - 1;
1290 level++) { 1293 level++) {
@@ -1297,8 +1300,7 @@ static int nilfs_btree_prepare_delete(struct nilfs_bmap *btree,
1297 if (ret < 0) 1300 if (ret < 0)
1298 goto err_out_child_node; 1301 goto err_out_child_node;
1299 1302
1300 if (nilfs_btree_node_get_nchildren(node) > 1303 if (nilfs_btree_node_get_nchildren(node) > ncmin) {
1301 nilfs_btree_node_nchildren_min(node, btree)) {
1302 path[level].bp_op = nilfs_btree_do_delete; 1304 path[level].bp_op = nilfs_btree_do_delete;
1303 stats->bs_nblocks++; 1305 stats->bs_nblocks++;
1304 goto out; 1306 goto out;
@@ -1315,8 +1317,7 @@ static int nilfs_btree_prepare_delete(struct nilfs_bmap *btree,
1315 if (ret < 0) 1317 if (ret < 0)
1316 goto err_out_curr_node; 1318 goto err_out_curr_node;
1317 sib = (struct nilfs_btree_node *)bh->b_data; 1319 sib = (struct nilfs_btree_node *)bh->b_data;
1318 if (nilfs_btree_node_get_nchildren(sib) > 1320 if (nilfs_btree_node_get_nchildren(sib) > ncmin) {
1319 nilfs_btree_node_nchildren_min(sib, btree)) {
1320 path[level].bp_sib_bh = bh; 1321 path[level].bp_sib_bh = bh;
1321 path[level].bp_op = nilfs_btree_borrow_left; 1322 path[level].bp_op = nilfs_btree_borrow_left;
1322 stats->bs_nblocks++; 1323 stats->bs_nblocks++;
@@ -1336,8 +1337,7 @@ static int nilfs_btree_prepare_delete(struct nilfs_bmap *btree,
1336 if (ret < 0) 1337 if (ret < 0)
1337 goto err_out_curr_node; 1338 goto err_out_curr_node;
1338 sib = (struct nilfs_btree_node *)bh->b_data; 1339 sib = (struct nilfs_btree_node *)bh->b_data;
1339 if (nilfs_btree_node_get_nchildren(sib) > 1340 if (nilfs_btree_node_get_nchildren(sib) > ncmin) {
1340 nilfs_btree_node_nchildren_min(sib, btree)) {
1341 path[level].bp_sib_bh = bh; 1341 path[level].bp_sib_bh = bh;
1342 path[level].bp_op = nilfs_btree_borrow_right; 1342 path[level].bp_op = nilfs_btree_borrow_right;
1343 stats->bs_nblocks++; 1343 stats->bs_nblocks++;