OSDN Git Service

nvmet_fc: fix better length checking
authorJames Smart <jsmart2021@gmail.com>
Thu, 16 Nov 2017 01:00:21 +0000 (17:00 -0800)
committerJens Axboe <axboe@kernel.dk>
Thu, 16 Nov 2017 18:27:04 +0000 (11:27 -0700)
Reorganize nvmet_fc_handle_fcp_rqst() so that the nvmet req.transfer_len
field is set after the call nvmet_req_init(). An update to nvmet now
has nvmet_req_init() clearing the field, thus the fc transport was losing
the value.

Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: James Smart <james.smart@broadcom.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/nvme/target/fc.c

index 739b8fe..664d301 100644 (file)
@@ -2144,6 +2144,7 @@ nvmet_fc_handle_fcp_rqst(struct nvmet_fc_tgtport *tgtport,
                        struct nvmet_fc_fcp_iod *fod)
 {
        struct nvme_fc_cmd_iu *cmdiu = &fod->cmdiubuf;
+       u32 xfrlen = be32_to_cpu(cmdiu->data_len);
        int ret;
 
        /*
@@ -2157,7 +2158,6 @@ nvmet_fc_handle_fcp_rqst(struct nvmet_fc_tgtport *tgtport,
 
        fod->fcpreq->done = nvmet_fc_xmt_fcp_op_done;
 
-       fod->req.transfer_len = be32_to_cpu(cmdiu->data_len);
        if (cmdiu->flags & FCNVME_CMD_FLAGS_WRITE) {
                fod->io_dir = NVMET_FCP_WRITE;
                if (!nvme_is_write(&cmdiu->sqe))
@@ -2168,7 +2168,7 @@ nvmet_fc_handle_fcp_rqst(struct nvmet_fc_tgtport *tgtport,
                        goto transport_error;
        } else {
                fod->io_dir = NVMET_FCP_NODATA;
-               if (fod->req.transfer_len)
+               if (xfrlen)
                        goto transport_error;
        }
 
@@ -2192,6 +2192,8 @@ nvmet_fc_handle_fcp_rqst(struct nvmet_fc_tgtport *tgtport,
                return;
        }
 
+       fod->req.transfer_len = xfrlen;
+
        /* keep a running counter of tail position */
        atomic_inc(&fod->queue->sqtail);