From: Daniel Wagner Date: Mon, 10 Jan 2022 17:29:51 +0000 (+0100) Subject: nvme: Adapt to API rework X-Git-Tag: v2.0-rc0~2^2 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=d10feb0b1b952b522e41156d5ed6512f9beb9e1c;p=users%2Fsagi%2Fnvme-cli.git nvme: Adapt to API rework libnvme changed the calling API, which uses an an argument structure instead of passing all arguments one by one. Update all call sites accordingly. Signed-off-by: Daniel Wagner --- diff --git a/nvme-rpmb.c b/nvme-rpmb.c index 05fc28a9..ab024bdd 100644 --- a/nvme-rpmb.c +++ b/nvme-rpmb.c @@ -266,14 +266,49 @@ struct rpmb_config_block_t { #define RPMB_NVME_SECP 0xEA #define RPMB_NVME_SPSP 0x0001 -#define SEND_RPMB_REQ(tgt, size, req) \ -nvme_security_send(fd, 0, tgt, RPMB_NVME_SPSP, 0, RPMB_NVME_SECP, 0, size, \ - (unsigned char *)(req), NVME_DEFAULT_IOCTL_TIMEOUT, NULL) - -#define RECV_RPMB_RSP(tgt, size, rsp) \ -nvme_security_receive(fd, 0, tgt, RPMB_NVME_SPSP, 0, RPMB_NVME_SECP, 0, size, \ - (unsigned char *)(rsp), NVME_DEFAULT_IOCTL_TIMEOUT, NULL) - +static int send_rpmb_req(int fd, unsigned char tgt, int size, + struct rpmb_data_frame_t *req) +{ + struct nvme_security_send_args args = { + .args_size = sizeof(args), + .fd = fd, + .nsid = 0, + .nssf = tgt, + .spsp0 = RPMB_NVME_SPSP, + .spsp1 = 0, + .secp = RPMB_NVME_SECP, + .tl = 0, + .data_len = size, + .data = (void *)req, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = NULL, + }; + + return nvme_security_send(&args); +} + +static int recv_rpmb_rsp(int fd, int tgt, int size, + struct rpmb_data_frame_t *rsp) +{ + + struct nvme_security_receive_args args = { + .args_size = sizeof(args), + .fd = fd, + .nsid = 0, + .nssf = tgt, + .spsp0 = RPMB_NVME_SPSP, + .spsp1 = 0, + .secp = RPMB_NVME_SECP, + .al = 0, + .data_len = size, + .data = (void *)rsp, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = NULL, + }; + + return nvme_security_receive(&args); +} + /* Initialize nonce value in rpmb request frame */ static void rpmb_nonce_init(struct rpmb_data_frame_t *req) { @@ -386,7 +421,7 @@ rpmb_read_request(int fd, sprintf((char *)msg, "RPMB request 0x%04x to target 0x%x", req->type, req->target); - error = SEND_RPMB_REQ(req->target, req_size, req); + error = send_rpmb_req(fd, req->target, req_size, req); if (error != 0) { fprintf(stderr, "%s failed with error = 0x%x\n", msg, error); @@ -401,7 +436,7 @@ rpmb_read_request(int fd, } /* Read result of previous request */ - error = RECV_RPMB_RSP(req->target, rsp_size, rsp); + error = recv_rpmb_rsp(fd, req->target, rsp_size, rsp); if (error) { fprintf(stderr, "error 0x%x receiving response for %s\n", error, msg); @@ -562,7 +597,7 @@ static int rpmb_program_auth_key(int fd, unsigned char target, /* re-use response buffer */ memset(rsp, 0, rsp_size); - err = RECV_RPMB_RSP(req->target, rsp_size, (unsigned char *)rsp); + err = recv_rpmb_rsp(fd, req->target, rsp_size, rsp); if (err != 0) { err = check_rpmb_response(req, rsp, "Failed to Program Key"); } @@ -622,7 +657,7 @@ static int auth_data_write_chunk(int fd, unsigned char tgt, unsigned int addr, memcpy(req->mac, mac, 32); /* send the request and get response */ - error = SEND_RPMB_REQ(tgt, req_size, (unsigned char *)req); + error = send_rpmb_req(fd, tgt, req_size, req); if (error != 0) { fprintf(stderr, "RPMB request 0x%04x for 0x%x, error: %d\n", req->type, tgt, error); @@ -633,7 +668,7 @@ static int auth_data_write_chunk(int fd, unsigned char tgt, unsigned int addr, rsp = (struct rpmb_data_frame_t *)calloc(rsp_size, 1); rsp->target = req->target; rsp->type = RPMB_REQ_READ_RESULT; - error = SEND_RPMB_REQ(tgt, rsp_size, (unsigned char *)rsp); + error = send_rpmb_req(fd, tgt, rsp_size, rsp); if (error != 0 || rsp->result != 0) { fprintf(stderr, "Write-data read result 0x%x, error = 0x%x\n", rsp->result, error); @@ -642,7 +677,7 @@ static int auth_data_write_chunk(int fd, unsigned char tgt, unsigned int addr, /* Read final response */ memset(rsp, 0, rsp_size); - error = RECV_RPMB_RSP(tgt, rsp_size, (unsigned char *)rsp); + error = recv_rpmb_rsp(fd, tgt, rsp_size, rsp); if (error != 0) fprintf(stderr, "Auth data write recv error = 0x%x\n", error); else @@ -727,7 +762,7 @@ static int rpmb_write_config_block(int fd, unsigned char *cfg_buf, memcpy(req->mac, mac, sizeof(req->mac)); - error = SEND_RPMB_REQ(0, req_size, (unsigned char *)req); + error = send_rpmb_req(fd, 0, req_size, req); if (error != 0) { fprintf(stderr, "Write-config RPMB request, error = 0x%x\n", error); @@ -747,7 +782,7 @@ static int rpmb_write_config_block(int fd, unsigned char *cfg_buf, rsp->target = req->target; rsp->type = RPMB_REQ_READ_RESULT; /* get the response and validate */ - error = RECV_RPMB_RSP(req->target, rsp_size, rsp); + error = recv_rpmb_rsp(fd, req->target, rsp_size, rsp); if (error != 0) { fprintf(stderr,"Failed getting write-config response\ error = 0x%x\n", error); diff --git a/nvme.c b/nvme.c index f91d5168..b3caa523 100644 --- a/nvme.c +++ b/nvme.c @@ -504,10 +504,20 @@ static int get_telemetry_log(int argc, char **argv, struct command *cmd, struct } memset(buf, 0, len); - err = nvme_get_features(fd, NVME_NSID_ALL, - NVME_FEAT_FID_HOST_BEHAVIOR, 0, 0, 0, - len, buf, NVME_DEFAULT_IOCTL_TIMEOUT, - &result); + struct nvme_get_features_args args = { + .args_size = sizeof(args), + .fd = fd, + .fid = NVME_FEAT_FID_HOST_BEHAVIOR, + .nsid = NVME_NSID_ALL, + .sel = 0, + .cdw11 = 0, + .uuidx = 0, + .data_len = len, + .data = buf, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = &result, + }; + err = nvme_get_features(&args); if (err > 0) { nvme_show_status(err); } else if (err < 0) { @@ -1624,10 +1634,24 @@ static int get_log(int argc, char **argv, struct command *cmd, struct plugin *pl goto close_fd; } - err = nvme_get_log(fd, cfg.log_id, cfg.namespace_id, - cfg.lpo, cfg.lsp, cfg.lsi, cfg.rae, - cfg.uuid_index, cfg.csi, cfg.ot, - cfg.log_len, log, NVME_DEFAULT_IOCTL_TIMEOUT, NULL); + struct nvme_get_log_args args = { + .args_size = sizeof(args), + .fd = fd, + .lid = cfg.log_id, + .nsid = cfg.namespace_id, + .lpo = cfg.lpo, + .lsp = cfg.lsp, + .lsi = cfg.lsi, + .rae = cfg.rae, + .uuidx = cfg.uuid_index, + .csi = cfg.csi, + .ot = cfg.ot, + .len = cfg.log_len, + .log = log, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = NULL, + }; + err = nvme_get_log(&args); if (!err) { if (!cfg.raw_binary) { printf("Device:%s log-id:%d namespace-id:%#x\n", @@ -2978,7 +3002,17 @@ static int virtual_mgmt(int argc, char **argv, struct command *cmd, struct plugi if (fd < 0) goto ret; - err = nvme_virtual_mgmt(fd, cfg.act, cfg.rt, cfg.cntlid, cfg.nr, &result); + struct nvme_virtual_mgmt_args args = { + .args_size = sizeof(args), + .fd = fd, + .act = cfg.act, + .rt = cfg.rt, + .cntlid = cfg.cntlid, + .nr = cfg.nr, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = &result, + }; + err = nvme_virtual_mgmt(&args); if (!err) { printf("success, Number of Controller Resources Modified "\ "(NRM):%#x\n", result); @@ -3148,7 +3182,15 @@ static int device_self_test(int argc, char **argv, struct command *cmd, struct p if (fd < 0) goto ret; - err = nvme_dev_self_test(fd, cfg.namespace_id, cfg.stc); + struct nvme_dev_self_test_args args = { + .args_size = sizeof(args), + .fd = fd, + .nsid = cfg.namespace_id, + .stc = cfg.stc, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = NULL, + }; + err = nvme_dev_self_test(&args); if (!err) { if (cfg.stc == 0xf) printf("Aborting device self-test operation\n"); @@ -3244,10 +3286,20 @@ static int get_feature_id(int fd, struct feat_cfg *cfg, void **buf, memset(*buf, 0, cfg->data_len); } - return nvme_get_features(fd, cfg->feature_id, cfg->namespace_id, - cfg->sel, cfg->cdw11, cfg->uuid_index, - cfg->data_len, *buf, - NVME_DEFAULT_IOCTL_TIMEOUT, result); + struct nvme_get_features_args args = { + .args_size = sizeof(args), + .fd = fd, + .fid = cfg->feature_id, + .nsid = cfg->namespace_id, + .sel = cfg->sel, + .cdw11 = cfg->cdw11, + .uuidx = cfg->uuid_index, + .data_len = cfg->data_len, + .data = *buf, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = result, + }; + return nvme_get_features(&args); } static void get_feature_id_print(struct feat_cfg cfg, int err, __u32 result, @@ -3506,8 +3558,16 @@ static int fw_download(int argc, char **argv, struct command *cmd, struct plugin while (fw_size > 0) { cfg.xfer = min(cfg.xfer, fw_size); - err = nvme_fw_download(fd, cfg.offset, cfg.xfer, fw_buf, - NVME_DEFAULT_IOCTL_TIMEOUT, NULL); + struct nvme_fw_download_args args = { + .args_size = sizeof(args), + .fd = fd, + .offset = cfg.offset, + .data_len = cfg.xfer, + .data = fw_buf, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = NULL, + }; + err = nvme_fw_download(&args); if (err < 0) { perror("fw-download"); break; @@ -3594,7 +3654,16 @@ static int fw_commit(int argc, char **argv, struct command *cmd, struct plugin * goto close_fd; } - err = nvme_fw_commit(fd, cfg.slot, cfg.action, cfg.bpid, &result); + struct nvme_fw_commit_args args = { + .args_size = sizeof(args), + .fd = fd, + .slot = cfg.slot, + .action = cfg.action, + .bpid = cfg.bpid, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = &result, + }; + err = nvme_fw_commit(&args); if (err < 0) perror("fw-commit"); else if (err != 0) @@ -3789,9 +3858,19 @@ static int sanitize(int argc, char **argv, struct command *cmd, struct plugin *p } } - ret = nvme_sanitize_nvm(fd, cfg.sanact, cfg.ause, cfg.owpass, cfg.oipbp, - cfg.no_dealloc, cfg.ovrpat, - NVME_DEFAULT_IOCTL_TIMEOUT, NULL); + struct nvme_sanitize_nvm_args args = { + .args_size = sizeof(args), + .fd = fd, + .sanact = cfg.sanact, + .ause = cfg.ause, + .owpass = cfg.owpass, + .oipbp = cfg.oipbp, + .nodas = cfg.no_dealloc, + .ovrpat = cfg.ovrpat, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = NULL, + }; + ret = nvme_sanitize_nvm(&args); if (ret < 0) perror("sanitize"); else if (ret > 0) @@ -3816,8 +3895,14 @@ static int nvme_get_properties(int fd, void **pbar) memset(*pbar, 0xff, size); for (offset = NVME_REG_CAP; offset <= NVME_REG_CMBSZ;) { - err = nvme_get_property(fd, offset, &value, - NVME_DEFAULT_IOCTL_TIMEOUT); + struct nvme_get_property_args args = { + .args_size = sizeof(args), + .fd = fd, + .offset = offset, + .value = &value, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + }; + err = nvme_get_property(&args); if (err > 0 && (err & 0xff) == NVME_SC_INVALID_FIELD) { err = 0; value = -1; @@ -3979,8 +4064,14 @@ static int get_property(int argc, char **argv, struct command *cmd, struct plugi goto close_fd; } - err = nvme_get_property(fd, cfg.offset, &value, - NVME_DEFAULT_IOCTL_TIMEOUT); + struct nvme_get_property_args args = { + .args_size = sizeof(args), + .fd = fd, + .offset = cfg.offset, + .value = &value, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + }; + err = nvme_get_property(&args); if (err < 0) { perror("get-property"); } else if (!err) { @@ -4034,8 +4125,15 @@ static int set_property(int argc, char **argv, struct command *cmd, struct plugi goto close_fd; } - err = nvme_set_property(fd, cfg.offset, cfg.value, - NVME_DEFAULT_IOCTL_TIMEOUT, NULL); + struct nvme_set_property_args args = { + .args_size = sizeof(args), + .fd = fd, + .offset = cfg.offset, + .value = cfg.value, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = NULL, + }; + err = nvme_set_property(&args); if (err < 0) { perror("set-property"); } else if (!err) { @@ -4236,8 +4334,19 @@ static int format(int argc, char **argv, struct command *cmd, struct plugin *plu fprintf(stderr, "Sending format operation ... \n"); } - err = nvme_format_nvm(fd, cfg.namespace_id, cfg.lbaf, cfg.ms, cfg.pi, - cfg.pil, cfg.ses, cfg.timeout, NULL); + struct nvme_format_nvm_args args = { + .args_size = sizeof(args), + .fd = fd, + .nsid = cfg.namespace_id, + .lbaf = cfg.lbaf, + .mset = cfg.ms, + .pi = cfg.pi, + .pil = cfg.pil, + .ses = cfg.ses, + .timeout = cfg.timeout, + .result = NULL, + }; + err = nvme_format_nvm(&args); if (err < 0) perror("format"); else if (err != 0) @@ -4417,9 +4526,22 @@ static int set_feature(int argc, char **argv, struct command *cmd, struct plugin } } - err = nvme_set_features(fd, cfg.feature_id, cfg.namespace_id, cfg.value, - cfg.cdw12, cfg.save, cfg.uuid_index, 0, - cfg.data_len, buf, NVME_DEFAULT_IOCTL_TIMEOUT, &result); + struct nvme_set_features_args args = { + .args_size = sizeof(args), + .fd = fd, + .fid = cfg.feature_id, + .nsid = cfg.namespace_id, + .cdw11 = cfg.value, + .cdw12 = cfg.cdw12, + .save = cfg.save, + .uuidx = cfg.uuid_index, + .cdw15 = 0, + .data_len = cfg.data_len, + .data = buf, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = &result, + }; + err = nvme_set_features(&args); if (err < 0) { perror("set-feature"); } else if (!err) { @@ -4544,10 +4666,21 @@ static int sec_send(int argc, char **argv, struct command *cmd, struct plugin *p goto free; } - err = nvme_security_send(fd, cfg.namespace_id, cfg.nssf, - cfg.spsp & 0xff, cfg.spsp >> 8, cfg.secp, - cfg.tl, cfg.tl, sec_buf, - NVME_DEFAULT_IOCTL_TIMEOUT, NULL); + struct nvme_security_send_args args = { + .args_size = sizeof(args), + .fd = fd, + .nsid = cfg.namespace_id, + .nssf = cfg.nssf, + .spsp0 = cfg.spsp & 0xff, + .spsp1 = cfg.spsp >> 8, + .secp = cfg.secp, + .tl = cfg.tl, + .data_len = cfg.tl, + .data = sec_buf, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = NULL, + }; + err = nvme_security_send(&args); if (err < 0) perror("security-send"); else if (err != 0) @@ -4687,9 +4820,20 @@ static int dir_send(int argc, char **argv, struct command *cmd, struct plugin *p } } - err = nvme_directive_send(fd, cfg.namespace_id, cfg.dspec, cfg.doper, - cfg.dtype, dw12, cfg.data_len, buf, - NVME_DEFAULT_IOCTL_TIMEOUT, &result); + struct nvme_directive_send_args args = { + .args_size = sizeof(args), + .fd = fd, + .nsid = cfg.namespace_id, + .dspec = cfg.dspec, + .doper = cfg.doper, + .dtype = cfg.dtype, + .cdw12 = dw12, + .data_len = cfg.data_len, + .data = buf, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = &result, + }; + err = nvme_directive_send(&args); if (err < 0) { perror("dir-send"); goto close_ffd; @@ -4760,8 +4904,16 @@ static int write_uncor(int argc, char **argv, struct command *cmd, struct plugin } } - err = nvme_write_uncorrectable(fd, cfg.namespace_id, cfg.start_block, - cfg.block_count, NVME_DEFAULT_IOCTL_TIMEOUT); + struct nvme_io_args args = { + .args_size = sizeof(args), + .fd = fd, + .nsid = cfg.namespace_id, + .slba = cfg.start_block, + .nlb = cfg.block_count, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = NULL, + }; + err = nvme_write_uncorrectable(&args); if (err < 0) perror("write uncorrectable"); else if (err != 0) @@ -4868,10 +5020,21 @@ static int write_zeroes(int argc, char **argv, struct command *cmd, struct plugi } } - err = nvme_write_zeros(fd, cfg.namespace_id, cfg.start_block, - cfg.block_count, control, cfg.ref_tag, - cfg.app_tag, cfg.app_tag_mask, cfg.storage_tag, - NVME_DEFAULT_IOCTL_TIMEOUT); + struct nvme_io_args args = { + .args_size = sizeof(args), + .fd = fd, + .nsid = cfg.namespace_id, + .slba = cfg.start_block, + .nlb = cfg.block_count, + .control = control, + .reftag = cfg.ref_tag, + .apptag = cfg.app_tag, + .appmask = cfg.app_tag_mask, + .storage_tag = cfg.storage_tag, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = NULL, + }; + err = nvme_write_zeros(&args); if (err < 0) perror("write-zeroes"); else if (err != 0) @@ -4966,8 +5129,17 @@ static int dsm(int argc, char **argv, struct command *cmd, struct plugin *plugin cfg.cdw11 = (cfg.ad << 2) | (cfg.idw << 1) | (cfg.idr << 0); nvme_init_dsm_range(dsm, ctx_attrs, nlbs, slbas, nr); - err = nvme_dsm(fd, cfg.namespace_id, cfg.cdw11, nr, dsm, - NVME_DEFAULT_IOCTL_TIMEOUT, NULL); + struct nvme_dsm_args args = { + .args_size = sizeof(args), + .fd = fd, + .nsid = cfg.namespace_id, + .attrs = cfg.cdw11, + .nr_ranges = nr, + .dsm = dsm, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = NULL, + }; + err = nvme_dsm(&args); if (err < 0) perror("data-set management"); else if (err != 0) @@ -5094,10 +5266,26 @@ static int copy(int argc, char **argv, struct command *cmd, struct plugin *plugi nvme_init_copy_range(copy, nlbs, (__u64 *)slbas, eilbrts, elbatms, elbats, nr); - err = nvme_copy(fd, cfg.namespace_id, copy, cfg.sdlba, nr, cfg.prinfor, - cfg.prinfow, cfg.dtype, cfg.dspec, cfg.format, cfg.lr, - cfg.fua, cfg.ilbrt, cfg.lbatm, cfg.lbat, - NVME_DEFAULT_IOCTL_TIMEOUT, NULL); + struct nvme_copy_args args = { + .args_size = sizeof(args), + .fd = fd, + .nsid = cfg.namespace_id, + .copy = copy, + .sdlba = cfg.sdlba, + .nr = nr, + .prinfor = cfg.prinfor, + .dtype = cfg.dtype, + .dspec = cfg.dspec, + .format = cfg.format, + .lr = cfg.lr, + .fua = cfg.fua, + .ilbrt = cfg.ilbrt, + .lbatm = cfg.lbatm, + .lbat = cfg.lbat, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = NULL, + }; + err = nvme_copy(&args); if (err < 0) perror("NVMe Copy"); else if (err != 0) @@ -5219,9 +5407,19 @@ static int resv_acquire(int argc, char **argv, struct command *cmd, struct plugi goto close_fd; } - err = nvme_resv_acquire(fd, cfg.namespace_id, cfg.rtype, cfg.racqa, - !!cfg.iekey, cfg.crkey, cfg.prkey, - NVME_DEFAULT_IOCTL_TIMEOUT, NULL); + struct nvme_resv_acquire_args args = { + .args_size = sizeof(args), + .fd = fd, + .nsid = cfg.namespace_id, + .rtype = cfg.rtype, + .racqa = cfg.racqa, + .iekey = !!cfg.iekey, + .crkey = cfg.crkey, + .nrkey = cfg.prkey, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = NULL, + }; + err = nvme_resv_acquire(&args); if (err < 0) perror("reservation acquire"); else if (err != 0) @@ -5298,9 +5496,19 @@ static int resv_register(int argc, char **argv, struct command *cmd, struct plug goto close_fd; } - err = nvme_resv_register(fd, cfg.namespace_id, cfg.rrega, cfg.cptpl, - !!cfg.iekey, cfg.crkey, cfg.nrkey, - NVME_DEFAULT_IOCTL_TIMEOUT, NULL); + struct nvme_resv_register_args args = { + .args_size = sizeof(args), + .fd = fd, + .nsid = cfg.namespace_id, + .rrega = cfg.rrega, + .cptpl = cfg.cptpl, + .iekey = !!cfg.iekey, + .crkey = cfg.crkey, + .nrkey = cfg.nrkey, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = NULL, + }; + err = nvme_resv_register(&args); if (err < 0) perror("reservation register"); else if (err != 0) @@ -5373,9 +5581,18 @@ static int resv_release(int argc, char **argv, struct command *cmd, struct plugi goto close_fd; } - err = nvme_resv_release(fd, cfg.namespace_id, cfg.rtype, cfg.rrela, - !!cfg.iekey, cfg.crkey, - NVME_DEFAULT_IOCTL_TIMEOUT, NULL); + struct nvme_resv_release_args args = { + .args_size = sizeof(args), + .fd = fd, + .nsid = cfg.namespace_id, + .rtype = cfg.rtype, + .rrela = cfg.rrela, + .iekey = !!cfg.iekey, + .crkey = cfg.crkey, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = NULL, + }; + err = nvme_resv_release(&args); if (err < 0) perror("reservation release"); else if (err != 0) @@ -5461,8 +5678,17 @@ static int resv_report(int argc, char **argv, struct command *cmd, struct plugin } memset(status, 0, size); - err = nvme_resv_report(fd, cfg.namespace_id, cfg.eds, size, status, - NVME_DEFAULT_IOCTL_TIMEOUT, NULL); + struct nvme_resv_report_args args = { + .args_size = sizeof(args), + .fd = fd, + .nsid = cfg.namespace_id, + .eds = cfg.eds, + .len = size, + .report = status, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = NULL, + }; + err = nvme_resv_report(&args); if (!err) nvme_show_resv_report(status, size, cfg.eds, flags); else if (err > 0) @@ -5750,19 +5976,31 @@ static int submit_io(int opcode, char *command, const char *desc, if (cfg.dry_run) goto free_mbuffer; + struct nvme_io_args args = { + .args_size = sizeof(args), + .fd = fd, + .nsid = cfg.namespace_id, + .slba = cfg.start_block, + .nlb = cfg.block_count, + .control = control, + .dsm = dsmgmt, + .dspec = 0, + .reftag = cfg.ref_tag, + .apptag = cfg.app_tag, + .appmask = cfg.app_tag_mask, + .storage_tag = cfg.storage_tag, + .data_len = buffer_size, + .data = buffer, + .metadata_len = cfg.metadata_size, + .metadata = mbuffer, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = NULL, + }; gettimeofday(&start_time, NULL); if (opcode & 1) - err = nvme_write(fd, cfg.namespace_id, cfg.start_block, - cfg.block_count, control, dsmgmt, 0, cfg.ref_tag, - cfg.app_tag, cfg.app_tag_mask, cfg.storage_tag, - buffer_size, buffer, cfg.metadata_size, mbuffer, - NVME_DEFAULT_IOCTL_TIMEOUT); + err = nvme_write(&args); else - err = nvme_read(fd, cfg.namespace_id, cfg.start_block, - cfg.block_count, control, dsmgmt, cfg.ref_tag, - cfg.app_tag, cfg.app_tag_mask, cfg.storage_tag, - buffer_size, buffer, cfg.metadata_size, mbuffer, - NVME_DEFAULT_IOCTL_TIMEOUT); + err = nvme_read(&args); gettimeofday(&end_time, NULL); if (cfg.latency) printf(" latency: %s: %llu us\n", @@ -5910,10 +6148,21 @@ static int verify_cmd(int argc, char **argv, struct command *cmd, struct plugin } } - err = nvme_verify(fd, cfg.namespace_id, cfg.start_block, - cfg.block_count, control, cfg.ref_tag, - cfg.app_tag, cfg.app_tag_mask, cfg.storage_tag, - NVME_DEFAULT_IOCTL_TIMEOUT); + struct nvme_io_args args = { + .args_size = sizeof(args), + .fd = fd, + .nsid = cfg.namespace_id, + .slba = cfg.start_block, + .nlb = cfg.block_count, + .control = control, + .reftag = cfg.ref_tag, + .apptag = cfg.app_tag, + .appmask = cfg.app_tag_mask, + .storage_tag = cfg.storage_tag, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = NULL, + }; + err = nvme_verify(&args); if (err < 0) perror("verify"); else if (err != 0) @@ -5986,10 +6235,21 @@ static int sec_recv(int argc, char **argv, struct command *cmd, struct plugin *p } } - err = nvme_security_receive(fd, cfg.namespace_id, cfg.nssf, - cfg.spsp & 0xff, cfg.spsp >> 8, - cfg.secp, cfg.al, cfg.size, sec_buf, - NVME_DEFAULT_IOCTL_TIMEOUT, NULL); + struct nvme_security_receive_args args = { + .args_size = sizeof(args), + .fd = fd, + .nsid = cfg.namespace_id, + .nssf = cfg.nssf, + .spsp0 = cfg.spsp & 0xff, + .spsp1 = cfg.spsp >> 8, + .secp = cfg.secp, + .al = cfg.al, + .data_len = cfg.size, + .data = sec_buf, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = NULL, + }; + err = nvme_security_receive(&args); if (err < 0) perror("security receive"); else if (err != 0) @@ -6084,9 +6344,19 @@ static int get_lba_status(int argc, char **argv, struct command *cmd, goto close_fd; } - err = nvme_get_lba_status(fd, cfg.namespace_id, cfg.slba, cfg.mndw, - cfg.atype, cfg.rl, NVME_DEFAULT_IOCTL_TIMEOUT, - buf, NULL); + struct nvme_get_lba_status_args args = { + .args_size = sizeof(args), + .fd = fd, + .nsid = cfg.namespace_id, + .slba = cfg.slba, + .mndw = cfg.mndw, + .rl = cfg.rl, + .atype = cfg.atype, + .lbas = buf, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = NULL, + }; + err = nvme_get_lba_status(&args); if (!err) nvme_show_lba_status(buf, buf_len, flags); else if (err > 0) @@ -6149,8 +6419,17 @@ static int capacity_mgmt(int argc, char **argv, struct command *cmd, struct plug goto close_fd; } - err = nvme_capacity_mgmt(fd, cfg.operation, cfg.element_id, cfg.dw11, - cfg.dw12, NVME_DEFAULT_IOCTL_TIMEOUT, &result); + struct nvme_capacity_mgmt_args args = { + .args_size = sizeof(args), + .fd = fd, + .op = cfg.operation, + .element_id = cfg.element_id, + .cdw11 = cfg.dw11, + .cdw12 = cfg.dw12, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = &result, + }; + err = nvme_capacity_mgmt(&args); if (!err) { printf("Capacity Management Command is Success\n"); if (cfg.operation == 1) { @@ -6275,9 +6554,20 @@ static int dir_receive(int argc, char **argv, struct command *cmd, struct plugin memset(buf, 0, cfg.data_len); } - err = nvme_directive_recv(fd, cfg.namespace_id, cfg.dspec, cfg.doper, - cfg.dtype, dw12, cfg.data_len, buf, - NVME_DEFAULT_IOCTL_TIMEOUT, &result); + struct nvme_directive_recv_args args = { + .args_size = sizeof(args), + .fd = fd, + .nsid = cfg.namespace_id, + .dspec = cfg.dspec, + .doper = cfg.doper, + .dtype = cfg.dtype, + .cdw12 = dw12, + .data_len = cfg.data_len, + .data = buf, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = &result, + }; + err = nvme_directive_recv(&args); if (!err) nvme_directive_show(cfg.dtype, cfg.doper, cfg.dspec, cfg.namespace_id, result, buf, cfg.data_len, @@ -6379,9 +6669,18 @@ static int lockdown_cmd(int argc, char **argv, struct command *cmd, struct plugi goto close_fd; } - err = nvme_lockdown(fd, cfg.scp,cfg.prhbt,cfg.ifc,cfg.ofi, - cfg.uuid); - + struct nvme_lockdown_args args = { + .args_size = sizeof(args), + .fd = fd, + .scp = cfg.scp, + .prhbt = cfg.prhbt, + .ifc = cfg.ifc, + .ofi = cfg.ofi, + .uuidx = cfg.uuid, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = NULL, + }; + err = nvme_lockdown(&args); if (err < 0) perror("lockdown"); else if (err > 0) diff --git a/plugins/intel/intel-nvme.c b/plugins/intel/intel-nvme.c index 0ec83047..6afd4084 100644 --- a/plugins/intel/intel-nvme.c +++ b/plugins/intel/intel-nvme.c @@ -1068,9 +1068,20 @@ static int get_lat_stats_log(int argc, char **argv, struct command *cmd, struct __u32 thresholds[OPTANE_V1000_BUCKET_LEN] = {0}; __u32 result; - err = nvme_get_features(fd, 0xf7, 0, 0, cfg.write ? 0x1 : 0x0, 0, - sizeof(thresholds), thresholds, - NVME_DEFAULT_IOCTL_TIMEOUT, &result); + struct nvme_get_features_args args = { + .args_size = sizeof(args), + .fd = fd, + .fid = 0xf7, + .nsid = 0, + .sel = 0, + .cdw11 = cfg.write ? 0x1 : 0x0, + .uuidx = 0, + .data_len = sizeof(thresholds), + .data = thresholds, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = &result, + }; + err = nvme_get_features(&args); if (err) { fprintf(stderr, "Quering thresholds failed. "); nvme_show_status(err); @@ -1549,10 +1560,40 @@ static int enable_lat_stats_tracking(int argc, char **argv, if (fd < 0) return fd; + + struct nvme_get_features_args args_get = { + .args_size = sizeof(args_get), + .fd = fd, + .fid = fid, + .nsid = nsid, + .sel = sel, + .cdw11 = cdw11, + .uuidx = 0, + .data_len = data_len, + .data = buf, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = &result, + }; + + struct nvme_set_features_args args_set = { + .args_size = sizeof(args_set), + .fd = fd, + .fid = fid, + .nsid = nsid, + .cdw11 = option, + .cdw12 = cdw12, + .save = save, + .uuidx = 0, + .cdw15 = 0, + .data_len = data_len, + .data = buf, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = &result, + }; + switch (option) { case None: - err = nvme_get_features(fd, fid, nsid, sel, cdw11, 0, data_len, buf, - NVME_DEFAULT_IOCTL_TIMEOUT, &result); + err = nvme_get_features(&args_get); if (!err) { printf( "Latency Statistics Tracking (FID 0x%X) is currently (%i).\n", @@ -1564,9 +1605,7 @@ static int enable_lat_stats_tracking(int argc, char **argv, break; case True: case False: - err = nvme_set_features(fd, fid, nsid, option, cdw12, save, 0, - 0, data_len, buf, - NVME_DEFAULT_IOCTL_TIMEOUT, &result); + err = nvme_set_features(&args_set); if (err > 0) { nvme_show_status(err); } else if (err < 0) { @@ -1643,10 +1682,22 @@ static int set_lat_stats_thresholds(int argc, char **argv, } - err = nvme_set_features(fd, fid, nsid, cfg.write ? 0x1 : 0x0, - cdw12, save, 0, 0, sizeof(thresholds), - thresholds, NVME_DEFAULT_IOCTL_TIMEOUT, - &result); + struct nvme_set_features_args args = { + .args_size = sizeof(args), + .fd = fd, + .fid = fid, + .nsid = nsid, + .cdw11 = cfg.write ? 0x1 : 0x0, + .cdw12 = cdw12, + .save = save, + .uuidx = 0, + .cdw15 = 0, + .data_len = sizeof(thresholds), + .data = thresholds, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = &result, + }; + err = nvme_set_features(&args); if (err > 0) { nvme_show_status(err); diff --git a/plugins/memblaze/memblaze-nvme.c b/plugins/memblaze/memblaze-nvme.c index 55080b29..df2089b5 100644 --- a/plugins/memblaze/memblaze-nvme.c +++ b/plugins/memblaze/memblaze-nvme.c @@ -456,7 +456,7 @@ static int mb_get_additional_smart_log(int argc, char **argv, struct command *cm if (fd < 0) return fd; - err = nvme_get_nsid_log(fd, 0xca, cfg.namespace_id, + err = nvme_get_nsid_log(fd, false, 0xca, cfg.namespace_id, sizeof(smart_log), &smart_log); if (!err) { if (!cfg.raw_binary) @@ -494,8 +494,20 @@ static int mb_get_powermanager_status(int argc, char **argv, struct command *cmd fd = parse_and_open(argc, argv, desc, opts); if (fd < 0) return fd; - err = nvme_get_features(fd, feature_id, 0, 0, 0, 0, 0, NULL, - NVME_DEFAULT_IOCTL_TIMEOUT, &result); + struct nvme_get_features_args args = { + .args_size = sizeof(args), + .fd = fd, + .fid = feature_id, + .nsid = 0, + .sel = 0, + .cdw11 = 0, + .uuidx = 0, + .data_len = 0, + .data = NULL, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = &result, + }; + err = nvme_get_features(&args); if (err < 0) { perror("get-feature"); } @@ -537,8 +549,22 @@ static int mb_set_powermanager_status(int argc, char **argv, struct command *cmd fd = parse_and_open(argc, argv, desc, opts); if (fd < 0) return fd; - err = nvme_set_features(fd, cfg.feature_id, 0, cfg.value, 0, cfg.save, - 0, 0, 0, NULL, NVME_DEFAULT_IOCTL_TIMEOUT, &result); + struct nvme_set_features_args args = { + .args_size = sizeof(args), + .fd = fd, + .fid = cfg.feature_id, + .nsid = 0, + .cdw11 = cfg.value, + .cdw12 = 0, + .save = cfg.save, + .uuidx = 0, + .cdw15 = 0, + .data_len = 0, + .data = NULL, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = &result, + }; + err = nvme_set_features(&args); if (err < 0) { perror("set-feature"); } @@ -595,8 +621,22 @@ static int mb_set_high_latency_log(int argc, char **argv, struct command *cmd, s } cfg.value = (param1 << MB_FEAT_HIGH_LATENCY_VALUE_SHIFT) | param2; - err = nvme_set_features(fd, cfg.feature_id, 0, cfg.value, 0, 0, 0, 0, 0, - NULL, NVME_DEFAULT_IOCTL_TIMEOUT, &result); + struct nvme_set_features_args args = { + .args_size = sizeof(args), + .fd = fd, + .fid = cfg.feature_id, + .nsid = 0, + .cdw11 = cfg.value, + .cdw12 = 0, + .save = false, + .uuidx = 0, + .cdw15 = 0, + .data_len = 0, + .data = NULL, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = &result, + }; + err = nvme_set_features(&args); if (err < 0) { perror("set-feature"); } @@ -833,8 +873,16 @@ static int mb_selective_download(int argc, char **argv, struct command *cmd, str while (fw_size > 0) { xfer = min(xfer, fw_size); - err = nvme_fw_download(fd, offset, xfer, fw_buf, - NVME_DEFAULT_IOCTL_TIMEOUT, NULL); + struct nvme_fw_download_args args = { + .args_size = sizeof(args), + .fd = fd, + .offset = offset, + .data_len = xfer, + .data = fw_buf, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = NULL, + }; + err = nvme_fw_download(&args); if (err < 0) { perror("fw-download"); goto out; @@ -1030,10 +1078,22 @@ static int memblaze_clear_error_log(int argc, char **argv, struct command *cmd, if (fd < 0) return fd; - - - err = nvme_set_features(fd, cfg.feature_id, 0, cfg.value, 0, cfg.save, - 0, 0, 0, NULL, NVME_DEFAULT_IOCTL_TIMEOUT, &result); + struct nvme_set_features_args args = { + .args_size = sizeof(args), + .fd = fd, + .fid = cfg.feature_id, + .nsid = 0, + .cdw11 = cfg.value, + .cdw12 = 0, + .save = cfg.save, + .uuidx = 0, + .cdw15 = 0, + .data_len = 0, + .data = NULL, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = &result, + }; + err = nvme_set_features(&args); if (err < 0) { perror("set-feature"); } @@ -1107,13 +1167,41 @@ static int mb_set_lat_stats(int argc, char **argv, else if (cfg.enable || cfg.disable) option = cfg.enable; + struct nvme_get_features_args args_get = { + .args_size = sizeof(args_get), + .fd = fd, + .fid = fid, + .nsid = nsid, + .sel = sel, + .cdw11 = cdw11, + .uuidx = 0, + .data_len = data_len, + .data = buf, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = &result, + }; + + struct nvme_set_features_args args_set = { + .args_size = sizeof(args_set), + .fd = fd, + .fid = fid, + .nsid = nsid, + .cdw11 = option, + .cdw12 = cdw12, + .save = save, + .uuidx = 0, + .cdw15 = 0, + .data_len = data_len, + .data = buf, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = &result, + }; + if (fd < 0) return fd; switch (option) { case None: - err = nvme_get_features(fd, nsid, fid, sel, cdw11, 0, - data_len, buf, - NVME_DEFAULT_IOCTL_TIMEOUT, &result); + err = nvme_get_features(&args_get); if (!err) { printf( "Latency Statistics Tracking (FID 0x%X) is currently (%i).\n", @@ -1125,9 +1213,7 @@ static int mb_set_lat_stats(int argc, char **argv, break; case True: case False: - err = nvme_set_features(fd, fid, nsid, option, cdw12, save, - 0, 0, data_len, buf, - NVME_DEFAULT_IOCTL_TIMEOUT, &result); + err = nvme_set_features(&args_set); if (err > 0) { nvme_show_status(err); } else if (err < 0) { diff --git a/plugins/micron/micron-nvme.c b/plugins/micron/micron-nvme.c index 3ac90158..90aebb7f 100644 --- a/plugins/micron/micron-nvme.c +++ b/plugins/micron/micron-nvme.c @@ -555,8 +555,16 @@ static int micron_selective_download(int argc, char **argv, while (fw_size > 0) { xfer = min(xfer, fw_size); - err = nvme_fw_download(fd, offset, xfer, fw_buf, - NVME_DEFAULT_IOCTL_TIMEOUT, NULL); + struct nvme_fw_download_args args = { + .args_size = sizeof(args), + .fd = fd, + .offset = offset, + .data_len = xfer, + .data = fw_buf, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = NULL, + }; + err = nvme_fw_download(&args); if (err < 0) { perror("fw-download"); goto out; @@ -585,7 +593,6 @@ static int micron_smbus_option(int argc, char **argv, struct command *cmd, struct plugin *plugin) { __u32 result = 0; - __u32 cdw10 = 0; __u32 cdw11 = 0; const char *desc = "Enable/Disable/Get status of SMBUS option on controller"; const char *option = "enable or disable or status"; @@ -636,9 +643,20 @@ static int micron_smbus_option(int argc, char **argv, } } else if (!strcmp(opt.option, "status")) { - cdw10 = opt.value; - err = nvme_get_features(fd, fid, 1, 0, cdw10, 0, 0, NULL, - NVME_DEFAULT_IOCTL_TIMEOUT, &result); + struct nvme_get_features_args args = { + .args_size = sizeof(args), + .fd = fd, + .fid = fid, + .nsid = 1, + .sel = opt.value, + .cdw11 = 0, + .uuidx = 0, + .data_len = 0, + .data = NULL, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = &result, + }; + err = nvme_get_features(&args); if (err == 0) { printf("SMBus status on the drive: %s (returns %s temperature) \n", (result & 1) ? "enabled" : "disabled", @@ -1845,8 +1863,20 @@ static int GetFeatureSettings(int fd, const char *dir) bufp = NULL; } - err = nvme_get_features(fd, fmap[i].id, 1, 0, 0x0, 0, len, bufp, - NVME_DEFAULT_IOCTL_TIMEOUT, &attrVal); + struct nvme_get_features_args args = { + .args_size = sizeof(args), + .fd = fd, + .fid = fmap[i].id, + .nsid = 1, + .sel = 0, + .cdw11 = 0x0, + .uuidx = 0, + .data_len = len, + .data = bufp, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = &attrVal, + }; + err = nvme_get_features(&args); if (err == 0) { sprintf(msg, "feature: 0x%X", fmap[i].id); WriteData((__u8*)&attrVal, sizeof(attrVal), dir, fmap[i].file, msg); @@ -2320,25 +2350,65 @@ static int micron_telemetry_cntrl_option(int argc, char **argv, } if (!strcmp(opt.option, "enable")) { - err = nvme_set_features(fd, fid, 1, 1, 0, (opt.select & 0x1), - 0, 0, 0, 0, NVME_DEFAULT_IOCTL_TIMEOUT, &result); + struct nvme_set_features_args args = { + .args_size = sizeof(args), + .fd = fd, + .fid = fid, + .nsid = 1, + .cdw11 = 1, + .cdw12 = 0, + .save = (opt.select & 0x1), + .uuidx = 0, + .cdw15 = 0, + .data_len = 0, + .data = NULL, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = &result, + }; + err = nvme_set_features(&args); if (err == 0) { printf("successfully set controller telemetry option\n"); } else { printf("Failed to set controller telemetry option\n"); } } else if (!strcmp(opt.option, "disable")) { - err = nvme_set_features(fd, fid, 1, 0, 0, (opt.select & 0x1), - 0, 0, 0, 0, NVME_DEFAULT_IOCTL_TIMEOUT, &result); + struct nvme_set_features_args args = { + .args_size = sizeof(args), + .fd = fd, + .fid = fid, + .nsid = 1, + .cdw11 = 0, + .cdw12 = 0, + .save = (opt.select & 0x1), + .uuidx = 0, + .cdw15 = 0, + .data_len = 0, + .data = NULL, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = &result, + }; + err = nvme_set_features(&args); if (err == 0) { printf("successfully disabled controller telemetry option\n"); } else { printf("Failed to disable controller telemetry option\n"); } } else if (!strcmp(opt.option, "status")) { - opt.select &= 0x3; - err = nvme_get_features(fd, fid, 1, opt.select, 0, 0, 0, 0, - NVME_DEFAULT_IOCTL_TIMEOUT, &result); + ; + struct nvme_get_features_args args = { + .args_size = sizeof(args), + .fd = fd, + .fid = fid, + .nsid = 1, + .sel = opt.select & 0x3, + .cdw11 = 0, + .uuidx = 0, + .data_len = 0, + .data = NULL, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = &result, + }; + err = nvme_get_features(&args); if (err == 0) { printf("Controller telemetry option : %s\n", (result) ? "enabled" : "disabled"); diff --git a/plugins/scaleflux/sfx-nvme.c b/plugins/scaleflux/sfx-nvme.c index 8cc0469a..cb04847c 100644 --- a/plugins/scaleflux/sfx-nvme.c +++ b/plugins/scaleflux/sfx-nvme.c @@ -356,7 +356,7 @@ static int get_additional_smart_log(int argc, char **argv, struct command *cmd, fd = parse_and_open(argc, argv, desc, opts); - err = nvme_get_nsid_log(fd, 0xca, cfg.namespace_id, + err = nvme_get_nsid_log(fd, false, 0xca, cfg.namespace_id, sizeof(smart_log), (void *)&smart_log); if (!err) { if (cfg.json) diff --git a/plugins/seagate/seagate-nvme.c b/plugins/seagate/seagate-nvme.c index da6401c7..e71e51c5 100644 --- a/plugins/seagate/seagate-nvme.c +++ b/plugins/seagate/seagate-nvme.c @@ -1089,7 +1089,7 @@ static int get_host_tele(int argc, char **argv, struct command *cmd, struct plug dump_fd = STDOUT_FILENO; cfg.log_id = (cfg.log_id << 8) | 0x07; - err = nvme_get_nsid_log(fd, cfg.log_id, cfg.namespace_id, + err = nvme_get_nsid_log(fd, false, cfg.log_id, cfg.namespace_id, sizeof(tele_log), (void *)(&tele_log)); if (!err) { maxBlk = tele_log.tele_data_area3; @@ -1127,10 +1127,24 @@ static int get_host_tele(int argc, char **argv, struct command *cmd, struct plug memset(log, 0, blksToGet * 512); - err = nvme_get_log(fd, cfg.log_id, cfg.namespace_id, offset, - 0, 0, true, 0, NVME_CSI_NVM, false, - blksToGet * 512, (void *)log, - NVME_DEFAULT_IOCTL_TIMEOUT, NULL); + struct nvme_get_log_args args = { + .args_size = sizeof(args), + .fd = fd, + .lid = cfg.log_id, + .nsid = cfg.namespace_id, + .lpo = offset, + .lsp = 0, + .lsi = 0, + .rae = true, + .uuidx = 0, + .csi = NVME_CSI_NVM, + .ot = false, + .len = blksToGet * 512, + .log = (void *)log, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = NULL, + }; + err = nvme_get_log(&args); if (!err) { offset += blksToGet * 512; @@ -1188,7 +1202,7 @@ static int get_ctrl_tele(int argc, char **argv, struct command *cmd, struct plug dump_fd = STDOUT_FILENO; log_id = 0x08; - err = nvme_get_nsid_log(fd, log_id, cfg.namespace_id, + err = nvme_get_nsid_log(fd, false, log_id, cfg.namespace_id, sizeof(tele_log), (void *)(&tele_log)); if (!err) { maxBlk = tele_log.tele_data_area3; @@ -1225,10 +1239,24 @@ static int get_ctrl_tele(int argc, char **argv, struct command *cmd, struct plug memset(log, 0, blksToGet * 512); - err = nvme_get_log(fd, log_id, cfg.namespace_id, offset, 0, 0, - true, 0, NVME_CSI_NVM, false, - blksToGet * 512, (void *)log, - NVME_DEFAULT_IOCTL_TIMEOUT, NULL); + struct nvme_get_log_args args = { + .args_size = sizeof(args), + .fd = fd, + .lid = log_id, + .nsid = cfg.namespace_id, + .lpo = offset, + .lsp = 0, + .lsi = 0, + .rae = true, + .uuidx = 0, + .csi = NVME_CSI_NVM, + .ot = false, + .len = blksToGet * 512, + .log = (void *)log, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = NULL, + }; + err = nvme_get_log(&args); if (!err) { offset += blksToGet * 512; @@ -1311,7 +1339,7 @@ static int vs_internal_log(int argc, char **argv, struct command *cmd, struct pl } log_id = 0x08; - err = nvme_get_nsid_log(fd, log_id, cfg.namespace_id, + err = nvme_get_nsid_log(fd, false, log_id, cfg.namespace_id, sizeof(tele_log), (void *)(&tele_log)); if (!err) { maxBlk = tele_log.tele_data_area3; @@ -1345,10 +1373,24 @@ static int vs_internal_log(int argc, char **argv, struct command *cmd, struct pl memset(log, 0, blksToGet * 512); - err = nvme_get_log(fd, log_id, cfg.namespace_id, offset, 0, 0, - true, 0, NVME_CSI_NVM, false, - blksToGet * 512, (void *)log, - NVME_DEFAULT_IOCTL_TIMEOUT, NULL); + struct nvme_get_log_args args = { + .args_size = sizeof(args), + .fd = fd, + .lid = log_id, + .nsid = cfg.namespace_id, + .lpo = offset, + .lsp = 0, + .lsi = 0, + .rae = true, + .uuidx = 0, + .csi = NVME_CSI_NVM, + .ot = false, + .len = blksToGet * 512, + .log = (void *)log, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = NULL, + }; + err = nvme_get_log(&args); if (!err) { offset += blksToGet * 512; diff --git a/plugins/shannon/shannon-nvme.c b/plugins/shannon/shannon-nvme.c index 46373ba8..0f4b6840 100644 --- a/plugins/shannon/shannon-nvme.c +++ b/plugins/shannon/shannon-nvme.c @@ -137,7 +137,7 @@ static int get_additional_smart_log(int argc, char **argv, struct command *cmd, }; fd = parse_and_open(argc, argv, desc, opts); - err = nvme_get_nsid_log(fd, 0xca, cfg.namespace_id, + err = nvme_get_nsid_log(fd, false, 0xca, cfg.namespace_id, sizeof(smart_log), &smart_log); if (!err) { if (!cfg.raw_binary) @@ -226,9 +226,20 @@ static int get_additional_feature(int argc, char **argv, struct command *cmd, st memset(buf, 0, cfg.data_len); } - err = nvme_get_features(fd, cfg.feature_id, cfg.namespace_id, cfg.sel, - cfg.cdw11, 0, cfg.data_len, buf, - NVME_DEFAULT_IOCTL_TIMEOUT, &result); + struct nvme_get_features_args args = { + .args_size = sizeof(args), + .fd = fd, + .fid = cfg.feature_id, + .nsid = cfg.namespace_id, + .sel = cfg.sel, + .cdw11 = cfg.cdw11, + .uuidx = 0, + .data_len = cfg.data_len, + .data = buf, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = &result, + }; + err = nvme_get_features(&args); if (!err) { #if 0 printf("get-feature:0x%02x (%s), %s value: %#08x\n", cfg.feature_id, @@ -340,9 +351,22 @@ static int set_additional_feature(int argc, char **argv, struct command *cmd, st } } - err = nvme_set_features(fd, cfg.feature_id, cfg.namespace_id, cfg.value, - 0, cfg.save, 0, 0, cfg.data_len, buf, - NVME_DEFAULT_IOCTL_TIMEOUT, &result); + struct nvme_set_features_args args = { + .args_size = sizeof(args), + .fd = fd, + .fid = cfg.feature_id, + .nsid = cfg.namespace_id, + .cdw11 = cfg.value, + .cdw12 = 0, + .save = cfg.save, + .uuidx = 0, + .cdw15 = 0, + .data_len = cfg.data_len, + .data = buf, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = &result, + }; + err = nvme_set_features(&args); if (err < 0) { perror("set-feature"); goto free; diff --git a/plugins/toshiba/toshiba-nvme.c b/plugins/toshiba/toshiba-nvme.c index 77da83d5..fd2e9c1e 100644 --- a/plugins/toshiba/toshiba-nvme.c +++ b/plugins/toshiba/toshiba-nvme.c @@ -390,7 +390,7 @@ static int nvme_get_vendor_log(int fd, __u32 namespace_id, int log_page, if (err) { goto end; } - err = nvme_get_nsid_log(fd, log_page, namespace_id, log_len, log); + err = nvme_get_nsid_log(fd, false, log_page, namespace_id, log_len, log); if (err) { fprintf(stderr, "%s: couldn't get log 0x%x\n", __func__, log_page); @@ -547,9 +547,22 @@ static int clear_correctable_errors(int argc, char **argv, struct command *cmd, if (err) goto end; - err = nvme_set_features(fd, feature_id, namespace_id, value, cdw12, - save, 0, 0, 0, NULL, - NVME_DEFAULT_IOCTL_TIMEOUT, &result); + struct nvme_set_features_args args = { + .args_size = sizeof(args), + .fd = fd, + .fid = feature_id, + .nsid = namespace_id, + .cdw11 = value, + .cdw12 = cdw12, + .save = save, + .uuidx = 0, + .cdw15 = 0, + .data_len = 0, + .data = NULL, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = &result, + }; + err = nvme_set_features(&args); if (err) fprintf(stderr, "%s: couldn't clear PCIe correctable errors \n", __func__); diff --git a/plugins/wdc/wdc-nvme.c b/plugins/wdc/wdc-nvme.c index 014c105d..0295c3d7 100644 --- a/plugins/wdc/wdc-nvme.c +++ b/plugins/wdc/wdc-nvme.c @@ -1682,10 +1682,24 @@ static bool get_dev_mgment_cbs_data(nvme_root_t r, int fd, __u8 log_id, void **c memset(data, 0, sizeof (__u8) * WDC_C2_LOG_BUF_LEN); /* get the log page length */ - ret = nvme_get_log(fd, lid, 0xFFFFFFFF, NVME_LOG_LSP_NONE, 0, 0, - false, uuid_ix, NVME_CSI_NVM, false, - WDC_C2_LOG_BUF_LEN, data, - NVME_DEFAULT_IOCTL_TIMEOUT, NULL); + struct nvme_get_log_args args_len = { + .args_size = sizeof(args_len), + .fd = fd, + .lid = lid, + .nsid = 0xFFFFFFFF, + .lpo = 0, + .lsp = NVME_LOG_LSP_NONE, + .lsi = 0, + .rae = false, + .uuidx = uuid_ix, + .csi = NVME_CSI_NVM, + .ot = false, + .len = WDC_C2_LOG_BUF_LEN, + .log = data, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = NULL, + }; + ret = nvme_get_log(&args_len); if (ret) { fprintf(stderr, "ERROR : WDC : Unable to get 0x%x Log Page length, ret = 0x%x\n", lid, ret); goto end; @@ -1704,10 +1718,24 @@ static bool get_dev_mgment_cbs_data(nvme_root_t r, int fd, __u8 log_id, void **c } /* get the log page data */ - ret = nvme_get_log(fd, lid, 0xFFFFFFFF, 0, NVME_LOG_LSP_NONE, 0, false, - uuid_ix, NVME_CSI_NVM, false, - le32_to_cpu(hdr_ptr->length), data, - NVME_DEFAULT_IOCTL_TIMEOUT, NULL); + struct nvme_get_log_args args_data = { + .args_size = sizeof(args_data), + .fd = fd, + .lid = lid, + .nsid = 0xFFFFFFFF, + .lpo = 0, + .lsp = NVME_LOG_LSP_NONE, + .lsi = 0, + .rae = false, + .uuidx = uuid_ix, + .csi = NVME_CSI_NVM, + .ot = false, + .len = le32_to_cpu(hdr_ptr->length), + .log = data, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = NULL, + }; + ret = nvme_get_log(&args_data); if (ret) { fprintf(stderr, "ERROR : WDC : Unable to read 0x%x Log Page data, ret = 0x%x\n", lid, ret); @@ -1727,10 +1755,24 @@ static bool get_dev_mgment_cbs_data(nvme_root_t r, int fd, __u8 log_id, void **c /* not found with uuid = 1 try with uuid = 0 */ uuid_ix = 0; /* get the log page data */ - ret = nvme_get_log(fd, lid, 0xFFFFFFFF, 0, NVME_LOG_LSP_NONE, 0, false, - uuid_ix, NVME_CSI_NVM, false, - le32_to_cpu(hdr_ptr->length), - data, NVME_DEFAULT_IOCTL_TIMEOUT, NULL); + struct nvme_get_log_args args = { + .args_size = sizeof(args), + .fd = fd, + .lid = lid, + .nsid = 0xFFFFFFFF, + .lpo = 0, + .lsp = NVME_LOG_LSP_NONE, + .lsi = 0, + .rae = false, + .uuidx = uuid_ix, + .csi = NVME_CSI_NVM, + .ot = false, + .len = le32_to_cpu(hdr_ptr->length), + .log = data, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = NULL, + }; + ret = nvme_get_log(&args); hdr_ptr = (struct wdc_c2_log_page_header *)data; sph = (struct wdc_c2_log_subpage_header *)(data + length); @@ -2130,6 +2172,18 @@ static int wdc_do_cap_telemetry_log(int fd, char *file, __u32 bs, int type, int goto close_output; } + struct nvme_get_features_args args = { + .args_size = sizeof(args), + .fd = fd, + .fid = NVME_FEAT_FID_HOST_BEHAVIOR, + .nsid = NVME_NSID_ALL, + .sel = 0, + .cdw11 = 0, + .uuidx = 0, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = &result, + }; + switch (data_area) { case 1: full_size = (le16_to_cpu(hdr->dalb1) * WDC_TELEMETRY_BLOCK_SIZE) + WDC_TELEMETRY_HEADER_LENGTH; @@ -2156,10 +2210,9 @@ static int wdc_do_cap_telemetry_log(int fd, char *file, __u32 bs, int type, int } memset(buf, 0, len); - err = nvme_get_features(fd, NVME_NSID_ALL, - NVME_FEAT_FID_HOST_BEHAVIOR, 0, 0, 0, - len, buf, NVME_DEFAULT_IOCTL_TIMEOUT, - &result); + args.data_len = len; + args.data = buf; + err = nvme_get_features(&args); if (err > 0) { nvme_show_status(err); } else if (err < 0) { @@ -4981,10 +5034,24 @@ static int wdc_get_c0_log_page(nvme_root_t r, int fd, char *format, } /* Get the 0xC0 log data */ - ret = nvme_get_log(fd, WDC_NVME_GET_EOL_STATUS_LOG_OPCODE, namespace_id, 0, - NVME_LOG_LSP_NONE, 0, false, uuid_index, NVME_CSI_NVM, - false, WDC_NVME_SMART_CLOUD_ATTR_LEN, data, - NVME_DEFAULT_IOCTL_TIMEOUT, NULL); + struct nvme_get_log_args args = { + .args_size = sizeof(args), + .fd = fd, + .lid = WDC_NVME_GET_EOL_STATUS_LOG_OPCODE, + .nsid = namespace_id, + .lpo = 0, + .lsp = NVME_LOG_LSP_NONE, + .lsi = 0, + .rae = false, + .uuidx = uuid_index, + .csi = NVME_CSI_NVM, + .ot = false, + .len = WDC_NVME_SMART_CLOUD_ATTR_LEN, + .log = data, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = NULL, + }; + ret = nvme_get_log(&args); if (strcmp(format, "json")) nvme_show_status(ret); @@ -5030,11 +5097,24 @@ static int wdc_get_c0_log_page(nvme_root_t r, int fd, char *format, } /* Get the 0xC0 log data */ - ret = nvme_get_log(fd, WDC_NVME_GET_EOL_STATUS_LOG_OPCODE, NVME_NSID_ALL, 0, - NVME_LOG_LSP_NONE, 0, false, uuid_index, - NVME_CSI_NVM, false, - WDC_NVME_EOL_STATUS_LOG_LEN, data, - NVME_DEFAULT_IOCTL_TIMEOUT, NULL); + struct nvme_get_log_args args = { + .args_size = sizeof(args), + .fd = fd, + .lid = WDC_NVME_GET_EOL_STATUS_LOG_OPCODE, + .nsid = NVME_NSID_ALL, + .lpo = 0, + .lsp = NVME_LOG_LSP_NONE, + .lsi = 0, + .rae = false, + .uuidx = uuid_index, + .csi = NVME_CSI_NVM, + .ot = false, + .len = WDC_NVME_EOL_STATUS_LOG_LEN, + .log = data, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = NULL, + }; + ret = nvme_get_log(&args); if (strcmp(format, "json")) nvme_show_status(ret); @@ -6109,11 +6189,24 @@ static int wdc_vs_fw_activate_history(int argc, char **argv, struct command *com } /* Get the 0xC0 log data */ - ret = nvme_get_log(fd, WDC_NVME_GET_SMART_CLOUD_ATTR_LOG_OPCODE, - 0xFFFFFFFF, 0, NVME_LOG_LSP_NONE, 0, false, - uuid_index, NVME_CSI_NVM, false, - WDC_NVME_SMART_CLOUD_ATTR_LEN, data, - NVME_DEFAULT_IOCTL_TIMEOUT, NULL); + struct nvme_get_log_args args = { + .args_size = sizeof(args), + .fd = fd, + .lid = WDC_NVME_GET_SMART_CLOUD_ATTR_LOG_OPCODE, + .nsid = 0xFFFFFFFF, + .lpo = 0, + .lsp = NVME_LOG_LSP_NONE, + .lsi = 0, + .rae = false, + .uuidx = uuid_index, + .csi = NVME_CSI_NVM, + .ot = false, + .len = WDC_NVME_SMART_CLOUD_ATTR_LEN, + .log = data, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = NULL, + }; + ret = nvme_get_log(&args); if (ret == 0) { /* Verify GUID matches */ diff --git a/plugins/ymtc/ymtc-nvme.c b/plugins/ymtc/ymtc-nvme.c index 8aae45fe..e8637bf9 100644 --- a/plugins/ymtc/ymtc-nvme.c +++ b/plugins/ymtc/ymtc-nvme.c @@ -129,7 +129,7 @@ static int get_additional_smart_log(int argc, char **argv, struct command *cmd, if (fd < 0) return fd; - err = nvme_get_nsid_log(fd, 0xca, cfg.namespace_id, + err = nvme_get_nsid_log(fd, false, 0xca, cfg.namespace_id, sizeof(smart_log), &smart_log); if (!err) { if (!cfg.raw_binary) diff --git a/plugins/zns/zns.c b/plugins/zns/zns.c index 999ca814..83d6c98f 100644 --- a/plugins/zns/zns.c +++ b/plugins/zns/zns.c @@ -269,8 +269,20 @@ static int zns_mgmt_send(int argc, char **argv, struct command *cmd, struct plug } } - err = nvme_zns_mgmt_send(fd, cfg.namespace_id, cfg.zslba, zsa, - cfg.select_all, 0, 0, NULL, cfg.timeout, &result); + struct nvme_zns_mgmt_send_args args = { + .args_size = sizeof(args), + .fd = fd, + .nsid = cfg.namespace_id, + .slba = cfg.zslba, + .zsa = zsa, + .select_all = cfg.select_all, + .zsaso = 0, + .data_len = 0, + .data = NULL, + .timeout = cfg.timeout, + .result = &result, + }; + err = nvme_zns_mgmt_send(&args); if (!err) { if (zsa == NVME_ZNS_ZSA_RESET) zcapc = result & 0x1; @@ -420,8 +432,20 @@ static int zone_mgmt_send(int argc, char **argv, struct command *cmd, struct plu } } - err = nvme_zns_mgmt_send(fd, cfg.namespace_id, cfg.zslba, cfg.zsa, - cfg.select_all, cfg.zsaso, cfg.data_len, buf, cfg.timeout, NULL); + struct nvme_zns_mgmt_send_args args = { + .args_size = sizeof(args), + .fd = fd, + .nsid = cfg.namespace_id, + .slba = cfg.zslba, + .zsa = cfg.zsa, + .select_all = cfg.select_all, + .zsaso = cfg.zsaso, + .data_len = cfg.data_len, + .data = buf, + .timeout = cfg.timeout, + .result = NULL, + }; + err = nvme_zns_mgmt_send(&args); if (!err) printf("zone-mgmt-send: Success, action:%d zone:%"PRIx64" " "all:%d nsid:%d\n", @@ -498,8 +522,20 @@ static int open_zone(int argc, char **argv, struct command *cmd, struct plugin * } } - err = nvme_zns_mgmt_send(fd, cfg.namespace_id, cfg.zslba, NVME_ZNS_ZSA_OPEN, - cfg.select_all, cfg.zrwaa, 0, NULL, cfg.timeout, NULL); + struct nvme_zns_mgmt_send_args args = { + .args_size = sizeof(args), + .fd = fd, + .nsid = cfg.namespace_id, + .slba = cfg.zslba, + .zsa = NVME_ZNS_ZSA_OPEN, + .select_all = cfg.select_all, + .zsaso = cfg.zrwaa, + .data_len = 0, + .data = NULL, + .timeout = cfg.timeout, + .result = NULL, + }; + err = nvme_zns_mgmt_send(&args); if (!err) printf("zns-open-zone: Success zone slba:%"PRIx64" nsid:%d\n", (uint64_t)cfg.zslba, cfg.namespace_id); @@ -599,9 +635,20 @@ static int set_zone_desc(int argc, char **argv, struct command *cmd, struct plug goto close_ffd; } - err = nvme_zns_mgmt_send(fd, cfg.namespace_id, cfg.zslba, - NVME_ZNS_ZSA_SET_DESC_EXT, 0, cfg.zrwaa, data_len, buf, - cfg.timeout, NULL); + struct nvme_zns_mgmt_send_args args = { + .args_size = sizeof(args), + .fd = fd, + .nsid = cfg.namespace_id, + .slba = cfg.zslba, + .zsa = NVME_ZNS_ZSA_SET_DESC_EXT, + .select_all = 0, + .zsaso = cfg.zrwaa, + .data_len = data_len, + .data = buf, + .timeout = cfg.timeout, + .result = NULL, + }; + err = nvme_zns_mgmt_send(&args); if (!err) printf("set-zone-desc: Success, zone:%"PRIx64" nsid:%d\n", (uint64_t)cfg.zslba, cfg.namespace_id); @@ -655,8 +702,20 @@ static int zrwa_flush_zone(int argc, char **argv, struct command *cmd, struct pl } } - err = nvme_zns_mgmt_send(fd, cfg.namespace_id, cfg.lba, - NVME_ZNS_ZSA_ZRWA_FLUSH, 0, 0, 0, NULL, cfg.timeout, NULL); + struct nvme_zns_mgmt_send_args args = { + .args_size = sizeof(args), + .fd = fd, + .nsid = cfg.namespace_id, + .slba = cfg.lba, + .zsa = NVME_ZNS_ZSA_ZRWA_FLUSH, + .select_all = 0, + .zsaso = 0, + .data_len = 0, + .data = NULL, + .timeout = cfg.timeout, + .result = NULL, + }; + err = nvme_zns_mgmt_send(&args); if (!err) printf("zrwa-flush-zone: Success, lba:%"PRIx64" nsid:%d\n", (uint64_t)cfg.lba, cfg.namespace_id); @@ -735,9 +794,20 @@ static int zone_mgmt_recv(int argc, char **argv, struct command *cmd, struct plu } } - err = nvme_zns_mgmt_recv(fd, cfg.namespace_id, cfg.zslba, cfg.zra, - cfg.zrasf, cfg.partial, cfg.data_len, data, - NVME_DEFAULT_IOCTL_TIMEOUT, NULL); + struct nvme_zns_mgmt_recv_args args = { + .args_size = sizeof(args), + .fd = fd, + .nsid = cfg.namespace_id, + .slba = cfg.zslba, + .zra = cfg.zra, + .zrasf = cfg.zrasf, + .zras_feat = cfg.partial, + .data_len = cfg.data_len, + .data = data, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = NULL, + }; + err = nvme_zns_mgmt_recv(&args); if (!err) printf("zone-mgmt-recv: Success, action:%d zone:%"PRIx64" nsid:%d\n", cfg.zra, (uint64_t)cfg.zslba, cfg.namespace_id); @@ -1105,11 +1175,26 @@ static int zone_append(int argc, char **argv, struct command *cmd, struct plugin if (cfg.piremap) control |= NVME_IO_ZNS_APPEND_PIREMAP; + struct nvme_zns_append_args args = { + .args_size = sizeof(args), + .fd = fd, + .nsid = cfg.namespace_id, + .zslba = cfg.zslba, + .nlb = nblocks, + .control = control, + .ilbrt = cfg.ref_tag, + .lbat = cfg.lbat, + .lbatm = cfg.lbatm, + .data_len = cfg.data_size, + .data = buf, + .metadata_len = cfg.metadata_size, + .metadata = mbuf, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = &result, + }; + gettimeofday(&start_time, NULL); - err = nvme_zns_append(fd, cfg.namespace_id, cfg.zslba, nblocks, - control, cfg.ref_tag, cfg.lbat, cfg.lbatm, - cfg.data_size, buf, cfg.metadata_size, mbuf, - NVME_DEFAULT_IOCTL_TIMEOUT, &result); + err = nvme_zns_append(&args); gettimeofday(&end_time, NULL); if (cfg.latency) printf(" latency: zone append: %llu us\n", diff --git a/subprojects/libnvme.wrap b/subprojects/libnvme.wrap index 08809411..205d637d 100644 --- a/subprojects/libnvme.wrap +++ b/subprojects/libnvme.wrap @@ -1,6 +1,6 @@ [wrap-git] url = https://github.com/linux-nvme/libnvme.git -revision = 35936185e376082cb26da205fd923c0f1c417c12 +revision = c921be9f1be46a2dea78bcd8d32c0a9df6f17b4e [provide] libnvme = libnvme_dep