On Mon, Jul 18, 2022 at 03:07:25PM +0200, Christoph Hellwig wrote: > On Mon, Jul 18, 2022 at 03:18:52PM +0800, Ming Lei wrote: > > Request queue is allocated successfully, but disk allocation may fail, > > so blk_mq_exit_queue still may be missed in this case. > > Yes. That's a separate issue, though and solved by this one liner: > > diff --git a/block/blk-mq.c b/block/blk-mq.c > index d716b7f3763f3..70177ee74295b 100644 > --- a/block/blk-mq.c > +++ b/block/blk-mq.c > @@ -3960,7 +3960,7 @@ struct gendisk *__blk_mq_alloc_disk(struct blk_mq_tag_set *set, void *queuedata, > > disk = __alloc_disk_node(q, set->numa_node, lkclass); > if (!disk) { > - blk_put_queue(q); > + blk_mq_destroy_queue(q); > return ERR_PTR(-ENOMEM); OK, but it is still tricky, since there isn't the required order between calling blk_mq_free_tag_set and put_disk, but now put_disk has to be called before calling blk_mq_free_tag_set, so you may have to audit drivers first, and make sure that all put_disk is called before blk_mq_free_tag_set() in driver's error handling code path. Thanks, Ming