diff options
Diffstat (limited to 'fs/btrfs/extent-tree.c')
-rw-r--r-- | fs/btrfs/extent-tree.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 486ddc4c436d..a457776c3e41 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
@@ -4680,12 +4680,18 @@ u64 __btrfs_block_rsv_release(struct btrfs_fs_info *fs_info, | |||
4680 | { | 4680 | { |
4681 | struct btrfs_block_rsv *global_rsv = &fs_info->global_block_rsv; | 4681 | struct btrfs_block_rsv *global_rsv = &fs_info->global_block_rsv; |
4682 | struct btrfs_block_rsv *delayed_rsv = &fs_info->delayed_refs_rsv; | 4682 | struct btrfs_block_rsv *delayed_rsv = &fs_info->delayed_refs_rsv; |
4683 | struct btrfs_block_rsv *target = delayed_rsv; | 4683 | struct btrfs_block_rsv *target = NULL; |
4684 | 4684 | ||
4685 | if (target->full || target == block_rsv) | 4685 | /* |
4686 | * If we are the delayed_rsv then push to the global rsv, otherwise dump | ||
4687 | * into the delayed rsv if it is not full. | ||
4688 | */ | ||
4689 | if (block_rsv == delayed_rsv) | ||
4686 | target = global_rsv; | 4690 | target = global_rsv; |
4691 | else if (block_rsv != global_rsv && !delayed_rsv->full) | ||
4692 | target = delayed_rsv; | ||
4687 | 4693 | ||
4688 | if (block_rsv->space_info != target->space_info) | 4694 | if (target && block_rsv->space_info != target->space_info) |
4689 | target = NULL; | 4695 | target = NULL; |
4690 | 4696 | ||
4691 | return block_rsv_release_bytes(fs_info, block_rsv, target, num_bytes, | 4697 | return block_rsv_release_bytes(fs_info, block_rsv, target, num_bytes, |