}
 
 static int btrfs_need_do_async_reclaim(struct btrfs_space_info *space_info,
-                                      struct btrfs_fs_info *fs_info)
+                                      struct btrfs_fs_info *fs_info,
+                                      int flush_state)
 {
        u64 used;
 
        spin_lock(&space_info->lock);
+       /*
+        * We run out of space and have not got any free space via flush_space,
+        * so don't bother doing async reclaim.
+        */
+       if (flush_state > COMMIT_TRANS && space_info->full) {
+               spin_unlock(&space_info->lock);
+               return 0;
+       }
+
        used = space_info->bytes_used + space_info->bytes_reserved +
               space_info->bytes_pinned + space_info->bytes_readonly +
               space_info->bytes_may_use;
                flush_space(fs_info->fs_root, space_info, to_reclaim,
                            to_reclaim, flush_state);
                flush_state++;
-               if (!btrfs_need_do_async_reclaim(space_info, fs_info))
+               if (!btrfs_need_do_async_reclaim(space_info, fs_info,
+                                                flush_state))
                        return;
        } while (flush_state <= COMMIT_TRANS);
 
-       if (btrfs_need_do_async_reclaim(space_info, fs_info))
+       if (btrfs_need_do_async_reclaim(space_info, fs_info, flush_state))
                queue_work(system_unbound_wq, work);
 }