/* Indicate we have half completed snapshot deletions pending. */
        BTRFS_FS_UNFINISHED_DROPS,
 
+       /* Indicate we have to finish a zone to do next allocation. */
+       BTRFS_FS_NEED_ZONE_FINISH,
+
 #if BITS_PER_LONG == 32
        /* Indicate if we have error/warn message printed on 32bit systems */
        BTRFS_FS_32BIT_ERROR,
 
        spinlock_t zone_active_bgs_lock;
        struct list_head zone_active_bgs;
+       /* Waiters when BTRFS_FS_NEED_ZONE_FINISH is set */
+       wait_queue_head_t zone_finish_wait;
 
        /* Updates are not protected by any lock */
        struct btrfs_commit_stats commit_stats;
 
        init_waitqueue_head(&fs_info->transaction_blocked_wait);
        init_waitqueue_head(&fs_info->async_submit_wait);
        init_waitqueue_head(&fs_info->delayed_iputs_wait);
+       init_waitqueue_head(&fs_info->zone_finish_wait);
 
        /* Usable values until the real ones are cached from the superblock */
        fs_info->nodesize = 4096;
 
                if (ret == 0)
                        done_offset = end;
 
-               if (done_offset == start)
-                       return -ENOSPC;
+               if (done_offset == start) {
+                       struct btrfs_fs_info *info = inode->root->fs_info;
+
+                       wait_var_event(&info->zone_finish_wait,
+                                      !test_bit(BTRFS_FS_NEED_ZONE_FINISH, &info->flags));
+                       continue;
+               }
 
                if (!locked_page_done) {
                        __set_page_dirty_nobuffers(locked_page);
 
        /* For active_bg_list */
        btrfs_put_block_group(block_group);
 
+       clear_bit(BTRFS_FS_NEED_ZONE_FINISH, &fs_info->flags);
+       wake_up_all(&fs_info->zone_finish_wait);
+
        return 0;
 }
 
        }
        mutex_unlock(&fs_info->chunk_mutex);
 
+       if (!ret)
+               set_bit(BTRFS_FS_NEED_ZONE_FINISH, &fs_info->flags);
+
        return ret;
 }