]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
nvme: clear the request_queue pointers on failure in nvme_alloc_admin_tag_set
authorMaurizio Lombardi <mlombard@redhat.com>
Fri, 27 Jan 2023 15:42:37 +0000 (16:42 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 22 Feb 2023 11:59:44 +0000 (12:59 +0100)
[ Upstream commit fd62678ab55cb01e11a404d302cdade222bf4022 ]

If nvme_alloc_admin_tag_set() fails, the admin_q and fabrics_q pointers
are left with an invalid, non-NULL value. Other functions may then check
the pointers and dereference them, e.g. in

  nvme_probe() -> out_disable: -> nvme_dev_remove_admin().

Fix the bug by setting admin_q and fabrics_q to NULL in case of error.

Also use the set variable to free the tag_set as ctrl->admin_tagset isn't
initialized yet.

Signed-off-by: Maurizio Lombardi <mlombard@redhat.com>
Reviewed-by: Keith Busch <kbusch@kernel.org>
Reviewed-by: Chaitanya Kulkarni <kch@nvidia.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/nvme/host/core.c

index 25ade4ce8e0a7cbac2832a41a007f3abaca406b5..e189ce17deb3ef1bc5fbe2fd14d4e2716822f42a 100644 (file)
@@ -4881,7 +4881,9 @@ 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->admin_q);
 out_free_tagset:
-       blk_mq_free_tag_set(ctrl->admin_tagset);
+       blk_mq_free_tag_set(set);
+       ctrl->admin_q = NULL;
+       ctrl->fabrics_q = NULL;
        return ret;
 }
 EXPORT_SYMBOL_GPL(nvme_alloc_admin_tag_set);