nvme-rdma: handle nvme_rdma_post_send failures better
authorChao Leng <lengchao@huawei.com>
Mon, 1 Feb 2021 03:49:40 +0000 (11:49 +0800)
committerChristoph Hellwig <hch@lst.de>
Wed, 10 Feb 2021 15:38:03 +0000 (16:38 +0100)
nvme_rdma_post_send failing is a path related error and should bounce
to another path when using nvme-multipath.  Call nvme_host_path_error
when nvme_rdma_post_send returns -EIO to ensure nvme_complete_rq gets
invoked to fail over to another path if there is one.

Signed-off-by: Chao Leng <lengchao@huawei.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/nvme/host/rdma.c

index 6700d8bab68ac275e62ba4786164c233daa2f0b2..53ac4d7442ba9c59b5384c2c888e14580a224771 100644 (file)
@@ -2098,7 +2098,9 @@ static blk_status_t nvme_rdma_queue_rq(struct blk_mq_hw_ctx *hctx,
 err_unmap:
        nvme_rdma_unmap_data(queue, rq);
 err:
-       if (err == -ENOMEM || err == -EAGAIN)
+       if (err == -EIO)
+               ret = nvme_host_path_error(rq);
+       else if (err == -ENOMEM || err == -EAGAIN)
                ret = BLK_STS_RESOURCE;
        else
                ret = BLK_STS_IOERR;