diff --git a/block/blk-sysfs.c b/block/blk-sysfs.c index d925b75702e3c004d2234ac5a736d3557040651f..a663dbcbdd19cdfee2ac4cb7c2c0083dc750c938 100644 --- a/block/blk-sysfs.c +++ b/block/blk-sysfs.c @@ -1020,7 +1020,6 @@ EXPORT_SYMBOL_GPL(blk_register_queue); void blk_unregister_queue(struct gendisk *disk) { struct request_queue *q = disk->queue; - bool has_elevator; if (WARN_ON(!q)) return; @@ -1038,7 +1037,6 @@ void blk_unregister_queue(struct gendisk *disk) mutex_lock(&q->sysfs_lock); blk_queue_flag_clear(QUEUE_FLAG_REGISTERED, q); - has_elevator = !!q->elevator; mutex_unlock(&q->sysfs_lock); mutex_lock(&q->sysfs_dir_lock); @@ -1051,7 +1049,11 @@ void blk_unregister_queue(struct gendisk *disk) blk_trace_remove_sysfs(disk_to_dev(disk)); - if (q->request_fn || (q->mq_ops && has_elevator)) + /* + * q->kobj has been removed, so it is safe to check if elevator + * exists without holding q->sysfs_lock. + */ + if (q->request_fn || (q->mq_ops && q->elevator)) elv_unregister_queue(q); mutex_unlock(&q->sysfs_dir_lock);