From 84501695fda6eee763007909b507fc11c509aa13 Mon Sep 17 00:00:00 2001 From: liu-wenhua Date: Wed, 22 Feb 2017 13:54:30 -0800 Subject: [PATCH] nvmf: Data transfer cannot be simply determined by NVMe opcode (#120) Whether a nvme command having data transfer cannot be completely determined by command opcode. For set features command, some features don't require data transfer. Change spdk_nvmf_request_prep_data to fix this issue. --- lib/nvmf/rdma.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/lib/nvmf/rdma.c b/lib/nvmf/rdma.c index d72535e7b..e3990ef12 100644 --- a/lib/nvmf/rdma.c +++ b/lib/nvmf/rdma.c @@ -825,6 +825,19 @@ spdk_nvmf_request_prep_data(struct spdk_nvmf_request *req) req->xfer = spdk_nvme_opc_get_data_transfer(req->cmd->nvmf_cmd.fctype); } else { req->xfer = spdk_nvme_opc_get_data_transfer(cmd->opc); + if ((req->conn->type == CONN_TYPE_AQ) && + ((cmd->opc == SPDK_NVME_OPC_GET_FEATURES) || + (cmd->opc == SPDK_NVME_OPC_SET_FEATURES))) { + switch (cmd->cdw10 & 0xff) { + case SPDK_NVME_FEAT_LBA_RANGE_TYPE: + case SPDK_NVME_FEAT_AUTONOMOUS_POWER_STATE_TRANSITION: + case SPDK_NVME_FEAT_HOST_IDENTIFIER: + break; + default: + req->xfer = SPDK_NVME_DATA_NONE; + break; + } + } } if (req->xfer == SPDK_NVME_DATA_NONE) {