[PATCH v5 3/3] nvme-rdma: avoid IO error for nvme native multipath

Chao Leng
2021-02-01T03:50:04Z

Work with nvme native multipath, if a path related error occurs when
queue_rq call HBA drive to send request, queue_rq will return
BLK_STS_IOERR to blk-mq. The request is completed with BLK_STS_IOERR
instead of fail over to retry.
queue_rq need complete the request with NVME_SC_HOST_PATH_ERROR and set
the state of request to MQ_RQ_COMPLETE, the request will fail over to
retry if needed.

Signed-off-by: Chao Leng <lengchao@huawei.com>
---
drivers/nvme/host/rdma.c | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/drivers/nvme/host/rdma.c b/drivers/nvme/host/rdma.c
index b7ce4f221d99..5fc113dd3302 100644
--- a/drivers/nvme/host/rdma.c
+++ b/drivers/nvme/host/rdma.c
@@ -2084,8 +2084,19 @@ static blk_status_t nvme_rdma_queue_rq(struct blk_mq_hw_ctx *hctx,

err = nvme_rdma_post_send(queue, sqe, req->sge, req->num_sge,
req->mr ? &req->reg_wr.wr : NULL);
- if (unlikely(err))
+ if (unlikely(err)) {
+ if (err == -EIO) {
+ /*
+ * Fail the reqest so upper layer can failover I/O
+ * if another path is available
+ */
+ req->status = NVME_SC_HOST_PATH_ERROR;
+ blk_mq_set_request_complete(rq);
+ nvme_rdma_complete_rq(rq);
+ return BLK_STS_OK;
+ }
goto err_unmap;
+ }

return BLK_STS_OK;

--
2.16.4