diff options
Diffstat (limited to 'fs/btrfs/extent-tree.c')
-rw-r--r-- | fs/btrfs/extent-tree.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index ba7042e2390b..17b052ae4653 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
@@ -9514,19 +9514,25 @@ int btrfs_remove_block_group(struct btrfs_trans_handle *trans, | |||
9514 | list_move_tail(&em->list, &root->fs_info->pinned_chunks); | 9514 | list_move_tail(&em->list, &root->fs_info->pinned_chunks); |
9515 | } | 9515 | } |
9516 | spin_unlock(&block_group->lock); | 9516 | spin_unlock(&block_group->lock); |
9517 | unlock_chunks(root); | ||
9518 | 9517 | ||
9519 | if (remove_em) { | 9518 | if (remove_em) { |
9520 | struct extent_map_tree *em_tree; | 9519 | struct extent_map_tree *em_tree; |
9521 | 9520 | ||
9522 | em_tree = &root->fs_info->mapping_tree.map_tree; | 9521 | em_tree = &root->fs_info->mapping_tree.map_tree; |
9523 | write_lock(&em_tree->lock); | 9522 | write_lock(&em_tree->lock); |
9523 | /* | ||
9524 | * The em might be in the pending_chunks list, so make sure the | ||
9525 | * chunk mutex is locked, since remove_extent_mapping() will | ||
9526 | * delete us from that list. | ||
9527 | */ | ||
9524 | remove_extent_mapping(em_tree, em); | 9528 | remove_extent_mapping(em_tree, em); |
9525 | write_unlock(&em_tree->lock); | 9529 | write_unlock(&em_tree->lock); |
9526 | /* once for the tree */ | 9530 | /* once for the tree */ |
9527 | free_extent_map(em); | 9531 | free_extent_map(em); |
9528 | } | 9532 | } |
9529 | 9533 | ||
9534 | unlock_chunks(root); | ||
9535 | |||
9530 | btrfs_put_block_group(block_group); | 9536 | btrfs_put_block_group(block_group); |
9531 | btrfs_put_block_group(block_group); | 9537 | btrfs_put_block_group(block_group); |
9532 | 9538 | ||