Skip to content

Commit

Permalink
nvmet: fix per feat data len for get_feature
Browse files Browse the repository at this point in the history
The existing implementation for the get_feature admin-cmd does not
use per-feature data len. This patch introduces a new helper function
nvmet_feat_data_len(), which is used to calculate per feature data len.
Right now we only set data len for fid 0x81 (NVME_FEAT_HOST_ID).

Fixes: commit e9061c3 ("nvmet: Remove the data_len field from the nvmet_req struct")

Reviewed-by: Christoph Hellwig <[email protected]>
Signed-off-by: Amit Engel <[email protected]>
[endiness, naming, and kernel style fixes]
Signed-off-by: Chaitanya Kulkarni <[email protected]>
Signed-off-by: Keith Busch <[email protected]>
Signed-off-by: Jens Axboe <[email protected]>
  • Loading branch information
Amit Engel authored and axboe committed Jan 10, 2020
1 parent 35038bf commit e17016f
Showing 1 changed file with 11 additions and 1 deletion.
12 changes: 11 additions & 1 deletion drivers/nvme/target/admin-cmd.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,16 @@ u32 nvmet_get_log_page_len(struct nvme_command *cmd)
return len;
}

static u32 nvmet_feat_data_len(struct nvmet_req *req, u32 cdw10)
{
switch (cdw10 & 0xff) {
case NVME_FEAT_HOST_ID:
return sizeof(req->sq->ctrl->hostid);
default:
return 0;
}
}

u64 nvmet_get_log_page_offset(struct nvme_command *cmd)
{
return le64_to_cpu(cmd->get_log_page.lpo);
Expand Down Expand Up @@ -778,7 +788,7 @@ static void nvmet_execute_get_features(struct nvmet_req *req)
u32 cdw10 = le32_to_cpu(req->cmd->common.cdw10);
u16 status = 0;

if (!nvmet_check_data_len(req, 0))
if (!nvmet_check_data_len(req, nvmet_feat_data_len(req, cdw10)))
return;

switch (cdw10 & 0xff) {
Expand Down

0 comments on commit e17016f

Please sign in to comment.