nvme_fc: fix command id check
authorJames Smart <jsmart2021@gmail.com>
Sun, 23 Apr 2017 15:30:06 +0000 (08:30 -0700)
committerChristoph Hellwig <hch@lst.de>
Mon, 24 Apr 2017 07:15:04 +0000 (09:15 +0200)
The code validates the command_id in the response to the original
sqe command. But prior code was using the rq->rqno as the sqe command
id. The core layer overwrites what the transport set there originally.

Use the actual sqe content.

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

index 596b3a453b545173b27eb4e899556b2e7aaef915..cccade5a18c235bef07c531e100bf551e41e04a4 100644 (file)
@@ -1192,6 +1192,7 @@ nvme_fc_fcpio_done(struct nvmefc_fcp_req *req)
        struct nvme_fc_ctrl *ctrl = op->ctrl;
        struct nvme_fc_queue *queue = op->queue;
        struct nvme_completion *cqe = &op->rsp_iu.cqe;
+       struct nvme_command *sqe = &op->cmd_iu.sqe;
        __le16 status = cpu_to_le16(NVME_SC_SUCCESS << 1);
        union nvme_result result;
 
@@ -1274,7 +1275,7 @@ nvme_fc_fcpio_done(struct nvmefc_fcp_req *req)
                             be32_to_cpu(op->rsp_iu.xfrd_len) !=
                                        freq->transferred_length ||
                             op->rsp_iu.status_code ||
-                            op->rqno != le16_to_cpu(cqe->command_id))) {
+                            sqe->common.command_id != cqe->command_id)) {
                        status = cpu_to_le16(NVME_SC_FC_TRANSPORT_ERROR << 1);
                        goto done;
                }