On Mon, Dec 13, 2021 at 12:09:07PM +0800, Laibin Qiu wrote: > Submit_bio > scsi_remove_device > sd_remove > del_gendisk > blk_unregister_queue > elv_unregister_queue > wbt_enable_default > <= Set rwb->enable_state (ON) > q_qos_track > <= rwb->enable_state (ON) > ^^^^^^ this request will mark WBT_TRACKED without inflight add and will > lead to drop rqw->inflight to -1 in wbt_done() which will trigger IO hung. > > Fix this by judge whether QUEUE_FLAG_REGISTERED is marked to distinguish > scsi remove scene. > Fixes: 76a8040817b4b ("blk-wbt: make sure throttle is enabled properly") > Signed-off-by: Laibin Qiu <qiulaibin@xxxxxxxxxx> > --- > block/blk-wbt.c | 8 ++++---- > 1 file changed, 4 insertions(+), 4 deletions(-) > > diff --git a/block/blk-wbt.c b/block/blk-wbt.c > index 3ed71b8da887..537f77bb1365 100644 > --- a/block/blk-wbt.c > +++ b/block/blk-wbt.c > @@ -637,6 +637,10 @@ void wbt_enable_default(struct request_queue *q) > { > struct rq_qos *rqos = wbt_rq_qos(q); > > + /* Queue not registered? Maybe shutting down... */ > + if (!blk_queue_registered(q)) > + return; Wouldn't it make more sense to simply not call wbt_enable_default from elv_unregister_queue?