On 5/7/25 5:34 PM, Ming Lei wrote: > 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); What in case blk_unregister_queue/elevator_set_none is called from __add_disk ? The __add_disk and elv_iosched_store may run concurrently. So I think we should remove sysfs entries (i.e. delete disk->queue_kobj) before calling elevator_set_none() from blk_unregister_queue(). Thanks, --Nilay