]> www.infradead.org Git - users/hch/block.git/commitdiff
blk-mq: move the call to blk_put_queue out of blk_mq_destroy_queue
authorChristoph Hellwig <hch@lst.de>
Mon, 17 Oct 2022 04:57:31 +0000 (06:57 +0200)
committerChristoph Hellwig <hch@lst.de>
Mon, 17 Oct 2022 04:57:31 +0000 (06:57 +0200)
The fact that blk_mq_destroy_queue also drops a queue reference leads
to various places having to grab an extra reference.  Move the call to
blk_put_queue into the callers to allow removing the extra references.

Signed-off-by: Christoph Hellwig <hch@lst.de>
block/blk-mq.c
block/bsg-lib.c
drivers/nvme/host/apple.c
drivers/nvme/host/core.c
drivers/nvme/host/pci.c
drivers/scsi/scsi_sysfs.c
drivers/ufs/core/ufshcd.c

index 8070b6c10e8d5ae1cf97b6f8a712b566f89d2255..ee644444e0f330895dac558c48d47f99dfbf2e4d 100644 (file)
@@ -4007,9 +4007,6 @@ void blk_mq_destroy_queue(struct request_queue *q)
        blk_sync_queue(q);
        blk_mq_cancel_work_sync(q);
        blk_mq_exit_queue(q);
-
-       /* @q is and will stay empty, shutdown and put */
-       blk_put_queue(q);
 }
 EXPORT_SYMBOL(blk_mq_destroy_queue);
 
@@ -4026,6 +4023,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_mq_destroy_queue(q);
+               blk_put_queue(q);
                return ERR_PTR(-ENOMEM);
        }
        set_bit(GD_OWNS_QUEUE, &disk->state);
index d6f5dcdce748cab7e25b0286181d9dc8500df379..435c32373cd68ff98a2b0923efcb2dde92148fef 100644 (file)
@@ -325,6 +325,7 @@ void bsg_remove_queue(struct request_queue *q)
 
                bsg_unregister_queue(bset->bd);
                blk_mq_destroy_queue(q);
+               blk_put_queue(q);
                blk_mq_free_tag_set(&bset->tag_set);
                kfree(bset);
        }
@@ -400,6 +401,7 @@ struct request_queue *bsg_setup_queue(struct device *dev, const char *name,
        return q;
 out_cleanup_queue:
        blk_mq_destroy_queue(q);
+       blk_put_queue(q);
 out_queue:
        blk_mq_free_tag_set(set);
 out_tag_set:
index 5fc5ea196b40072dc224c288a7ca8ef56aff5dee..42b17439dfd57183181ec223f3a623791fe19765 100644 (file)
@@ -1508,6 +1508,7 @@ static int apple_nvme_probe(struct platform_device *pdev)
        if (!blk_get_queue(anv->ctrl.admin_q)) {
                nvme_start_admin_queue(&anv->ctrl);
                blk_mq_destroy_queue(anv->ctrl.admin_q);
+               blk_put_queue(anv->ctrl.admin_q);
                anv->ctrl.admin_q = NULL;
                ret = -ENODEV;
                goto put_dev;
index 059737c1a2c19c3a9d73f0b0c4ec2d5a878017e1..07381673170b95d9a973a94dbe2cf59af5d47747 100644 (file)
@@ -4847,6 +4847,7 @@ int nvme_alloc_admin_tag_set(struct nvme_ctrl *ctrl, struct blk_mq_tag_set *set,
 
 out_cleanup_admin_q:
        blk_mq_destroy_queue(ctrl->fabrics_q);
+       blk_put_queue(ctrl->fabrics_q);
 out_free_tagset:
        blk_mq_free_tag_set(ctrl->admin_tagset);
        return ret;
@@ -4856,8 +4857,11 @@ EXPORT_SYMBOL_GPL(nvme_alloc_admin_tag_set);
 void nvme_remove_admin_tag_set(struct nvme_ctrl *ctrl)
 {
        blk_mq_destroy_queue(ctrl->admin_q);
-       if (ctrl->ops->flags & NVME_F_FABRICS)
+       blk_put_queue(ctrl->admin_q);
+       if (ctrl->ops->flags & NVME_F_FABRICS) {
                blk_mq_destroy_queue(ctrl->fabrics_q);
+               blk_put_queue(ctrl->fabrics_q);
+       }
        blk_mq_free_tag_set(ctrl->admin_tagset);
 }
 EXPORT_SYMBOL_GPL(nvme_remove_admin_tag_set);
@@ -4903,8 +4907,10 @@ EXPORT_SYMBOL_GPL(nvme_alloc_io_tag_set);
 
 void nvme_remove_io_tag_set(struct nvme_ctrl *ctrl)
 {
-       if (ctrl->ops->flags & NVME_F_FABRICS)
+       if (ctrl->ops->flags & NVME_F_FABRICS) {
                blk_mq_destroy_queue(ctrl->connect_q);
+               blk_put_queue(ctrl->connect_q);
+       }
        blk_mq_free_tag_set(ctrl->tagset);
 }
 EXPORT_SYMBOL_GPL(nvme_remove_io_tag_set);
index bcbef6bc5672f09e43f7e939c8bcc25d0b26b4c7..16509b8d92e599a5c78b47989a0428480f41fd3f 100644 (file)
@@ -1749,6 +1749,7 @@ static void nvme_dev_remove_admin(struct nvme_dev *dev)
                 */
                nvme_start_admin_queue(&dev->ctrl);
                blk_mq_destroy_queue(dev->ctrl.admin_q);
+               blk_put_queue(dev->ctrl.admin_q);
                blk_mq_free_tag_set(&dev->admin_tagset);
        }
 }
index c95177ca6ed2645e9720d76e6f3c2764a459e5b9..1214c6f07bc64fddcd7af0cbfa1d02540f0d7364 100644 (file)
@@ -1478,6 +1478,7 @@ void __scsi_remove_device(struct scsi_device *sdev)
        mutex_unlock(&sdev->state_mutex);
 
        blk_mq_destroy_queue(sdev->request_queue);
+       blk_put_queue(sdev->request_queue);
        kref_put(&sdev->host->tagset_refcnt, scsi_mq_free_tags);
        cancel_work_sync(&sdev->requeue_work);
 
index 7256e6c43ca68de9261af07b9a99427126584515..8ee0ac168ff2ba89b9b421ad369bdb1fc22ffa28 100644 (file)
@@ -9544,6 +9544,7 @@ void ufshcd_remove(struct ufs_hba *hba)
        ufshpb_remove(hba);
        ufs_sysfs_remove_nodes(hba->dev);
        blk_mq_destroy_queue(hba->tmf_queue);
+       blk_put_queue(hba->tmf_queue);
        blk_mq_free_tag_set(&hba->tmf_tag_set);
        scsi_remove_host(hba->host);
        /* disable interrupts */
@@ -9840,6 +9841,7 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq)
 
 free_tmf_queue:
        blk_mq_destroy_queue(hba->tmf_queue);
+       blk_put_queue(hba->tmf_queue);
 free_tmf_tag_set:
        blk_mq_free_tag_set(&hba->tmf_tag_set);
 out_remove_scsi_host: