| From f9492eb9459b50a28cf4655c4852eab018a2318c Mon Sep 17 00:00:00 2001 |
| From: Sagi Grimberg <sagi@grimberg.me> |
| Date: Wed, 24 Apr 2019 11:53:18 -0700 |
| Subject: nvme-rdma: fix a NULL deref when an admin connect times out |
| |
| [ Upstream commit 1007709d7d06fab09bf2d007657575958676282b ] |
| |
| If we timeout the admin startup sequence we might not yet have |
| an I/O tagset allocated which causes the teardown sequence to crash. |
| Make nvme_tcp_teardown_io_queues safe by not iterating inflight tags |
| if the tagset wasn't allocated. |
| |
| Fixes: 4c174e636674 ("nvme-rdma: fix timeout handler") |
| Signed-off-by: Sagi Grimberg <sagi@grimberg.me> |
| Signed-off-by: Christoph Hellwig <hch@lst.de> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/nvme/host/rdma.c | 10 ++++++---- |
| 1 file changed, 6 insertions(+), 4 deletions(-) |
| |
| diff --git a/drivers/nvme/host/rdma.c b/drivers/nvme/host/rdma.c |
| index 11a5ecae78c8d..e1824c2e0a1c0 100644 |
| --- a/drivers/nvme/host/rdma.c |
| +++ b/drivers/nvme/host/rdma.c |
| @@ -914,8 +914,9 @@ static void nvme_rdma_teardown_admin_queue(struct nvme_rdma_ctrl *ctrl, |
| { |
| blk_mq_quiesce_queue(ctrl->ctrl.admin_q); |
| nvme_rdma_stop_queue(&ctrl->queues[0]); |
| - blk_mq_tagset_busy_iter(&ctrl->admin_tag_set, nvme_cancel_request, |
| - &ctrl->ctrl); |
| + if (ctrl->ctrl.admin_tagset) |
| + blk_mq_tagset_busy_iter(ctrl->ctrl.admin_tagset, |
| + nvme_cancel_request, &ctrl->ctrl); |
| blk_mq_unquiesce_queue(ctrl->ctrl.admin_q); |
| nvme_rdma_destroy_admin_queue(ctrl, remove); |
| } |
| @@ -926,8 +927,9 @@ static void nvme_rdma_teardown_io_queues(struct nvme_rdma_ctrl *ctrl, |
| if (ctrl->ctrl.queue_count > 1) { |
| nvme_stop_queues(&ctrl->ctrl); |
| nvme_rdma_stop_io_queues(ctrl); |
| - blk_mq_tagset_busy_iter(&ctrl->tag_set, nvme_cancel_request, |
| - &ctrl->ctrl); |
| + if (ctrl->ctrl.tagset) |
| + blk_mq_tagset_busy_iter(ctrl->ctrl.tagset, |
| + nvme_cancel_request, &ctrl->ctrl); |
| if (remove) |
| nvme_start_queues(&ctrl->ctrl); |
| nvme_rdma_destroy_io_queues(ctrl, remove); |
| -- |
| 2.20.1 |
| |