|
@@ -3589,8 +3589,20 @@ void block_rsv_release_bytes(struct btrfs_block_rsv *block_rsv,
|
|
|
|
|
|
if (num_bytes > 0) {
|
|
|
if (dest) {
|
|
|
- block_rsv_add_bytes(dest, num_bytes, 0);
|
|
|
- } else {
|
|
|
+ spin_lock(&dest->lock);
|
|
|
+ if (!dest->full) {
|
|
|
+ u64 bytes_to_add;
|
|
|
+
|
|
|
+ bytes_to_add = dest->size - dest->reserved;
|
|
|
+ bytes_to_add = min(num_bytes, bytes_to_add);
|
|
|
+ dest->reserved += bytes_to_add;
|
|
|
+ if (dest->reserved >= dest->size)
|
|
|
+ dest->full = 1;
|
|
|
+ num_bytes -= bytes_to_add;
|
|
|
+ }
|
|
|
+ spin_unlock(&dest->lock);
|
|
|
+ }
|
|
|
+ if (num_bytes) {
|
|
|
spin_lock(&space_info->lock);
|
|
|
space_info->bytes_reserved -= num_bytes;
|
|
|
spin_unlock(&space_info->lock);
|