On 4/14/25 10:19 PM, Mikulas Patocka wrote:
> 
> 
> On Fri, 11 Apr 2025, Damien Le Moal wrote:
> 
>> When a dm-delay device is being suspended, the .presuspend() operation
>> is first executed (delay_presuspend()) to immediately issue all the BIOs
>> present in the delayed list of the device and also sets the device
>> may_delay boolean to false. At the same time, if any new BIO is issued
>> to the device will not be delayed and immediately issued with
>> delay_bio() returning DM_MAPIO_REMAPPED. This creates a situation where
>> potentially 2 different contexts may be issuing write BIOs to the same
>> zone of a zone device without respecting the issuing order from the
>> user, that is, a newly issued write BIO may be issued before other write
>> BIOs for the same target zone that are in the device delayed list. If
>> such situation occurs, write BIOs may be failed by the underlying zoned
>> device due to an unaligned write error.
>>
>> Prevent this situation from happening by always handling newly issued
>> write BIOs using the delayed list of BIOs, even when the device is being
>> suspended. This is done by forcing the use of the worker kthread for
>> zoned devices, and by modifying flush_worker_fn() to always flush all
>> delayed BIOs if the device may_delay boolean is false.
>>
>> Reported-by: Benjamin Marzinski <bmarz...@redhat.com>
>> Fixes: d43929ef65a6 ("dm-delay: support zoned devices")
>> Signed-off-by: Damien Le Moal <dlem...@kernel.org>
>> ---
>> Changes from v1:
>>  - Fixed typo in commit message
>>  - Added reported-by tag
>>
>>  drivers/md/dm-delay.c | 29 +++++++++++++++++++++--------
>>  1 file changed, 21 insertions(+), 8 deletions(-)
> 
> Hi
> 
> I looked at the generic device mapper code and it seems that ordering of 
> write bios is not guaranteed with any target in case of suspend/resume.
> 
> * we suspend the device:
> * received bios are added to md->deferred in queue_io
> 
> * we resume the device:
> * __dm_resume calls dm_queue_flush
> * dm_queue_flush clears DMF_BLOCK_IO_FOR_SUSPEND and submits work item 
>   &md->work (dm_wq_work)
> * dm_resume clears DMF_SUSPENDED
> * the device starts accepting new bios in dm_submit_bio
> * dm_wq_work runs concurrently with new bios that are received, so 
>   ordering of bios is not preserved
> 
> So it doesn't make much sense to try to fix it in dm-delay, if it isn't 
> supposed to work at all.

Just need to fix the generic DM resume code then. This patch fixing dm-delay is
still relevant even with DM generic resume fixes.

I can resend the dm-delay fix together with DM core resume fixes. And Benjamin
can re-send the dm-delay kthread timer cleanup independently (I will rebase) or
on top of that fix series. Does that work for you ?

> 
> Mikulas
> 


-- 
Damien Le Moal
Western Digital Research

Reply via email to