Commit 6c73f949 authored by Daniel Verkamp's avatar Daniel Verkamp Committed by Christoph Hellwig

nvmet: fix KATO offset in Set Features

The Set Features implementation for Keep Alive Timer was using the wrong
structure when retrieving the KATO value; it was treating the Set
Features command as a Property Set command.

The NVMe spec defines the Keep Alive Timer feature as having one input
in CDW11 (4 bytes at offset 44 in the command) whereas the code was
reading 8 bytes at offset 48.

Since the Linux NVMe over Fabrics host never sets this feature, this
code has presumably never been tested.
Signed-off-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
parent 17a1ec08
...@@ -382,7 +382,6 @@ static void nvmet_execute_set_features(struct nvmet_req *req) ...@@ -382,7 +382,6 @@ static void nvmet_execute_set_features(struct nvmet_req *req)
{ {
struct nvmet_subsys *subsys = req->sq->ctrl->subsys; struct nvmet_subsys *subsys = req->sq->ctrl->subsys;
u32 cdw10 = le32_to_cpu(req->cmd->common.cdw10[0]); u32 cdw10 = le32_to_cpu(req->cmd->common.cdw10[0]);
u64 val;
u32 val32; u32 val32;
u16 status = 0; u16 status = 0;
...@@ -392,8 +391,7 @@ static void nvmet_execute_set_features(struct nvmet_req *req) ...@@ -392,8 +391,7 @@ static void nvmet_execute_set_features(struct nvmet_req *req)
(subsys->max_qid - 1) | ((subsys->max_qid - 1) << 16)); (subsys->max_qid - 1) | ((subsys->max_qid - 1) << 16));
break; break;
case NVME_FEAT_KATO: case NVME_FEAT_KATO:
val = le64_to_cpu(req->cmd->prop_set.value); val32 = le32_to_cpu(req->cmd->common.cdw10[1]);
val32 = val & 0xffff;
req->sq->ctrl->kato = DIV_ROUND_UP(val32, 1000); req->sq->ctrl->kato = DIV_ROUND_UP(val32, 1000);
nvmet_set_result(req, req->sq->ctrl->kato); nvmet_set_result(req, req->sq->ctrl->kato);
break; break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment