diff options
-rw-r--r-- | fs/btrfs/extent-tree.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 98ee139885cc..7af618dcf2c0 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
@@ -3589,8 +3589,20 @@ void block_rsv_release_bytes(struct btrfs_block_rsv *block_rsv, | |||
3589 | 3589 | ||
3590 | if (num_bytes > 0) { | 3590 | if (num_bytes > 0) { |
3591 | if (dest) { | 3591 | if (dest) { |
3592 | block_rsv_add_bytes(dest, num_bytes, 0); | 3592 | spin_lock(&dest->lock); |
3593 | } else { | 3593 | if (!dest->full) { |
3594 | u64 bytes_to_add; | ||
3595 | |||
3596 | bytes_to_add = dest->size - dest->reserved; | ||
3597 | bytes_to_add = min(num_bytes, bytes_to_add); | ||
3598 | dest->reserved += bytes_to_add; | ||
3599 | if (dest->reserved >= dest->size) | ||
3600 | dest->full = 1; | ||
3601 | num_bytes -= bytes_to_add; | ||
3602 | } | ||
3603 | spin_unlock(&dest->lock); | ||
3604 | } | ||
3605 | if (num_bytes) { | ||
3594 | spin_lock(&space_info->lock); | 3606 | spin_lock(&space_info->lock); |
3595 | space_info->bytes_reserved -= num_bytes; | 3607 | space_info->bytes_reserved -= num_bytes; |
3596 | spin_unlock(&space_info->lock); | 3608 | spin_unlock(&space_info->lock); |