From e0cd084bcb7919f59f5ba5963e3d6ed6422487cd Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Sun, 10 May 2020 20:38:59 +0900 Subject: [PATCH] nvmf/rdma: Clear num_outstanding_data_wr to zero when read I/O to the controller failed When read I/O to the controller failed, clear rdma_req->num_outstanding_data_wr to zero to avoid rqpair->current_send_depth goes to negative after completing data transfer to the host. This bug was apparent when the outstanding read I/O was aborted. Signed-off-by: Michael Haeuptle Signed-off-by: Ben Walker Signed-off-by: Shuhei Matsumoto Change-Id: I62e439f946ef81ea0b5de5280670ed97fe8d977f Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/2341 Community-CI: Mellanox Build Bot Tested-by: SPDK CI Jenkins Reviewed-by: Jim Harris Reviewed-by: Aleksey Marchuk Reviewed-by: Michael Haeuptle --- lib/nvmf/rdma.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/nvmf/rdma.c b/lib/nvmf/rdma.c index 00311e0bb..8023b4b1c 100644 --- a/lib/nvmf/rdma.c +++ b/lib/nvmf/rdma.c @@ -1114,8 +1114,12 @@ request_transfer_out(struct spdk_nvmf_request *req, int *data_posted) */ first = &rdma_req->rsp.wr; - if (rsp->status.sc == SPDK_NVME_SC_SUCCESS && - req->xfer == SPDK_NVME_DATA_CONTROLLER_TO_HOST) { + if (rsp->status.sc != SPDK_NVME_SC_SUCCESS) { + /* On failure, data was not read from the controller. So clear the + * number of outstanding data WRs to zero. + */ + rdma_req->num_outstanding_data_wr = 0; + } else if (req->xfer == SPDK_NVME_DATA_CONTROLLER_TO_HOST) { first = &rdma_req->data.wr; *data_posted = 1; num_outstanding_data_wr = rdma_req->num_outstanding_data_wr;