diff options
-rw-r--r-- | fs/nilfs2/btree.c | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/fs/nilfs2/btree.c b/fs/nilfs2/btree.c index 7eafe468a29c..fd4f05b91942 100644 --- a/fs/nilfs2/btree.c +++ b/fs/nilfs2/btree.c | |||
@@ -1356,20 +1356,19 @@ static int nilfs_btree_prepare_delete(struct nilfs_bmap *btree, | |||
1356 | struct buffer_head *bh; | 1356 | struct buffer_head *bh; |
1357 | struct nilfs_btree_node *node, *parent, *sib; | 1357 | struct nilfs_btree_node *node, *parent, *sib; |
1358 | __u64 sibptr; | 1358 | __u64 sibptr; |
1359 | int pindex, level, ncmin, ncmax, ncblk, ret; | 1359 | int pindex, dindex, level, ncmin, ncmax, ncblk, ret; |
1360 | 1360 | ||
1361 | ret = 0; | 1361 | ret = 0; |
1362 | stats->bs_nblocks = 0; | 1362 | stats->bs_nblocks = 0; |
1363 | ncmin = NILFS_BTREE_NODE_NCHILDREN_MIN(nilfs_btree_node_size(btree)); | 1363 | ncmin = NILFS_BTREE_NODE_NCHILDREN_MIN(nilfs_btree_node_size(btree)); |
1364 | ncblk = nilfs_btree_nchildren_per_block(btree); | 1364 | ncblk = nilfs_btree_nchildren_per_block(btree); |
1365 | 1365 | ||
1366 | for (level = NILFS_BTREE_LEVEL_NODE_MIN; | 1366 | for (level = NILFS_BTREE_LEVEL_NODE_MIN, dindex = path[level].bp_index; |
1367 | level < nilfs_btree_height(btree) - 1; | 1367 | level < nilfs_btree_height(btree) - 1; |
1368 | level++) { | 1368 | level++) { |
1369 | node = nilfs_btree_get_nonroot_node(path, level); | 1369 | node = nilfs_btree_get_nonroot_node(path, level); |
1370 | path[level].bp_oldreq.bpr_ptr = | 1370 | path[level].bp_oldreq.bpr_ptr = |
1371 | nilfs_btree_node_get_ptr(node, path[level].bp_index, | 1371 | nilfs_btree_node_get_ptr(node, dindex, ncblk); |
1372 | ncblk); | ||
1373 | ret = nilfs_bmap_prepare_end_ptr(btree, | 1372 | ret = nilfs_bmap_prepare_end_ptr(btree, |
1374 | &path[level].bp_oldreq, dat); | 1373 | &path[level].bp_oldreq, dat); |
1375 | if (ret < 0) | 1374 | if (ret < 0) |
@@ -1383,6 +1382,7 @@ static int nilfs_btree_prepare_delete(struct nilfs_bmap *btree, | |||
1383 | 1382 | ||
1384 | parent = nilfs_btree_get_node(btree, path, level + 1, &ncmax); | 1383 | parent = nilfs_btree_get_node(btree, path, level + 1, &ncmax); |
1385 | pindex = path[level + 1].bp_index; | 1384 | pindex = path[level + 1].bp_index; |
1385 | dindex = pindex; | ||
1386 | 1386 | ||
1387 | if (pindex > 0) { | 1387 | if (pindex > 0) { |
1388 | /* left sibling */ | 1388 | /* left sibling */ |
@@ -1421,6 +1421,14 @@ static int nilfs_btree_prepare_delete(struct nilfs_bmap *btree, | |||
1421 | path[level].bp_sib_bh = bh; | 1421 | path[level].bp_sib_bh = bh; |
1422 | path[level].bp_op = nilfs_btree_concat_right; | 1422 | path[level].bp_op = nilfs_btree_concat_right; |
1423 | stats->bs_nblocks++; | 1423 | stats->bs_nblocks++; |
1424 | /* | ||
1425 | * When merging right sibling node | ||
1426 | * into the current node, pointer to | ||
1427 | * the right sibling node must be | ||
1428 | * terminated instead. The adjustment | ||
1429 | * below is required for that. | ||
1430 | */ | ||
1431 | dindex = pindex + 1; | ||
1424 | /* continue; */ | 1432 | /* continue; */ |
1425 | } | 1433 | } |
1426 | } else { | 1434 | } else { |
@@ -1443,7 +1451,7 @@ static int nilfs_btree_prepare_delete(struct nilfs_bmap *btree, | |||
1443 | 1451 | ||
1444 | node = nilfs_btree_get_root(btree); | 1452 | node = nilfs_btree_get_root(btree); |
1445 | path[level].bp_oldreq.bpr_ptr = | 1453 | path[level].bp_oldreq.bpr_ptr = |
1446 | nilfs_btree_node_get_ptr(node, path[level].bp_index, | 1454 | nilfs_btree_node_get_ptr(node, dindex, |
1447 | NILFS_BTREE_ROOT_NCHILDREN_MAX); | 1455 | NILFS_BTREE_ROOT_NCHILDREN_MAX); |
1448 | 1456 | ||
1449 | ret = nilfs_bmap_prepare_end_ptr(btree, &path[level].bp_oldreq, dat); | 1457 | ret = nilfs_bmap_prepare_end_ptr(btree, &path[level].bp_oldreq, dat); |