@@ -623,15 +623,17 @@ void elevator_init_mq(struct request_queue *q)
623623 */
624624int elevator_switch (struct request_queue * q , const char * name )
625625{
626- struct elevator_type * new_e ;
627- int ret ;
626+ struct elevator_type * new_e = NULL ;
627+ int ret = 0 ;
628628
629629 WARN_ON_ONCE (q -> mq_freeze_depth == 0 );
630630 lockdep_assert_held (& q -> elevator_lock );
631631
632- new_e = elevator_find_get (name );
633- if (!new_e )
634- return - EINVAL ;
632+ if (strncmp (name , "none" , 4 )) {
633+ new_e = elevator_find_get (name );
634+ if (!new_e )
635+ return - EINVAL ;
636+ }
635637
636638 blk_mq_quiesce_queue (q );
637639
@@ -640,16 +642,21 @@ int elevator_switch(struct request_queue *q, const char *name)
640642 elevator_exit (q );
641643 }
642644
643- ret = blk_mq_init_sched (q , new_e );
644- if (ret )
645- goto out_unfreeze ;
646-
647- ret = elv_register_queue (q , true);
648- if (ret ) {
649- elevator_exit (q );
650- goto out_unfreeze ;
645+ if (new_e ) {
646+ ret = blk_mq_init_sched (q , new_e );
647+ if (ret )
648+ goto out_unfreeze ;
649+ ret = elv_register_queue (q , true);
650+ if (ret ) {
651+ elevator_exit (q );
652+ goto out_unfreeze ;
653+ }
654+ } else {
655+ blk_queue_flag_clear (QUEUE_FLAG_SQ_SCHED , q );
656+ q -> elevator = NULL ;
657+ q -> nr_requests = q -> tag_set -> queue_depth ;
651658 }
652- blk_add_trace_msg (q , "elv switch: %s" , new_e -> elevator_name );
659+ blk_add_trace_msg (q , "elv switch: %s" , name );
653660
654661out_unfreeze :
655662 blk_mq_unquiesce_queue (q );
@@ -659,27 +666,11 @@ int elevator_switch(struct request_queue *q, const char *name)
659666 new_e -> elevator_name );
660667 }
661668
662- elevator_put (new_e );
669+ if (new_e )
670+ elevator_put (new_e );
663671 return ret ;
664672}
665673
666- void elevator_disable (struct request_queue * q )
667- {
668- WARN_ON_ONCE (q -> mq_freeze_depth == 0 );
669- lockdep_assert_held (& q -> elevator_lock );
670-
671- blk_mq_quiesce_queue (q );
672-
673- elv_unregister_queue (q );
674- elevator_exit (q );
675- blk_queue_flag_clear (QUEUE_FLAG_SQ_SCHED , q );
676- q -> elevator = NULL ;
677- q -> nr_requests = q -> tag_set -> queue_depth ;
678- blk_add_trace_msg (q , "elv switch: none" );
679-
680- blk_mq_unquiesce_queue (q );
681- }
682-
683674/*
684675 * Switch this queue to the given IO scheduler.
685676 */
@@ -689,12 +680,6 @@ static int elevator_change(struct request_queue *q, const char *elevator_name)
689680 if (!blk_queue_registered (q ))
690681 return - ENOENT ;
691682
692- if (!strncmp (elevator_name , "none" , 4 )) {
693- if (q -> elevator )
694- elevator_disable (q );
695- return 0 ;
696- }
697-
698683 if (q -> elevator && elevator_match (q -> elevator -> type , elevator_name ))
699684 return 0 ;
700685
0 commit comments