Skip to content

Commit

Permalink
nilfs2: fix missing block address termination in btree node shrinking
Browse files Browse the repository at this point in the history
nilfs_btree_delete function does not terminate part of virtual block
addresses when shrinking the last remaining child node into the root
node.  The missing address termination causes that dead btree node
blocks persist and chip away free disk space.

This fixes the leak bug on the btree node deletion.

Signed-off-by: Ryusuke Konishi <[email protected]>
  • Loading branch information
konis committed Jun 11, 2011
1 parent fe744fd commit d409905
Showing 1 changed file with 14 additions and 7 deletions.
21 changes: 14 additions & 7 deletions fs/nilfs2/btree.c
Original file line number Diff line number Diff line change
Expand Up @@ -1346,6 +1346,11 @@ static void nilfs_btree_shrink(struct nilfs_bmap *btree,
path[level].bp_bh = NULL;
}

static void nilfs_btree_nop(struct nilfs_bmap *btree,
struct nilfs_btree_path *path,
int level, __u64 *keyp, __u64 *ptrp)
{
}

static int nilfs_btree_prepare_delete(struct nilfs_bmap *btree,
struct nilfs_btree_path *path,
Expand Down Expand Up @@ -1439,16 +1444,22 @@ static int nilfs_btree_prepare_delete(struct nilfs_bmap *btree,
NILFS_BTREE_ROOT_NCHILDREN_MAX) {
path[level].bp_op = nilfs_btree_shrink;
stats->bs_nblocks += 2;
level++;
path[level].bp_op = nilfs_btree_nop;
goto shrink_root_child;
} else {
path[level].bp_op = nilfs_btree_do_delete;
stats->bs_nblocks++;
goto out;
}

goto out;

}
}

/* child of the root node is deleted */
path[level].bp_op = nilfs_btree_do_delete;
stats->bs_nblocks++;

shrink_root_child:
node = nilfs_btree_get_root(btree);
path[level].bp_oldreq.bpr_ptr =
nilfs_btree_node_get_ptr(node, dindex,
Expand All @@ -1458,10 +1469,6 @@ static int nilfs_btree_prepare_delete(struct nilfs_bmap *btree,
if (ret < 0)
goto err_out_child_node;

/* child of the root node is deleted */
path[level].bp_op = nilfs_btree_do_delete;
stats->bs_nblocks++;

/* success */
out:
*levelp = level;
Expand Down

0 comments on commit d409905

Please sign in to comment.