return bg1->used > bg2->used;
 }
 
+static inline bool btrfs_should_reclaim(struct btrfs_fs_info *fs_info)
+{
+       if (btrfs_is_zoned(fs_info))
+               return btrfs_zoned_should_reclaim(fs_info);
+       return true;
+}
+
 void btrfs_reclaim_bgs_work(struct work_struct *work)
 {
        struct btrfs_fs_info *fs_info =
        if (!test_bit(BTRFS_FS_OPEN, &fs_info->flags))
                return;
 
+       if (!btrfs_should_reclaim(fs_info))
+               return;
+
        sb_start_write(fs_info->sb);
 
        if (!btrfs_exclop_start(fs_info, BTRFS_EXCLOP_BALANCE)) {
 
        }
        mutex_unlock(&fs_devices->device_list_mutex);
 }
+
+bool btrfs_zoned_should_reclaim(struct btrfs_fs_info *fs_info)
+{
+       struct btrfs_fs_devices *fs_devices = fs_info->fs_devices;
+       struct btrfs_device *device;
+       u64 used = 0;
+       u64 total = 0;
+       u64 factor;
+
+       ASSERT(btrfs_is_zoned(fs_info));
+
+       if (fs_info->bg_reclaim_threshold == 0)
+               return false;
+
+       mutex_lock(&fs_devices->device_list_mutex);
+       list_for_each_entry(device, &fs_devices->devices, dev_list) {
+               if (!device->bdev)
+                       continue;
+
+               total += device->disk_total_bytes;
+               used += device->bytes_used;
+       }
+       mutex_unlock(&fs_devices->device_list_mutex);
+
+       factor = div64_u64(used * 100, total);
+       return factor >= fs_info->bg_reclaim_threshold;
+}
 
                             u64 length);
 void btrfs_clear_data_reloc_bg(struct btrfs_block_group *bg);
 void btrfs_free_zone_cache(struct btrfs_fs_info *fs_info);
+bool btrfs_zoned_should_reclaim(struct btrfs_fs_info *fs_info);
 #else /* CONFIG_BLK_DEV_ZONED */
 static inline int btrfs_get_dev_zone(struct btrfs_device *device, u64 pos,
                                     struct blk_zone *zone)
 static inline void btrfs_clear_data_reloc_bg(struct btrfs_block_group *bg) { }
 
 static inline void btrfs_free_zone_cache(struct btrfs_fs_info *fs_info) { }
+
+static inline bool btrfs_zoned_should_reclaim(struct btrfs_fs_info *fs_info)
+{
+       return false;
+}
 #endif
 
 static inline bool btrfs_dev_is_sequential(struct btrfs_device *device, u64 pos)