{
        struct reserve_ticket *ticket;
        u64 tickets_id = space_info->tickets_id;
+       const bool aborted = BTRFS_FS_ERROR(fs_info);
 
        trace_btrfs_fail_all_tickets(fs_info, space_info);
 
                ticket = list_first_entry(&space_info->tickets,
                                          struct reserve_ticket, list);
 
-               if (ticket->steal &&
+               if (!aborted && ticket->steal &&
                    steal_from_global_rsv(fs_info, space_info, ticket))
                        return true;
 
-               if (btrfs_test_opt(fs_info, ENOSPC_DEBUG))
+               if (!aborted && btrfs_test_opt(fs_info, ENOSPC_DEBUG))
                        btrfs_info(fs_info, "failing ticket with %llu bytes",
                                   ticket->bytes);
 
                remove_ticket(space_info, ticket);
-               ticket->error = -ENOSPC;
+               if (aborted)
+                       ticket->error = -EIO;
+               else
+                       ticket->error = -ENOSPC;
                wake_up(&ticket->wait);
 
                /*
                 * here to see if we can make progress with the next ticket in
                 * the list.
                 */
-               btrfs_try_granting_tickets(fs_info, space_info);
+               if (!aborted)
+                       btrfs_try_granting_tickets(fs_info, space_info);
        }
        return (tickets_id != space_info->tickets_id);
 }
                        spin_unlock(&space_info->lock);
                        return;
                }
+
+               /* Something happened, fail everything and bail. */
+               if (BTRFS_FS_ERROR(fs_info))
+                       goto aborted_fs;
                last_tickets_id = space_info->tickets_id;
                spin_unlock(&space_info->lock);
        }
                        } else {
                                flush_state = 0;
                        }
+
+                       /* Something happened, fail everything and bail. */
+                       if (BTRFS_FS_ERROR(fs_info))
+                               goto aborted_fs;
+
                }
                spin_unlock(&space_info->lock);
        }
+       return;
+
+aborted_fs:
+       maybe_fail_all_tickets(fs_info, space_info);
+       space_info->flush = 0;
+       spin_unlock(&space_info->lock);
 }
 
 void btrfs_init_async_reclaim_work(struct btrfs_fs_info *fs_info)