}
 
 struct reserve_ticket {
+       u64 orig_bytes;
        u64 bytes;
        int error;
        struct list_head list;
                !test_bit(BTRFS_FS_STATE_REMOUNTING, &fs_info->fs_state));
 }
 
-static void wake_all_tickets(struct list_head *head)
+static bool wake_all_tickets(struct list_head *head)
 {
        struct reserve_ticket *ticket;
 
                list_del_init(&ticket->list);
                ticket->error = -ENOSPC;
                wake_up(&ticket->wait);
+               if (ticket->bytes != ticket->orig_bytes)
+                       return true;
        }
+       return false;
 }
 
 /*
                if (flush_state > COMMIT_TRANS) {
                        commit_cycles++;
                        if (commit_cycles > 2) {
-                               wake_all_tickets(&space_info->tickets);
-                               space_info->flush = 0;
+                               if (wake_all_tickets(&space_info->tickets)) {
+                                       flush_state = FLUSH_DELAYED_ITEMS_NR;
+                                       commit_cycles--;
+                               } else {
+                                       space_info->flush = 0;
+                               }
                        } else {
                                flush_state = FLUSH_DELAYED_ITEMS_NR;
                        }
 
 static int wait_reserve_ticket(struct btrfs_fs_info *fs_info,
                               struct btrfs_space_info *space_info,
-                              struct reserve_ticket *ticket, u64 orig_bytes)
+                              struct reserve_ticket *ticket)
 
 {
        DEFINE_WAIT(wait);
+       u64 reclaim_bytes = 0;
        int ret = 0;
 
        spin_lock(&space_info->lock);
                ret = ticket->error;
        if (!list_empty(&ticket->list))
                list_del_init(&ticket->list);
-       if (ticket->bytes && ticket->bytes < orig_bytes) {
-               u64 num_bytes = orig_bytes - ticket->bytes;
-               update_bytes_may_use(space_info, -num_bytes);
-               trace_btrfs_space_reservation(fs_info, "space_info",
-                                             space_info->flags, num_bytes, 0);
-       }
+       if (ticket->bytes && ticket->bytes < ticket->orig_bytes)
+               reclaim_bytes = ticket->orig_bytes - ticket->bytes;
        spin_unlock(&space_info->lock);
 
+       if (reclaim_bytes)
+               space_info_add_old_bytes(fs_info, space_info, reclaim_bytes);
        return ret;
 }
 
 {
        struct reserve_ticket ticket;
        u64 used;
+       u64 reclaim_bytes = 0;
        int ret = 0;
 
        ASSERT(orig_bytes);
         * the list and we will do our own flushing further down.
         */
        if (ret && flush != BTRFS_RESERVE_NO_FLUSH) {
+               ticket.orig_bytes = orig_bytes;
                ticket.bytes = orig_bytes;
                ticket.error = 0;
                init_waitqueue_head(&ticket.wait);
                return ret;
 
        if (flush == BTRFS_RESERVE_FLUSH_ALL)
-               return wait_reserve_ticket(fs_info, space_info, &ticket,
-                                          orig_bytes);
+               return wait_reserve_ticket(fs_info, space_info, &ticket);
 
        ret = 0;
        priority_reclaim_metadata_space(fs_info, space_info, &ticket);
        spin_lock(&space_info->lock);
        if (ticket.bytes) {
-               if (ticket.bytes < orig_bytes) {
-                       u64 num_bytes = orig_bytes - ticket.bytes;
-                       update_bytes_may_use(space_info, -num_bytes);
-                       trace_btrfs_space_reservation(fs_info, "space_info",
-                                                     space_info->flags,
-                                                     num_bytes, 0);
-
-               }
+               if (ticket.bytes < orig_bytes)
+                       reclaim_bytes = orig_bytes - ticket.bytes;
                list_del_init(&ticket.list);
                ret = -ENOSPC;
        }
        spin_unlock(&space_info->lock);
+
+       if (reclaim_bytes)
+               space_info_add_old_bytes(fs_info, space_info, reclaim_bytes);
        ASSERT(list_empty(&ticket.list));
        return ret;
 }