From 89013903fe2910143329ec8567fe9d000eb68c78 Mon Sep 17 00:00:00 2001 From: Michael Haeuptle Date: Tue, 23 Jun 2020 13:43:18 +0000 Subject: [PATCH] NVME: Fixes stuck IOs during hot remove (#1451) When a NVMe device is hot removed, subsequent calls to nvme_qpair_submit_request can fail with ENXIO. The failure path handling for ENXIO did not free the request which exhausts the qpair's free_req list eventually and all IOs are stuck going forward. This fix adds the same cleanup handling to nvme_qpair_submit_request for this error case as it is done in _nvme_qpair_submit_request. Signed-off-by: Michael Haeuptle Change-Id: I5677d53965bdbd6d339c013483cdf42ce782099a Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/3018 Tested-by: SPDK CI Jenkins Community-CI: Mellanox Build Bot Reviewed-by: Shuhei Matsumoto Reviewed-by: Changpeng Liu --- lib/nvme/nvme_qpair.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/nvme/nvme_qpair.c b/lib/nvme/nvme_qpair.c index 9c3b3dbe7..536e63e1c 100644 --- a/lib/nvme/nvme_qpair.c +++ b/lib/nvme/nvme_qpair.c @@ -749,6 +749,10 @@ nvme_qpair_submit_request(struct spdk_nvme_qpair *qpair, struct nvme_request *re /* This prevents us from entering an infinite loop when freeing queued I/O in disconnect. */ if (spdk_unlikely(nvme_qpair_get_state(qpair) == NVME_QPAIR_DISCONNECTING || nvme_qpair_get_state(qpair) == NVME_QPAIR_DESTROYING)) { + if (req->parent != NULL) { + nvme_request_remove_child(req->parent, req); + } + nvme_free_request(req); return -ENXIO; }