| From 3a3cc2184117ef730d57fe12341f55297f836fff Mon Sep 17 00:00:00 2001 |
| From: Sagi Grimberg <sagi@grimberg.me> |
| Date: Wed, 24 Apr 2019 11:53:17 -0700 |
| Subject: nvme-tcp: fix a NULL deref when an admin connect times out |
| |
| [ Upstream commit 7a42589654ae79e1177f0d74306a02d6cef7bddf ] |
| |
| 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: 39d57757467b ("nvme-tcp: 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/tcp.c | 8 ++++++-- |
| 1 file changed, 6 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/nvme/host/tcp.c b/drivers/nvme/host/tcp.c |
| index 68c49dd672104..aae5374d2b93f 100644 |
| --- a/drivers/nvme/host/tcp.c |
| +++ b/drivers/nvme/host/tcp.c |
| @@ -1710,7 +1710,9 @@ static void nvme_tcp_teardown_admin_queue(struct nvme_ctrl *ctrl, |
| { |
| blk_mq_quiesce_queue(ctrl->admin_q); |
| nvme_tcp_stop_queue(ctrl, 0); |
| - blk_mq_tagset_busy_iter(ctrl->admin_tagset, nvme_cancel_request, ctrl); |
| + if (ctrl->admin_tagset) |
| + blk_mq_tagset_busy_iter(ctrl->admin_tagset, |
| + nvme_cancel_request, ctrl); |
| blk_mq_unquiesce_queue(ctrl->admin_q); |
| nvme_tcp_destroy_admin_queue(ctrl, remove); |
| } |
| @@ -1722,7 +1724,9 @@ static void nvme_tcp_teardown_io_queues(struct nvme_ctrl *ctrl, |
| return; |
| nvme_stop_queues(ctrl); |
| nvme_tcp_stop_io_queues(ctrl); |
| - blk_mq_tagset_busy_iter(ctrl->tagset, nvme_cancel_request, ctrl); |
| + if (ctrl->tagset) |
| + blk_mq_tagset_busy_iter(ctrl->tagset, |
| + nvme_cancel_request, ctrl); |
| if (remove) |
| nvme_start_queues(ctrl); |
| nvme_tcp_destroy_io_queues(ctrl, remove); |
| -- |
| 2.20.1 |
| |