spin_lock(&space_info->lock);
spin_lock(&block_group->lock);
+
+ if (btrfs_is_zoned(fs_info) && btrfs_is_block_group_used(block_group) &&
+ block_group->zone_unusable >= div_u64(block_group->length, 2)) {
+ /*
+ * If the block group has data left, but at least half
+ * of the block group is zone_unusable, mark it as
+ * reclaimable before continuing with the next block group.
+ */
+
+ spin_unlock(&block_group->lock);
+ spin_unlock(&space_info->lock);
+ up_write(&space_info->groups_sem);
+
+ btrfs_mark_bg_to_reclaim(block_group);
+
+ goto next;
+ }
+
if (btrfs_is_block_group_used(block_group) ||
(block_group->ro && !(block_group->flags & BTRFS_BLOCK_GROUP_REMAPPED)) ||
list_is_singular(&block_group->list) ||