When dmz_do_reclaim() fails with -ENOSPC because no free zone is available to copy the data into, dmz_reclaim_work() still ends with dmz_schedule_reclaim(). If the target is idle, dmz_should_reclaim() keeps returning true, the work is queued again with no delay and the worker spins on the same failing pass.
Re-arm the idle poll instead, so that reclaim is retried after DMZ_IDLE_PERIOD. The next patch makes -ENOSPC the expected result when an idle target has random zones but no free sequential zone. Tested on a 7.2.6 kernel as an out-of-tree dm-zoned module, together with the next two patches, on emulated host-managed drives (tcmu-runner ZBC handler) and on three 27 TB host-managed drives used as md RAID5 members. Assisted-by: LLM Signed-off-by: illofspeed <[email protected]> --- drivers/md/dm-zoned-reclaim.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/md/dm-zoned-reclaim.c b/drivers/md/dm-zoned-reclaim.c index c041413c729..315f0da99f3 100644 --- a/drivers/md/dm-zoned-reclaim.c +++ b/drivers/md/dm-zoned-reclaim.c @@ -540,6 +540,14 @@ static void dmz_reclaim_work(struct work_struct *work) if (ret && ret != -EINTR) { if (!dmz_check_dev(zmd)) return; + if (ret == -ENOSPC) { + /* + * No zone to copy into: nothing can progress now. + * Rescheduling immediately would spin; poll instead. + */ + mod_delayed_work(zrc->wq, &zrc->work, DMZ_IDLE_PERIOD); + return; + } } dmz_schedule_reclaim(zrc); -- 2.43.0

