diff options
Diffstat (limited to 'fs/btrfs/extent-tree.c')
-rw-r--r-- | fs/btrfs/extent-tree.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index cf3460e9b122..5e81e3694d92 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
@@ -9513,10 +9513,18 @@ void btrfs_delete_unused_bgs(struct btrfs_fs_info *fs_info) | |||
9513 | */ | 9513 | */ |
9514 | start = block_group->key.objectid; | 9514 | start = block_group->key.objectid; |
9515 | end = start + block_group->key.offset - 1; | 9515 | end = start + block_group->key.offset - 1; |
9516 | clear_extent_bits(&fs_info->freed_extents[0], start, end, | 9516 | ret = clear_extent_bits(&fs_info->freed_extents[0], start, end, |
9517 | EXTENT_DIRTY, GFP_NOFS); | 9517 | EXTENT_DIRTY, GFP_NOFS); |
9518 | clear_extent_bits(&fs_info->freed_extents[1], start, end, | 9518 | if (ret) { |
9519 | btrfs_set_block_group_rw(root, block_group); | ||
9520 | goto end_trans; | ||
9521 | } | ||
9522 | ret = clear_extent_bits(&fs_info->freed_extents[1], start, end, | ||
9519 | EXTENT_DIRTY, GFP_NOFS); | 9523 | EXTENT_DIRTY, GFP_NOFS); |
9524 | if (ret) { | ||
9525 | btrfs_set_block_group_rw(root, block_group); | ||
9526 | goto end_trans; | ||
9527 | } | ||
9520 | 9528 | ||
9521 | /* Reset pinned so btrfs_put_block_group doesn't complain */ | 9529 | /* Reset pinned so btrfs_put_block_group doesn't complain */ |
9522 | block_group->pinned = 0; | 9530 | block_group->pinned = 0; |
@@ -9527,6 +9535,7 @@ void btrfs_delete_unused_bgs(struct btrfs_fs_info *fs_info) | |||
9527 | */ | 9535 | */ |
9528 | ret = btrfs_remove_chunk(trans, root, | 9536 | ret = btrfs_remove_chunk(trans, root, |
9529 | block_group->key.objectid); | 9537 | block_group->key.objectid); |
9538 | end_trans: | ||
9530 | btrfs_end_transaction(trans, root); | 9539 | btrfs_end_transaction(trans, root); |
9531 | next: | 9540 | next: |
9532 | btrfs_put_block_group(block_group); | 9541 | btrfs_put_block_group(block_group); |