@@ -676,10 +676,19 @@ static int elevator_switch(struct request_queue *q, const char *name)
676676 */
677677static int elevator_change (struct request_queue * q , const char * elevator_name )
678678{
679- if ( q -> elevator && elevator_match ( q -> elevator -> type , elevator_name ))
680- return 0 ;
679+ unsigned int memflags ;
680+ int ret = 0 ;
681681
682- return elevator_switch (q , elevator_name );
682+ lockdep_assert_held (& q -> tag_set -> update_nr_hwq_lock );
683+
684+ memflags = blk_mq_freeze_queue (q );
685+ mutex_lock (& q -> elevator_lock );
686+ if (!(q -> elevator && elevator_match (q -> elevator -> type ,
687+ elevator_name )))
688+ ret = elevator_switch (q , elevator_name );
689+ mutex_unlock (& q -> elevator_lock );
690+ blk_mq_unfreeze_queue (q , memflags );
691+ return ret ;
683692}
684693
685694/*
@@ -718,7 +727,6 @@ ssize_t elv_iosched_store(struct gendisk *disk, const char *buf,
718727 char elevator_name [ELV_NAME_MAX ];
719728 char * name ;
720729 int ret ;
721- unsigned int memflags ;
722730 struct request_queue * q = disk -> queue ;
723731 struct blk_mq_tag_set * set = q -> tag_set ;
724732
@@ -737,13 +745,9 @@ ssize_t elv_iosched_store(struct gendisk *disk, const char *buf,
737745 elv_iosched_load_module (name );
738746
739747 down_read (& set -> update_nr_hwq_lock );
740- memflags = blk_mq_freeze_queue (q );
741- mutex_lock (& q -> elevator_lock );
742748 ret = elevator_change (q , name );
743749 if (!ret )
744750 ret = count ;
745- mutex_unlock (& q -> elevator_lock );
746- blk_mq_unfreeze_queue (q , memflags );
747751 up_read (& set -> update_nr_hwq_lock );
748752 return ret ;
749753}
0 commit comments