]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
nvme-fc and nvmet-fc: sync with FC-NVME-2 header changes
authorJames Smart <jsmart2021@gmail.com>
Fri, 27 Sep 2019 21:51:35 +0000 (14:51 -0700)
committerJens Axboe <axboe@kernel.dk>
Mon, 4 Nov 2019 17:56:40 +0000 (10:56 -0700)
Sync sources with revised structure and field names to correspond with
FC-NVME-2 header sync-up.

Tested interoperability with success:
- prior initiator with new target
- prior target with new initiator
- new on new

Signed-off-by: James Smart <jsmart2021@gmail.com>
Signed-off-by: Keith Busch <kbusch@kernel.org>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/nvme/host/fc.c
drivers/nvme/target/fc.c

index 265f89e11d8b9145d65304436bd6b43502dd2494..e09c61ec0b96af919c4bdc2d6e02c2b5f5965739 100644 (file)
@@ -1224,7 +1224,7 @@ nvme_fc_connect_admin_queue(struct nvme_fc_ctrl *ctrl,
        lsreq->rqstlen = sizeof(*assoc_rqst);
        lsreq->rspaddr = assoc_acc;
        lsreq->rsplen = sizeof(*assoc_acc);
-       lsreq->timeout = NVME_FC_CONNECT_TIMEOUT_SEC;
+       lsreq->timeout = NVME_FC_LS_TIMEOUT_SEC;
 
        ret = nvme_fc_send_ls_req(ctrl->rport, lsop);
        if (ret)
@@ -1332,7 +1332,7 @@ nvme_fc_connect_queue(struct nvme_fc_ctrl *ctrl, struct nvme_fc_queue *queue,
        lsreq->rqstlen = sizeof(*conn_rqst);
        lsreq->rspaddr = conn_acc;
        lsreq->rsplen = sizeof(*conn_acc);
-       lsreq->timeout = NVME_FC_CONNECT_TIMEOUT_SEC;
+       lsreq->timeout = NVME_FC_LS_TIMEOUT_SEC;
 
        ret = nvme_fc_send_ls_req(ctrl->rport, lsop);
        if (ret)
@@ -1413,8 +1413,8 @@ nvme_fc_disconnect_assoc_done(struct nvmefc_ls_req *lsreq, int status)
 static void
 nvme_fc_xmt_disconnect_assoc(struct nvme_fc_ctrl *ctrl)
 {
-       struct fcnvme_ls_disconnect_rqst *discon_rqst;
-       struct fcnvme_ls_disconnect_acc *discon_acc;
+       struct fcnvme_ls_disconnect_assoc_rqst *discon_rqst;
+       struct fcnvme_ls_disconnect_assoc_acc *discon_acc;
        struct nvmefc_ls_req_op *lsop;
        struct nvmefc_ls_req *lsreq;
        int ret;
@@ -1430,11 +1430,11 @@ nvme_fc_xmt_disconnect_assoc(struct nvme_fc_ctrl *ctrl)
        lsreq = &lsop->ls_req;
 
        lsreq->private = (void *)&lsop[1];
-       discon_rqst = (struct fcnvme_ls_disconnect_rqst *)
+       discon_rqst = (struct fcnvme_ls_disconnect_assoc_rqst *)
                        (lsreq->private + ctrl->lport->ops->lsrqst_priv_sz);
-       discon_acc = (struct fcnvme_ls_disconnect_acc *)&discon_rqst[1];
+       discon_acc = (struct fcnvme_ls_disconnect_assoc_acc *)&discon_rqst[1];
 
-       discon_rqst->w0.ls_cmd = FCNVME_LS_DISCONNECT;
+       discon_rqst->w0.ls_cmd = FCNVME_LS_DISCONNECT_ASSOC;
        discon_rqst->desc_list_len = cpu_to_be32(
                                sizeof(struct fcnvme_lsdesc_assoc_id) +
                                sizeof(struct fcnvme_lsdesc_disconn_cmd));
@@ -1451,14 +1451,12 @@ nvme_fc_xmt_disconnect_assoc(struct nvme_fc_ctrl *ctrl)
        discon_rqst->discon_cmd.desc_len =
                        fcnvme_lsdesc_len(
                                sizeof(struct fcnvme_lsdesc_disconn_cmd));
-       discon_rqst->discon_cmd.scope = FCNVME_DISCONN_ASSOCIATION;
-       discon_rqst->discon_cmd.id = cpu_to_be64(ctrl->association_id);
 
        lsreq->rqstaddr = discon_rqst;
        lsreq->rqstlen = sizeof(*discon_rqst);
        lsreq->rspaddr = discon_acc;
        lsreq->rsplen = sizeof(*discon_acc);
-       lsreq->timeout = NVME_FC_CONNECT_TIMEOUT_SEC;
+       lsreq->timeout = NVME_FC_LS_TIMEOUT_SEC;
 
        ret = nvme_fc_send_ls_req_async(ctrl->rport, lsop,
                                nvme_fc_disconnect_assoc_done);
@@ -1662,7 +1660,7 @@ nvme_fc_fcpio_done(struct nvmefc_fcp_req *req)
                                        (freq->rcv_rsplen / 4) ||
                             be32_to_cpu(op->rsp_iu.xfrd_len) !=
                                        freq->transferred_length ||
-                            op->rsp_iu.status_code ||
+                            op->rsp_iu.ersp_result ||
                             sqe->common.command_id != cqe->command_id)) {
                        status = cpu_to_le16(NVME_SC_HOST_PATH_ERROR << 1);
                        dev_info(ctrl->ctrl.device,
@@ -1672,7 +1670,7 @@ nvme_fc_fcpio_done(struct nvmefc_fcp_req *req)
                                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,
+                               op->rsp_iu.ersp_result,
                                sqe->common.command_id,
                                cqe->command_id);
                        goto done;
@@ -1731,7 +1729,7 @@ __nvme_fc_init_request(struct nvme_fc_ctrl *ctrl,
        op->rq = rq;
        op->rqno = rqno;
 
-       cmdiu->scsi_id = NVME_CMD_SCSI_ID;
+       cmdiu->format_id = NVME_CMD_FORMAT_ID;
        cmdiu->fc_id = NVME_CMD_FC_ID;
        cmdiu->iu_len = cpu_to_be16(sizeof(*cmdiu) / sizeof(u32));
 
index ce8d819f86ccc58e296696c3ce76a38479b2b87e..61b617698d3f435d65227eb5cbc296e0cd97c009 100644 (file)
@@ -1495,20 +1495,20 @@ static void
 nvmet_fc_ls_disconnect(struct nvmet_fc_tgtport *tgtport,
                        struct nvmet_fc_ls_iod *iod)
 {
-       struct fcnvme_ls_disconnect_rqst *rqst =
-                       (struct fcnvme_ls_disconnect_rqst *)iod->rqstbuf;
-       struct fcnvme_ls_disconnect_acc *acc =
-                       (struct fcnvme_ls_disconnect_acc *)iod->rspbuf;
+       struct fcnvme_ls_disconnect_assoc_rqst *rqst =
+                       (struct fcnvme_ls_disconnect_assoc_rqst *)iod->rqstbuf;
+       struct fcnvme_ls_disconnect_assoc_acc *acc =
+                       (struct fcnvme_ls_disconnect_assoc_acc *)iod->rspbuf;
        struct nvmet_fc_tgt_assoc *assoc;
        int ret = 0;
 
        memset(acc, 0, sizeof(*acc));
 
-       if (iod->rqstdatalen < sizeof(struct fcnvme_ls_disconnect_rqst))
+       if (iod->rqstdatalen < sizeof(struct fcnvme_ls_disconnect_assoc_rqst))
                ret = VERR_DISCONN_LEN;
        else if (rqst->desc_list_len !=
                        fcnvme_lsdesc_len(
-                               sizeof(struct fcnvme_ls_disconnect_rqst)))
+                               sizeof(struct fcnvme_ls_disconnect_assoc_rqst)))
                ret = VERR_DISCONN_RQST_LEN;
        else if (rqst->associd.desc_tag != cpu_to_be32(FCNVME_LSDESC_ASSOC_ID))
                ret = VERR_ASSOC_ID;
@@ -1523,8 +1523,11 @@ nvmet_fc_ls_disconnect(struct nvmet_fc_tgtport *tgtport,
                        fcnvme_lsdesc_len(
                                sizeof(struct fcnvme_lsdesc_disconn_cmd)))
                ret = VERR_DISCONN_CMD_LEN;
-       else if ((rqst->discon_cmd.scope != FCNVME_DISCONN_ASSOCIATION) &&
-                       (rqst->discon_cmd.scope != FCNVME_DISCONN_CONNECTION))
+       /*
+        * As the standard changed on the LS, check if old format and scope
+        * something other than Association (e.g. 0).
+        */
+       else if (rqst->discon_cmd.rsvd8[0])
                ret = VERR_DISCONN_SCOPE;
        else {
                /* match an active association */
@@ -1556,8 +1559,8 @@ nvmet_fc_ls_disconnect(struct nvmet_fc_tgtport *tgtport,
 
        nvmet_fc_format_rsp_hdr(acc, FCNVME_LS_ACC,
                        fcnvme_lsdesc_len(
-                               sizeof(struct fcnvme_ls_disconnect_acc)),
-                       FCNVME_LS_DISCONNECT);
+                               sizeof(struct fcnvme_ls_disconnect_assoc_acc)),
+                       FCNVME_LS_DISCONNECT_ASSOC);
 
        /* release get taken in nvmet_fc_find_target_assoc */
        nvmet_fc_tgt_a_put(iod->assoc);
@@ -1632,7 +1635,7 @@ nvmet_fc_handle_ls_rqst(struct nvmet_fc_tgtport *tgtport,
                /* Creates an IO Queue/Connection */
                nvmet_fc_ls_create_connection(tgtport, iod);
                break;
-       case FCNVME_LS_DISCONNECT:
+       case FCNVME_LS_DISCONNECT_ASSOC:
                /* Terminate a Queue/Connection or the Association */
                nvmet_fc_ls_disconnect(tgtport, iod);
                break;
@@ -2299,7 +2302,7 @@ nvmet_fc_rcv_fcp_req(struct nvmet_fc_target_port *target_port,
 
        /* validate iu, so the connection id can be used to find the queue */
        if ((cmdiubuf_len != sizeof(*cmdiu)) ||
-                       (cmdiu->scsi_id != NVME_CMD_SCSI_ID) ||
+                       (cmdiu->format_id != NVME_CMD_FORMAT_ID) ||
                        (cmdiu->fc_id != NVME_CMD_FC_ID) ||
                        (be16_to_cpu(cmdiu->iu_len) != (sizeof(*cmdiu)/4)))
                return -EIO;