Not much of a point in sharing code between callers with very different expectations. Signed-off-by: Christoph Hellwig <hch@xxxxxx> --- block/elevator.c | 45 ++++++++++++++++++++------------------------- 1 file changed, 20 insertions(+), 25 deletions(-) diff --git a/block/elevator.c b/block/elevator.c index 59ff0abde920..b358858387a0 100644 --- a/block/elevator.c +++ b/block/elevator.c @@ -674,25 +674,13 @@ static int elevator_change_done(struct request_queue *q, return ret; } -/* - * Switch this queue to the given IO scheduler. - */ -static int __elevator_change(struct request_queue *q, - struct elv_change_ctx *ctx) -{ - lockdep_assert_held(&q->tag_set->update_nr_hwq_sema); - - /* Make sure queue is not in the middle of being removed */ - if (!ctx->init && !blk_queue_registered(q)) - return -ENOENT; - return elevator_switch(q, ctx); -} - static int elevator_change(struct request_queue *q, struct elv_change_ctx *ctx) { unsigned int memflags; - int ret = 0; + int ret; + + lockdep_assert_held(&q->tag_set->update_nr_hwq_sema); memflags = blk_mq_freeze_queue(q); /* @@ -706,14 +694,20 @@ static int elevator_change(struct request_queue *q, */ blk_mq_cancel_work_sync(q); mutex_lock(&q->elevator_lock); - if (!q->elevator || !elevator_match(q->elevator->type, ctx->name)) - ret = __elevator_change(q, ctx); + /* Make sure queue is not in the middle of being removed */ + ret = -ENOENT; + if (!ctx->init && !blk_queue_registered(q)) + goto out_unlock; + ret = 0; + if (q->elevator && elevator_match(q->elevator->type, ctx->name)) + goto out_unlock; + ret = elevator_switch(q, ctx); +out_unlock: mutex_unlock(&q->elevator_lock); blk_mq_unfreeze_queue(q, memflags); - if (!ret) - ret = elevator_change_done(q, ctx); - - return ret; + if (ret) + return ret; + return elevator_change_done(q, ctx); } /* @@ -768,17 +762,18 @@ void elevator_set_none(struct request_queue *q) void elv_update_nr_hw_queues(struct request_queue *q) { struct elv_change_ctx ctx = { - .name = "none", .uevent = true, }; - int ret = -ENODEV; + int ret = -ENOENT; + lockdep_assert_held(&q->tag_set->update_nr_hwq_sema); WARN_ON_ONCE(q->mq_freeze_depth == 0); mutex_lock(&q->elevator_lock); - if (q->elevator && !blk_queue_dying(q)) + if (blk_queue_registered(q) && !blk_queue_dying(q) && q->elevator) { ctx.name = q->elevator->type->elevator_name; - ret = __elevator_change(q, &ctx); + ret = elevator_switch(q, &ctx); + } mutex_unlock(&q->elevator_lock); blk_mq_unfreeze_queue_nomemrestore(q); -- 2.47.2 --liOOAslEiF7prFVr--