]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
nvmet: add error log support for rdma backend
authorChaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
Wed, 12 Dec 2018 23:11:45 +0000 (15:11 -0800)
committerChristoph Hellwig <hch@lst.de>
Thu, 13 Dec 2018 08:59:04 +0000 (09:59 +0100)
This patch adds the support to maintain the error log page for rdma
transport, we mainly focus here on the NVME_INVALID_FIELD errors.

Signed-off-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/nvme/target/rdma.c

index fb84caddd94b8406905a75a35c8d27deeb3f8c34..a8d23eb80192024e2fe101f91fa58d222a17b698 100644 (file)
@@ -630,8 +630,11 @@ static u16 nvmet_rdma_map_sgl_inline(struct nvmet_rdma_rsp *rsp)
        u64 off = le64_to_cpu(sgl->addr);
        u32 len = le32_to_cpu(sgl->length);
 
-       if (!nvme_is_write(rsp->req.cmd))
+       if (!nvme_is_write(rsp->req.cmd)) {
+               rsp->req.error_loc =
+                       offsetof(struct nvme_common_command, opcode);
                return NVME_SC_INVALID_FIELD | NVME_SC_DNR;
+       }
 
        if (off + len > rsp->queue->dev->inline_data_size) {
                pr_err("invalid inline data offset!\n");
@@ -696,6 +699,8 @@ static u16 nvmet_rdma_map_sgl(struct nvmet_rdma_rsp *rsp)
                        return nvmet_rdma_map_sgl_inline(rsp);
                default:
                        pr_err("invalid SGL subtype: %#x\n", sgl->type);
+                       rsp->req.error_loc =
+                               offsetof(struct nvme_common_command, dptr);
                        return NVME_SC_INVALID_FIELD | NVME_SC_DNR;
                }
        case NVME_KEY_SGL_FMT_DATA_DESC:
@@ -706,10 +711,13 @@ static u16 nvmet_rdma_map_sgl(struct nvmet_rdma_rsp *rsp)
                        return nvmet_rdma_map_sgl_keyed(rsp, sgl, false);
                default:
                        pr_err("invalid SGL subtype: %#x\n", sgl->type);
+                       rsp->req.error_loc =
+                               offsetof(struct nvme_common_command, dptr);
                        return NVME_SC_INVALID_FIELD | NVME_SC_DNR;
                }
        default:
                pr_err("invalid SGL type: %#x\n", sgl->type);
+               rsp->req.error_loc = offsetof(struct nvme_common_command, dptr);
                return NVME_SC_SGL_INVALID_TYPE | NVME_SC_DNR;
        }
 }