nvme-fc: Fail transport errors with NVME_SC_HOST_PATH
authorJames Smart <james.smart@broadcom.com>
Tue, 6 Aug 2019 07:14:06 +0000 (00:14 -0700)
committerSagi Grimberg <sagi@grimberg.me>
Thu, 12 Sep 2019 15:50:45 +0000 (08:50 -0700)
NVME_SC_INTERNAL should indicate an internal controller errors
and not host transport errors. These errors will propagate to
upper layers (essentially nvme core) and be interpereted as
transport errors which should not be taken into account for
namespace state or condition.

Reviewed-by: Hannes Reinecke <hare@suse.com>
Reviewed-by: James Smart <james.smart@broadcom.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Sagi Grimberg <sagi@grimberg.me>
drivers/nvme/host/fc.c

index bafe35bdffacb6b676118b2168b562a6faa7a2af..265f89e11d8b9145d65304436bd6b43502dd2494 100644 (file)
@@ -1608,9 +1608,13 @@ nvme_fc_fcpio_done(struct nvmefc_fcp_req *req)
                                sizeof(op->rsp_iu), DMA_FROM_DEVICE);
 
        if (opstate == FCPOP_STATE_ABORTED)
-               status = cpu_to_le16(NVME_SC_ABORT_REQ << 1);
-       else if (freq->status)
-               status = cpu_to_le16(NVME_SC_INTERNAL << 1);
+               status = cpu_to_le16(NVME_SC_HOST_PATH_ERROR << 1);
+       else if (freq->status) {
+               status = cpu_to_le16(NVME_SC_HOST_PATH_ERROR << 1);
+               dev_info(ctrl->ctrl.device,
+                       "NVME-FC{%d}: io failed due to lldd error %d\n",
+                       ctrl->cnum, freq->status);
+       }
 
        /*
         * For the linux implementation, if we have an unsuccesful
@@ -1637,8 +1641,13 @@ nvme_fc_fcpio_done(struct nvmefc_fcp_req *req)
                 * no payload in the CQE by the transport.
                 */
                if (freq->transferred_length !=
-                       be32_to_cpu(op->cmd_iu.data_len)) {
-                       status = cpu_to_le16(NVME_SC_INTERNAL << 1);
+                   be32_to_cpu(op->cmd_iu.data_len)) {
+                       status = cpu_to_le16(NVME_SC_HOST_PATH_ERROR << 1);
+                       dev_info(ctrl->ctrl.device,
+                               "NVME-FC{%d}: io failed due to bad transfer "
+                               "length: %d vs expected %d\n",
+                               ctrl->cnum, freq->transferred_length,
+                               be32_to_cpu(op->cmd_iu.data_len));
                        goto done;
                }
                result.u64 = 0;
@@ -1655,7 +1664,17 @@ nvme_fc_fcpio_done(struct nvmefc_fcp_req *req)
                                        freq->transferred_length ||
                             op->rsp_iu.status_code ||
                             sqe->common.command_id != cqe->command_id)) {
-                       status = cpu_to_le16(NVME_SC_INTERNAL << 1);
+                       status = cpu_to_le16(NVME_SC_HOST_PATH_ERROR << 1);
+                       dev_info(ctrl->ctrl.device,
+                               "NVME-FC{%d}: io failed due to bad NVMe_ERSP: "
+                               "iu len %d, xfr len %d vs %d, status code "
+                               "%d, cmdid %d vs %d\n",
+                               ctrl->cnum, be16_to_cpu(op->rsp_iu.iu_len),
+                               be32_to_cpu(op->rsp_iu.xfrd_len),
+                               freq->transferred_length,
+                               op->rsp_iu.status_code,
+                               sqe->common.command_id,
+                               cqe->command_id);
                        goto done;
                }
                result = cqe->result;
@@ -1663,7 +1682,11 @@ nvme_fc_fcpio_done(struct nvmefc_fcp_req *req)
                break;
 
        default:
-               status = cpu_to_le16(NVME_SC_INTERNAL << 1);
+               status = cpu_to_le16(NVME_SC_HOST_PATH_ERROR << 1);
+               dev_info(ctrl->ctrl.device,
+                       "NVME-FC{%d}: io failed due to odd NVMe_xRSP iu "
+                       "len %d\n",
+                       ctrl->cnum, freq->rcv_rsplen);
                goto done;
        }