Btrfs: change btrfs_del_leaf to drop locks earlier

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>

+9 -2
+9 -2
fs/btrfs/ctree.c
··· 3630 { 3631 int ret; 3632 u64 root_gen = btrfs_header_generation(path->nodes[1]); 3633 3634 ret = del_ptr(trans, root, path, 1, path->slots[1]); 3635 if (ret) 3636 return ret; 3637 3638 ret = btrfs_free_extent(trans, root, bytenr, 3639 btrfs_level_size(root, 0), 3640 - path->nodes[1]->start, 3641 - btrfs_header_owner(path->nodes[1]), 3642 root_gen, 0, 1); 3643 return ret; 3644 }
··· 3630 { 3631 int ret; 3632 u64 root_gen = btrfs_header_generation(path->nodes[1]); 3633 + u64 parent_start = path->nodes[1]->start; 3634 + u64 parent_owner = btrfs_header_owner(path->nodes[1]); 3635 3636 ret = del_ptr(trans, root, path, 1, path->slots[1]); 3637 if (ret) 3638 return ret; 3639 3640 + /* 3641 + * btrfs_free_extent is expensive, we want to make sure we 3642 + * aren't holding any locks when we call it 3643 + */ 3644 + btrfs_unlock_up_safe(path, 0); 3645 + 3646 ret = btrfs_free_extent(trans, root, bytenr, 3647 btrfs_level_size(root, 0), 3648 + parent_start, parent_owner, 3649 root_gen, 0, 1); 3650 return ret; 3651 }