Skip to content

Commit

Permalink
Btrfs: change btrfs_del_leaf to drop locks earlier
Browse files Browse the repository at this point in the history
btrfs_del_leaf does two things.  First it removes the pointer in the
parent, and then it frees the block that has the leaf.  It has the
parent node locked for both operations.

But, it only needs the parent locked while it is deleting the pointer.
After that it can safely free the block without the parent locked.

Signed-off-by: Chris Mason <chris.mason@oracle.com>
  • Loading branch information
Chris Mason committed Feb 4, 2009
1 parent 06d9a8d commit 4d081c4
Showing 1 changed file with 9 additions and 2 deletions.
11 changes: 9 additions & 2 deletions fs/btrfs/ctree.c
Original file line number Diff line number Diff line change
Expand Up @@ -3630,15 +3630,22 @@ noinline int btrfs_del_leaf(struct btrfs_trans_handle *trans,
{
int ret;
u64 root_gen = btrfs_header_generation(path->nodes[1]);
u64 parent_start = path->nodes[1]->start;
u64 parent_owner = btrfs_header_owner(path->nodes[1]);

ret = del_ptr(trans, root, path, 1, path->slots[1]);
if (ret)
return ret;

/*
* btrfs_free_extent is expensive, we want to make sure we
* aren't holding any locks when we call it
*/
btrfs_unlock_up_safe(path, 0);

ret = btrfs_free_extent(trans, root, bytenr,
btrfs_level_size(root, 0),
path->nodes[1]->start,
btrfs_header_owner(path->nodes[1]),
parent_start, parent_owner,
root_gen, 0, 1);
return ret;
}
Expand Down

0 comments on commit 4d081c4

Please sign in to comment.