elevator_set_none() is called when deleting disk, in which queue has been un-registered, and elevator switch can't happen any more. So if q->elevator is NULL, it is not necessary to freeze queue and drain IO any more. Signed-off-by: Ming Lei <ming.lei@xxxxxxxxxx> --- block/elevator.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/block/elevator.c b/block/elevator.c index e1386b84a415..35f4de749dcd 100644 --- a/block/elevator.c +++ b/block/elevator.c @@ -754,8 +754,18 @@ void elevator_set_none(struct request_queue *q) .name = "none", .quiesce_queue = true, }; + bool need_change; int err; + WARN_ON_ONCE(blk_queue_registered(q)); + + /* queue has been unregisted, elevator can't be switched anymore */ + mutex_lock(&q->elevator_lock); + need_change = !!q->elevator; + mutex_unlock(&q->elevator_lock); + if (!need_change) + return; + err = elevator_change(q, &ctx); if (err < 0) pr_warn("%s: set none elevator failed %d\n", __func__, err); -- 2.47.0