This removes duplicate code, and keeps the callers tidy. Signed-off-by: Christoph Hellwig <hch@xxxxxx> --- block/elevator.c | 59 ++++++++++++++++-------------------------------- 1 file changed, 20 insertions(+), 39 deletions(-) diff --git a/block/elevator.c b/block/elevator.c index 773b8931d874..59ff0abde920 100644 --- a/block/elevator.c +++ b/block/elevator.c @@ -593,15 +593,17 @@ static bool use_default_elevator(struct request_queue *q) */ static int elevator_switch(struct request_queue *q, struct elv_change_ctx *ctx) { - struct elevator_type *new_e; - int ret; + struct elevator_type *new_e = NULL; + int ret = 0; WARN_ON_ONCE(q->mq_freeze_depth == 0); lockdep_assert_held(&q->elevator_lock); - new_e = elevator_find_get(ctx->name); - if (!new_e) - return -EINVAL; + if (strncmp(ctx->name, "none", 4)) { + new_e = elevator_find_get(ctx->name); + if (!new_e) + return -EINVAL; + } blk_mq_quiesce_queue(q); @@ -610,12 +612,17 @@ static int elevator_switch(struct request_queue *q, struct elv_change_ctx *ctx) __elevator_exit(q); } - ret = blk_mq_init_sched(q, new_e); - if (ret) - goto out_unfreeze; - - ctx->new = q->elevator; - blk_add_trace_msg(q, "elv switch: %s", new_e->elevator_name); + if (new_e) { + ret = blk_mq_init_sched(q, new_e); + if (ret) + goto out_unfreeze; + ctx->new = q->elevator; + } else { + blk_queue_flag_clear(QUEUE_FLAG_SQ_SCHED, q); + q->elevator = NULL; + q->nr_requests = q->tag_set->queue_depth; + } + blk_add_trace_msg(q, "elv switch: %s", ctx->name); out_unfreeze: blk_mq_unquiesce_queue(q); @@ -625,28 +632,11 @@ static int elevator_switch(struct request_queue *q, struct elv_change_ctx *ctx) new_e->elevator_name); } - elevator_put(new_e); + if (new_e) + elevator_put(new_e); return ret; } -static void elevator_disable(struct request_queue *q, - struct elv_change_ctx *ctx) -{ - WARN_ON_ONCE(q->mq_freeze_depth == 0); - lockdep_assert_held(&q->elevator_lock); - - blk_mq_quiesce_queue(q); - - ctx->old = q->elevator; - __elevator_exit(q); - blk_queue_flag_clear(QUEUE_FLAG_SQ_SCHED, q); - q->elevator = NULL; - q->nr_requests = q->tag_set->queue_depth; - blk_add_trace_msg(q, "elv switch: none"); - - blk_mq_unquiesce_queue(q); -} - static void elv_exit_and_release(struct request_queue *q) { struct elevator_queue *e; @@ -690,20 +680,11 @@ static int elevator_change_done(struct request_queue *q, static int __elevator_change(struct request_queue *q, struct elv_change_ctx *ctx) { - const char *elevator_name = ctx->name; - 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; - - if (!strncmp(elevator_name, "none", 4)) { - if (q->elevator) - elevator_disable(q, ctx); - return 0; - } - return elevator_switch(q, ctx); } -- 2.47.2 --liOOAslEiF7prFVr Content-Type: text/x-patch; charset=us-ascii Content-Disposition: attachment; filename="0003-block-remove-__elevator_change.patch"