{
        struct reserve_ticket *ticket = NULL;
        struct btrfs_block_rsv *delayed_rsv = &fs_info->delayed_block_rsv;
+       struct btrfs_block_rsv *delayed_refs_rsv = &fs_info->delayed_refs_rsv;
        struct btrfs_trans_handle *trans;
-       u64 bytes;
+       u64 bytes_needed;
+       u64 reclaim_bytes = 0;
 
        trans = (struct btrfs_trans_handle *)current->journal_info;
        if (trans)
        else if (!list_empty(&space_info->tickets))
                ticket = list_first_entry(&space_info->tickets,
                                          struct reserve_ticket, list);
-       bytes = (ticket) ? ticket->bytes : 0;
+       bytes_needed = (ticket) ? ticket->bytes : 0;
        spin_unlock(&space_info->lock);
 
-       if (!bytes)
+       if (!bytes_needed)
                return 0;
 
        /* See if there is enough pinned space to make this reservation */
        if (__percpu_counter_compare(&space_info->total_bytes_pinned,
-                                  bytes,
+                                  bytes_needed,
                                   BTRFS_TOTAL_BYTES_PINNED_BATCH) >= 0)
                goto commit;
 
                return -ENOSPC;
 
        spin_lock(&delayed_rsv->lock);
-       if (delayed_rsv->size > bytes)
-               bytes = 0;
-       else
-               bytes -= delayed_rsv->size;
+       reclaim_bytes += delayed_rsv->reserved;
        spin_unlock(&delayed_rsv->lock);
 
+       spin_lock(&delayed_refs_rsv->lock);
+       reclaim_bytes += delayed_refs_rsv->reserved;
+       spin_unlock(&delayed_refs_rsv->lock);
+       if (reclaim_bytes >= bytes_needed)
+               goto commit;
+       bytes_needed -= reclaim_bytes;
+
        if (__percpu_counter_compare(&space_info->total_bytes_pinned,
-                                  bytes,
+                                  bytes_needed,
                                   BTRFS_TOTAL_BYTES_PINNED_BATCH) < 0) {
                return -ENOSPC;
        }