On Sun, Jun 30, 2024 at 09:56:36PM +0800, Ming Lei wrote: > I meant that the following one-line patch may address your issue: > > > diff --git a/drivers/block/ublk_drv.c b/drivers/block/ublk_drv.c > index 4e159948c912..a89240f4f7b0 100644 > --- a/drivers/block/ublk_drv.c > +++ b/drivers/block/ublk_drv.c > @@ -1068,7 +1068,7 @@ static inline void __ublk_abort_rq(struct ublk_queue *ubq, > struct request *rq) > { > /* We cannot process this rq so just requeue it. */ > - if (ublk_queue_can_use_recovery(ubq)) > + if (ublk_queue_can_use_recovery_reissue(ubq)) > blk_mq_requeue_request(rq, false); > else > blk_mq_end_request(rq, BLK_STS_IOERR); It does not work (ran the same test from my previous email, got the same results), and how could it? As I've already mentioned several times, the root of the issue is that when UBLK_F_USER_RECOVERY is set, the request queue remains quiesced when the server has exited. Quiescing the queue means that the block layer will not call the driver's queue_rq when I/Os are submitted. Instead the block layer will queue those I/Os internally, only submitting them to the driver when the queue is unquiesced, which, in the current ublk_drv, only happens when the device is recovered or deleted. Having ublk_drv return errors to I/Os issued while there is no ublk server requires the queue to be unquiesced. My patchset actually does this (see patch 4/4).