From 8b4534e43e98fbaebd7fff6e32520d7a86885847 Mon Sep 17 00:00:00 2001 From: Seth Howell Date: Fri, 2 Nov 2018 15:53:17 -0700 Subject: [PATCH] nvmf_rdma: When destroying a qpair, fail the I/O. This helps us get rit of outstanding requests at the bdev layer. Change-Id: I362c7c0c6641715fcd96e8eb465b308c368d34fc Signed-off-by: Seth Howell Reviewed-on: https://review.gerrithub.io/431844 Tested-by: SPDK CI Jenkins Reviewed-by: Shuhei Matsumoto Reviewed-by: Paul Luse Reviewed-by: Ben Walker Reviewed-by: Jim Harris Chandler-Test-Pool: SPDK Automated Test System --- lib/nvme/nvme_rdma.c | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/lib/nvme/nvme_rdma.c b/lib/nvme/nvme_rdma.c index 6546cd084..a4b9014ad 100644 --- a/lib/nvme/nvme_rdma.c +++ b/lib/nvme/nvme_rdma.c @@ -1271,6 +1271,7 @@ nvme_rdma_qpair_destroy(struct spdk_nvme_qpair *qpair) if (!qpair) { return -1; } + nvme_rdma_qpair_fail(qpair); nvme_qpair_deinit(qpair); rqpair = nvme_rdma_qpair(qpair); @@ -1564,7 +1565,27 @@ nvme_rdma_qpair_reset(struct spdk_nvme_qpair *qpair) int nvme_rdma_qpair_fail(struct spdk_nvme_qpair *qpair) { - /* Currently, doing nothing here */ + /* + * If the qpair is really failed, the connection is broken + * and we need to flush back all I/O + */ + struct spdk_nvme_rdma_req *rdma_req, *tmp; + struct nvme_request *req; + struct spdk_nvme_cpl cpl; + struct nvme_rdma_qpair *rqpair = nvme_rdma_qpair(qpair); + + /* Call it power loss since we don't know what happened, but the controller is gone. */ + cpl.status.sc = SPDK_NVME_SC_ABORTED_POWER_LOSS; + cpl.status.sct = SPDK_NVME_SCT_GENERIC; + + TAILQ_FOREACH_SAFE(rdma_req, &rqpair->outstanding_reqs, link, tmp) { + assert(rdma_req->req != NULL); + req = rdma_req->req; + + nvme_rdma_req_complete(req, &cpl); + nvme_rdma_req_put(rqpair, rdma_req); + } + return 0; }