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@xxxxxxxxxx> --- 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