Skip to content

Commit f0432b9

Browse files
committed
ioctl: fix dms command
The DSM ranges data struct needs to be initialized. The rework dropped this part. Also the number of ranges for CDW10 is a 0's value (sic). Fixes: 6c991dc ("src: rework nvme_dsm command") Signed-off-by: Daniel Wagner <[email protected]>
1 parent c0da9a5 commit f0432b9

File tree

2 files changed

+7
-3
lines changed

2 files changed

+7
-3
lines changed

libnvme/src/nvme/ioctl.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4410,7 +4410,7 @@ nvme_init_dsm(struct nvme_passthru_cmd *cmd,
44104410
cmd->nsid = nsid;
44114411
cmd->data_len = len;
44124412
cmd->addr = (__u64)(uintptr_t)data;
4413-
cmd->cdw10 = NVME_FIELD_ENCODE(nr,
4413+
cmd->cdw10 = NVME_FIELD_ENCODE(nr - 1,
44144414
NVME_DSM_CDW10_NR_SHIFT,
44154415
NVME_DSM_CDW10_NR_MASK);
44164416
cmd->cdw11 = NVME_FIELD_ENCODE(idr,

nvme.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7364,13 +7364,17 @@ static int dsm(int argc, char **argv, struct command *acmd, struct plugin *plugi
73647364
return err;
73657365
}
73667366
}
7367-
if (!cfg.cdw11)
7368-
cfg.cdw11 = (cfg.ad << 2) | (cfg.idw << 1) | (cfg.idr << 0);
7367+
if (cfg.cdw11) {
7368+
cfg.ad = NVME_GET(cfg.cdw11, DSM_CDW11_AD);
7369+
cfg.idw = NVME_GET(cfg.cdw11, DSM_CDW11_IDW);
7370+
cfg.idr = NVME_GET(cfg.cdw11, DSM_CDW11_IDR);
7371+
}
73697372

73707373
dsm = nvme_alloc(sizeof(*dsm) * 256);
73717374
if (!dsm)
73727375
return -ENOMEM;
73737376

7377+
nvme_init_dsm_range(dsm, ctx_attrs, nlbs, slbas, nr);
73747378
nvme_init_dsm(&cmd, cfg.namespace_id, nr, cfg.idr, cfg.idw, cfg.ad, dsm,
73757379
sizeof(*dsm) * 256);
73767380
err = nvme_submit_io_passthru(hdl, &cmd, NULL);

0 commit comments

Comments
 (0)