nvme: clear any SGL flags in passthru commands
authorLogan Gunthorpe <logang@deltatee.com>
Fri, 24 Jul 2020 17:25:12 +0000 (11:25 -0600)
committerChristoph Hellwig <hch@lst.de>
Wed, 29 Jul 2020 05:45:20 +0000 (07:45 +0200)
The host driver should decide whether to use SGLs or PRPs and they
currently assume the flags are cleared after the call to
nvme_setup_cmd(). However, passed-through commands may erroneously
set these bits; so clear them for all cases.

Signed-off-by: Logan Gunthorpe <logang@deltatee.com>
Reviewed-by: Keith Busch <kbusch@kernel.org>
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/nvme/host/core.c

index c16bfdff2953124597922804a96a6ccad91203b6..2818c17e92edd5fad28641f8ad0dca0a7b5097e4 100644 (file)
@@ -604,6 +604,14 @@ static void nvme_assign_write_stream(struct nvme_ctrl *ctrl,
                req->q->write_hints[streamid] += blk_rq_bytes(req) >> 9;
 }
 
+static void nvme_setup_passthrough(struct request *req,
+               struct nvme_command *cmd)
+{
+       memcpy(cmd, nvme_req(req)->cmd, sizeof(*cmd));
+       /* passthru commands should let the driver set the SGL flags */
+       cmd->common.flags &= ~NVME_CMD_SGL_ALL;
+}
+
 static inline void nvme_setup_flush(struct nvme_ns *ns,
                struct nvme_command *cmnd)
 {
@@ -769,7 +777,7 @@ blk_status_t nvme_setup_cmd(struct nvme_ns *ns, struct request *req,
        switch (req_op(req)) {
        case REQ_OP_DRV_IN:
        case REQ_OP_DRV_OUT:
-               memcpy(cmd, nvme_req(req)->cmd, sizeof(*cmd));
+               nvme_setup_passthrough(req, cmd);
                break;
        case REQ_OP_FLUSH:
                nvme_setup_flush(ns, cmd);