From 26021d2bc483addd90ee57a5ab9add28af7a1275 Mon Sep 17 00:00:00 2001 From: Vikash Kumar Date: Thu, 16 Mar 2023 23:11:17 +0530 Subject: [PATCH] This provides the means to use nvme-cli/libnvme via user-space NVMe drivers, io_uring command on Linux. As well as using nvme-cli natively on FreeBSD. This is done by dispatching commands to xNVMe. Signed-off-by: Vikash kumar --- meson.build | 3 +- nvme-rpmb.c | 54 ++++----- nvme-wrap.c | 10 +- nvme.c | 108 ++++++++++++------ nvme.h | 17 ++- plugins/dera/dera-nvme.c | 4 +- plugins/fdp/fdp.c | 14 +-- plugins/huawei/huawei-nvme.c | 10 +- plugins/innogrit/innogrit-nvme.c | 4 +- plugins/intel/intel-nvme.c | 24 ++-- plugins/memblaze/memblaze-nvme.c | 23 ++-- plugins/micron/micron-nvme.c | 104 ++++++++--------- plugins/netapp/netapp-nvme.c | 35 +++--- plugins/ocp/ocp-nvme.c | 32 +++--- plugins/scaleflux/sfx-nvme.c | 40 +++---- plugins/seagate/seagate-nvme.c | 10 +- plugins/shannon/shannon-nvme.c | 4 +- .../solidigm/solidigm-garbage-collection.c | 3 +- plugins/solidigm/solidigm-latency-tracking.c | 16 +-- plugins/solidigm/solidigm-smart.c | 4 +- plugins/solidigm/solidigm-telemetry.c | 2 +- plugins/toshiba/toshiba-nvme.c | 34 +++--- plugins/virtium/virtium-nvme.c | 16 +-- plugins/wdc/wdc-nvme.c | 100 ++++++++-------- plugins/zns/zns.c | 20 ++-- 25 files changed, 370 insertions(+), 321 deletions(-) diff --git a/meson.build b/meson.build index e7f8f8b221..ece2ea04d8 100644 --- a/meson.build +++ b/meson.build @@ -49,6 +49,7 @@ libnvme_dep = dependency('libnvme', version: '>=1.3', required: true, fallback : ['libnvme', 'libnvme_dep']) libnvme_mi_dep = dependency('libnvme-mi', required: true, fallback : ['libnvme', 'libnvme_mi_dep']) +libxnvme_dep = dependency('xnvme', version: '>=0.2.0', required: true) # Check for libjson-c availability if get_option('json-c').disabled() @@ -268,7 +269,7 @@ subdir('Documentation') executable( 'nvme', sources, - dependencies: [ libnvme_dep, libnvme_mi_dep, json_c_dep, + dependencies: [ libxnvme_dep, libnvme_dep, libnvme_mi_dep, json_c_dep, libhugetlbfs_dep ], link_args: '-ldl', include_directories: incdir, diff --git a/nvme-rpmb.c b/nvme-rpmb.c index 40ddb5b2e3..38ceccbd0d 100644 --- a/nvme-rpmb.c +++ b/nvme-rpmb.c @@ -273,12 +273,12 @@ struct rpmb_config_block_t { #define RPMB_NVME_SECP 0xEA #define RPMB_NVME_SPSP 0x0001 -static int send_rpmb_req(int fd, unsigned char tgt, int size, +static int send_rpmb_req(struct dev_handle *hnd, unsigned char tgt, int size, struct rpmb_data_frame_t *req) { struct nvme_security_send_args args = { + .hnd = hnd, .args_size = sizeof(args), - .fd = fd, .nsid = 0, .nssf = tgt, .spsp0 = RPMB_NVME_SPSP, @@ -294,13 +294,13 @@ static int send_rpmb_req(int fd, unsigned char tgt, int size, return nvme_security_send(&args); } -static int recv_rpmb_rsp(int fd, int tgt, int size, +static int recv_rpmb_rsp(struct dev_handle *hnd, int tgt, int size, struct rpmb_data_frame_t *rsp) { struct nvme_security_receive_args args = { + .hnd = hnd, .args_size = sizeof(args), - .fd = fd, .nsid = 0, .nssf = tgt, .spsp0 = RPMB_NVME_SPSP, @@ -420,7 +420,7 @@ static int check_rpmb_response( struct rpmb_data_frame_t *req, * successful completion (caller must free), NULL otherwise */ static struct rpmb_data_frame_t * -rpmb_read_request(int fd, +rpmb_read_request(struct dev_handle *hnd, struct rpmb_data_frame_t *req, int req_size, int rsp_size) @@ -432,7 +432,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(fd, req->target, req_size, req); + error = send_rpmb_req(hnd, req->target, req_size, req); if (error != 0) { fprintf(stderr, "%s failed with error = 0x%x\n", msg, error); @@ -447,7 +447,7 @@ rpmb_read_request(int fd, } /* Read result of previous request */ - error = recv_rpmb_rsp(fd, req->target, rsp_size, rsp); + error = recv_rpmb_rsp(hnd, req->target, rsp_size, rsp); if (error) { fprintf(stderr, "error 0x%x receiving response for %s\n", error, msg); @@ -464,7 +464,7 @@ rpmb_read_request(int fd, } /* read current write counter value from controller */ -static int rpmb_read_write_counter(int fd, +static int rpmb_read_write_counter(struct dev_handle *hnd, unsigned char target, unsigned int *counter) { @@ -476,7 +476,7 @@ static int rpmb_read_write_counter(int fd, req = rpmb_request_init(req_size, RPMB_REQ_READ_WRITE_CNTR, target, 1, 0, 0, NULL, 0, 0); if (req == NULL) goto out; - if ((rsp = rpmb_read_request(fd, req, req_size, req_size)) == NULL) { + if ((rsp = rpmb_read_request(hnd, req, req_size, req_size)) == NULL) { goto out; } *counter = rsp->write_counter; @@ -492,7 +492,7 @@ static int rpmb_read_write_counter(int fd, * current write counter value returned as part of response, in case of error it * returns 0 */ -static unsigned int rpmb_read_config_block(int fd, unsigned char **config_buf) +static unsigned int rpmb_read_config_block(struct dev_handle *hnd, unsigned char **config_buf) { int req_size = sizeof(struct rpmb_data_frame_t); int cfg_size = sizeof(struct rpmb_config_block_t); @@ -508,7 +508,7 @@ static unsigned int rpmb_read_config_block(int fd, unsigned char **config_buf) 0, 0, 0); if (!req) return 0; - if ((rsp = rpmb_read_request(fd, req, req_size, rsp_size)) == NULL) + if ((rsp = rpmb_read_request(hnd, req, req_size, rsp_size)) == NULL) { free(req); return 0; @@ -532,7 +532,7 @@ static unsigned int rpmb_read_config_block(int fd, unsigned char **config_buf) } -static int rpmb_auth_data_read(int fd, unsigned char target, +static int rpmb_auth_data_read(struct dev_handle *hnd, unsigned char target, unsigned int offset, unsigned char **msg_buf, int msg_size, int acc_size) @@ -558,7 +558,7 @@ static int rpmb_auth_data_read(int fd, unsigned char target, target, 1, offset, xfer, 0, 0, 0); if (req == NULL) break; - if ((rsp = rpmb_read_request(fd, req, req_size, rsp_size)) == NULL) + if ((rsp = rpmb_read_request(hnd, req, req_size, rsp_size)) == NULL) { fprintf(stderr, "read_request failed\n"); free(req); @@ -584,7 +584,7 @@ static int rpmb_auth_data_read(int fd, unsigned char target, } /* Implementation of programming authentication key to given RPMB target */ -static int rpmb_program_auth_key(int fd, unsigned char target, +static int rpmb_program_auth_key(struct dev_handle *hnd, unsigned char target, unsigned char *key_buf, int key_size) { int req_size = sizeof(struct rpmb_data_frame_t); @@ -603,14 +603,14 @@ static int rpmb_program_auth_key(int fd, unsigned char target, } /* send request and read the result first */ - rsp = rpmb_read_request(fd, req, req_size, rsp_size); + rsp = rpmb_read_request(hnd, req, req_size, rsp_size); if (rsp == NULL || rsp->result != 0) { goto out; } /* re-use response buffer */ memset(rsp, 0, rsp_size); - err = recv_rpmb_rsp(fd, req->target, rsp_size, rsp); + err = recv_rpmb_rsp(hnd, req->target, rsp_size, rsp); if (err != 0) { err = check_rpmb_response(req, rsp, "Failed to Program Key"); } @@ -627,7 +627,7 @@ static int rpmb_program_auth_key(int fd, unsigned char target, * number of bytes actually written to, otherwise negetive error code * on failures. */ -static int auth_data_write_chunk(int fd, unsigned char tgt, unsigned int addr, +static int auth_data_write_chunk(struct dev_handle *hnd, unsigned char tgt, unsigned int addr, unsigned char *msg_buf, int msg_size, unsigned char *keybuf, int keysize) { @@ -642,7 +642,7 @@ static int auth_data_write_chunk(int fd, unsigned char tgt, unsigned int addr, int error = -ENOMEM; /* get current write counter and copy to the request */ - error = rpmb_read_write_counter(fd, tgt, &write_cntr); + error = rpmb_read_write_counter(hnd, tgt, &write_cntr); if (error != 0) { fprintf(stderr, "Failed to read write counter for write-data\n"); goto out; @@ -670,7 +670,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(fd, tgt, req_size, req); + error = send_rpmb_req(hnd, tgt, req_size, req); if (error != 0) { fprintf(stderr, "RPMB request 0x%04x for 0x%x, error: %d\n", req->type, tgt, error); @@ -681,7 +681,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(fd, tgt, rsp_size, rsp); + error = send_rpmb_req(hnd, 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); @@ -690,7 +690,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(fd, tgt, rsp_size, rsp); + error = recv_rpmb_rsp(hnd, tgt, rsp_size, rsp); if (error != 0) fprintf(stderr, "Auth data write recv error = 0x%x\n", error); else @@ -704,7 +704,7 @@ static int auth_data_write_chunk(int fd, unsigned char tgt, unsigned int addr, } /* send the request and get response */ -static int rpmb_auth_data_write(int fd, unsigned char target, +static int rpmb_auth_data_write(struct dev_handle *hnd, unsigned char target, unsigned int addr, int acc_size, unsigned char *msg_buf, int msg_size, unsigned char *keybuf, int keysize) @@ -714,7 +714,7 @@ static int rpmb_auth_data_write(int fd, unsigned char target, int offset = 0; while (xfer > 0 ) { - if (auth_data_write_chunk(fd, target, (addr + offset / 512), + if (auth_data_write_chunk(hnd, target, (addr + offset / 512), msg_buf + offset, xfer, keybuf, keysize) != 0) { @@ -733,7 +733,7 @@ static int rpmb_auth_data_write(int fd, unsigned char target, } /* writes given config_block buffer to the drive target 0 */ -static int rpmb_write_config_block(int fd, unsigned char *cfg_buf, +static int rpmb_write_config_block(struct dev_handle *hnd, unsigned char *cfg_buf, unsigned char *keybuf, int keysize) { int cfg_size = sizeof(struct rpmb_config_block_t); @@ -756,7 +756,7 @@ static int rpmb_write_config_block(int fd, unsigned char *cfg_buf, } /* read config block write_counter from controller */ - write_cntr = rpmb_read_config_block(fd, &cfg_buf_read); + write_cntr = rpmb_read_config_block(hnd, &cfg_buf_read); if (cfg_buf_read == NULL) { fprintf(stderr, "failed to read config block write counter\n"); error = -EIO; @@ -775,7 +775,7 @@ static int rpmb_write_config_block(int fd, unsigned char *cfg_buf, memcpy(req->mac, mac, sizeof(req->mac)); - error = send_rpmb_req(fd, 0, req_size, req); + error = send_rpmb_req(hnd, 0, req_size, req); if (error != 0) { fprintf(stderr, "Write-config RPMB request, error = 0x%x\n", error); @@ -795,7 +795,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(fd, req->target, rsp_size, rsp); + error = recv_rpmb_rsp(hnd, req->target, rsp_size, rsp); if (error != 0) { fprintf(stderr,"Failed getting write-config response\ error = 0x%x\n", error); diff --git a/nvme-wrap.c b/nvme-wrap.c index cee9b235d3..4b18c5ab8c 100644 --- a/nvme-wrap.c +++ b/nvme-wrap.c @@ -20,8 +20,8 @@ */ #define do_admin_op(op, d, ...) ({ \ int __rc; \ - if (d->type == NVME_DEV_DIRECT) \ - __rc = nvme_ ## op(d->direct.fd, __VA_ARGS__); \ + if (d->type == NVME_DEV_DIRECT || d->type == NVME_DEV_XNVME) \ + __rc = nvme_ ## op(&d->direct.hnd, __VA_ARGS__); \ else if (d->type == NVME_DEV_MI) \ __rc = nvme_mi_admin_ ## op (d->mi.ctrl, __VA_ARGS__); \ else \ @@ -38,8 +38,8 @@ */ #define do_admin_args_op(op, d, args) ({ \ int __rc; \ - if (d->type == NVME_DEV_DIRECT) { \ - args->fd = d->direct.fd; \ + if (d->type == NVME_DEV_DIRECT || d->type == NVME_DEV_XNVME) { \ + args->hnd = &d->direct.hnd; \ args->timeout = NVME_DEFAULT_IOCTL_TIMEOUT; \ __rc = nvme_ ## op(args); \ } else if (d->type == NVME_DEV_MI) \ @@ -411,7 +411,7 @@ int nvme_cli_security_receive(struct nvme_dev *dev, { /* Cannot use do_admin_args_op here because the API have different suffix*/ if (dev->type == NVME_DEV_DIRECT) { - args->fd = dev->direct.fd; + args->hnd = dev_fd(dev); args->timeout = NVME_DEFAULT_IOCTL_TIMEOUT; return nvme_security_receive(args); } diff --git a/nvme.c b/nvme.c index 3bc4b2a8ef..177d8ba3ed 100644 --- a/nvme.c +++ b/nvme.c @@ -290,9 +290,9 @@ static int open_dev_direct(struct nvme_dev **devp, char *devstr, int flags) perror(devstr); goto err_free; } - dev->direct.fd = err; - - err = fstat(dev_fd(dev), &dev->direct.stat); + dev->direct.hnd.fd = err; + dev->direct.hnd.dev_type = NVME_DEV_DIRECT; + err = fstat(dev->direct.hnd.fd, &dev->direct.stat); if (err < 0) { perror(devstr); goto err_close; @@ -307,7 +307,7 @@ static int open_dev_direct(struct nvme_dev **devp, char *devstr, int flags) return 0; err_close: - close(dev_fd(dev)); + close(dev_fd(dev)->fd); err_free: free(dev); return err; @@ -387,6 +387,42 @@ static int check_arg_dev(int argc, char **argv) return 0; } +static int open_dev_xnvme(struct nvme_dev **devp, char *devname) +{ + int err; + struct nvme_dev *dev; + struct xnvme_dev *xnvme_handle = NULL; + struct xnvme_opts opts = {0}; + opts.rdwr = 1; + opts.create_mode = S_IRUSR | S_IWUSR; + opts.nsid = 0x1; + + xnvme_handle = xnvme_dev_open(devname, &opts); + if (!xnvme_handle) { + printf("xnvme_dev failed \n"); + err = -1; + goto perror; + } + + dev = calloc(1, sizeof(*dev)); + if (!dev) + return -1; + + dev->type = NVME_DEV_XNVME; + dev->name = basename(devname); + dev->direct.hnd.xdev = xnvme_handle; + dev->direct.hnd.dev_type = NVME_DEV_XNVME; + + *devp = dev; + return 0; + +perror: + perror(devname); + return err; +} + + + static int get_dev(struct nvme_dev **dev, int argc, char **argv, int flags) { char *devname; @@ -397,9 +433,10 @@ static int get_dev(struct nvme_dev **dev, int argc, char **argv, int flags) return ret; devname = argv[optind]; - if (!strncmp(devname, "mctp:", strlen("mctp:"))) ret = open_dev_mi_mctp(dev, devname); + else if(getenv("XNVME_ENABLED")) + ret = open_dev_xnvme(dev, devname); else ret = open_dev_direct(dev, devname, flags); @@ -451,7 +488,10 @@ void dev_close(struct nvme_dev *dev) { switch (dev->type) { case NVME_DEV_DIRECT: - close(dev_fd(dev)); + close(dev->direct.hnd.fd); + break; + case NVME_DEV_XNVME: + xnvme_dev_close((struct xnvme_dev*)dev->direct.hnd.xdev); break; case NVME_DEV_MI: nvme_mi_close(dev->mi.ep); @@ -1008,8 +1048,8 @@ static int get_effects_log(int argc, char **argv, struct command *cmd, struct pl munmap(bar, getpagesize()); } else { struct nvme_get_property_args args = { + .hnd = dev_fd(dev), .args_size = sizeof(args), - .fd = dev_fd(dev), .offset = NVME_REG_CAP, .value = &cap, .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, @@ -2052,8 +2092,8 @@ static int io_mgmt_send(int argc, char **argv, struct command *cmd, struct plugi } struct nvme_io_mgmt_send_args args = { + .hnd = dev_fd(dev), .args_size = sizeof(args), - .fd = dev_fd(dev), .nsid = cfg.namespace_id, .mos = cfg.mos, .mo = cfg.mo, @@ -2134,8 +2174,8 @@ static int io_mgmt_recv(int argc, char **argv, struct command *cmd, struct plugi } struct nvme_io_mgmt_recv_args args = { + .hnd = dev_fd(dev), .args_size = sizeof(args), - .fd = dev_fd(dev), .nsid = cfg.namespace_id, .mos = cfg.mos, .mo = cfg.mo, @@ -4108,8 +4148,8 @@ static int virtual_mgmt(int argc, char **argv, struct command *cmd, struct plugi goto ret; struct nvme_virtual_mgmt_args args = { + .hnd = dev_fd(dev), .args_size = sizeof(args), - .fd = dev_fd(dev), .act = cfg.act, .rt = cfg.rt, .cntlid = cfg.cntlid, @@ -4411,8 +4451,8 @@ static int device_self_test(int argc, char **argv, struct command *cmd, struct p } struct nvme_dev_self_test_args args = { + .hnd = dev_fd(dev), .args_size = sizeof(args), - .fd = dev_fd(dev), .nsid = cfg.namespace_id, .stc = cfg.stc, .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, @@ -5279,7 +5319,7 @@ static int sanitize(int argc, char **argv, struct command *cmd, struct plugin *p return err; } -static int nvme_get_properties(int fd, void **pbar) +static int nvme_get_properties(struct dev_handle *hnd, void **pbar) { int offset, err, size = getpagesize(); __u64 value; @@ -5293,8 +5333,8 @@ static int nvme_get_properties(int fd, void **pbar) memset(bar, 0xff, size); for (offset = NVME_REG_CAP; offset <= NVME_REG_CMBSZ;) { struct nvme_get_property_args args = { + .hnd = hnd, .args_size = sizeof(args), - .fd = fd, .offset = offset, .value = &value, .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, @@ -5473,8 +5513,8 @@ static int get_property(int argc, char **argv, struct command *cmd, struct plugi } struct nvme_get_property_args args = { + .hnd = dev_fd(dev), .args_size = sizeof(args), - .fd = dev_fd(dev), .offset = cfg.offset, .value = &value, .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, @@ -5535,8 +5575,8 @@ static int set_property(int argc, char **argv, struct command *cmd, struct plugi } struct nvme_set_property_args args = { + .hnd = dev_fd(dev), .args_size = sizeof(args), - .fd = dev_fd(dev), .offset = cfg.offset, .value = cfg.value, .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, @@ -5781,7 +5821,7 @@ static int format(int argc, char **argv, struct command *cmd, struct plugin *plu printf("Success formatting namespace:%x\n", cfg.namespace_id); if (dev->type == NVME_DEV_DIRECT && cfg.lbaf != prev_lbaf){ if (is_chardev(dev)) { - if (ioctl(dev_fd(dev), NVME_IOCTL_RESCAN) < 0) { + if (ioctl(dev_fd(dev)->fd, NVME_IOCTL_RESCAN) < 0) { fprintf(stderr, "failed to rescan namespaces\n"); err = -errno; goto close_dev; @@ -5796,14 +5836,14 @@ static int format(int argc, char **argv, struct command *cmd, struct plugin *plu * to the given one because blkdev will not * update by itself without re-opening fd. */ - if (ioctl(dev_fd(dev), BLKBSZSET, &block_size) < 0) { + if (ioctl(dev_fd(dev)->fd, BLKBSZSET, &block_size) < 0) { fprintf(stderr, "failed to set block size to %d\n", block_size); err = -errno; goto close_dev; } - if (ioctl(dev_fd(dev), BLKRRPART) < 0) { + if (ioctl(dev_fd(dev)->fd, BLKRRPART) < 0) { fprintf(stderr, "failed to re-read partition table\n"); err = -errno; goto close_dev; @@ -5950,8 +5990,8 @@ static int set_feature(int argc, char **argv, struct command *cmd, struct plugin } struct nvme_set_features_args args = { + .hnd = dev_fd(dev), .args_size = sizeof(args), - .fd = dev_fd(dev), .fid = cfg.feature_id, .nsid = cfg.namespace_id, .cdw11 = cfg.value, @@ -6243,8 +6283,8 @@ static int dir_send(int argc, char **argv, struct command *cmd, struct plugin *p } struct nvme_directive_send_args args = { + .hnd = dev_fd(dev), .args_size = sizeof(args), - .fd = dev_fd(dev), .nsid = cfg.namespace_id, .dspec = cfg.dspec, .doper = cfg.doper, @@ -6321,8 +6361,8 @@ static int write_uncor(int argc, char **argv, struct command *cmd, struct plugin } struct nvme_io_args args = { + .hnd = dev_fd(dev), .args_size = sizeof(args), - .fd = dev_fd(dev), .nsid = cfg.namespace_id, .slba = cfg.start_block, .nlb = cfg.block_count, @@ -6486,8 +6526,8 @@ static int write_zeroes(int argc, char **argv, struct command *cmd, struct plugi } struct nvme_io_args args = { + .hnd = dev_fd(dev), .args_size = sizeof(args), - .fd = dev_fd(dev), .nsid = cfg.namespace_id, .slba = cfg.start_block, .nlb = cfg.block_count, @@ -6597,8 +6637,8 @@ static int dsm(int argc, char **argv, struct command *cmd, struct plugin *plugin nvme_init_dsm_range(dsm, ctx_attrs, nlbs, slbas, nr); struct nvme_dsm_args args = { + .hnd = dev_fd(dev), .args_size = sizeof(args), - .fd = dev_fd(dev), .nsid = cfg.namespace_id, .attrs = cfg.cdw11, .nr_ranges = nr, @@ -6767,8 +6807,8 @@ static int copy(int argc, char **argv, struct command *cmd, struct plugin *plugi eilbrts.f1, elbatms, elbats, nr); struct nvme_copy_args args = { + .hnd = dev_fd(dev), .args_size = sizeof(args), - .fd = dev_fd(dev), .nsid = cfg.namespace_id, .copy = copy.f0, .sdlba = cfg.sdlba, @@ -6907,8 +6947,8 @@ static int resv_acquire(int argc, char **argv, struct command *cmd, struct plugi } struct nvme_resv_acquire_args args = { + .hnd = dev_fd(dev), .args_size = sizeof(args), - .fd = dev_fd(dev), .nsid = cfg.namespace_id, .rtype = cfg.rtype, .racqa = cfg.racqa, @@ -6994,8 +7034,8 @@ static int resv_register(int argc, char **argv, struct command *cmd, struct plug } struct nvme_resv_register_args args = { + .hnd = dev_fd(dev), .args_size = sizeof(args), - .fd = dev_fd(dev), .nsid = cfg.namespace_id, .rrega = cfg.rrega, .cptpl = cfg.cptpl, @@ -7076,8 +7116,8 @@ static int resv_release(int argc, char **argv, struct command *cmd, struct plugi } struct nvme_resv_release_args args = { + .hnd = dev_fd(dev), .args_size = sizeof(args), - .fd = dev_fd(dev), .nsid = cfg.namespace_id, .rtype = cfg.rtype, .rrela = cfg.rrela, @@ -7173,8 +7213,8 @@ static int resv_report(int argc, char **argv, struct command *cmd, struct plugin memset(status, 0, size); struct nvme_resv_report_args args = { + .hnd = dev_fd(dev), .args_size = sizeof(args), - .fd = dev_fd(dev), .nsid = cfg.namespace_id, .eds = cfg.eds, .len = size, @@ -7500,8 +7540,8 @@ static int submit_io(int opcode, char *command, const char *desc, goto free_mbuffer; struct nvme_io_args args = { + .hnd = dev_fd(dev), .args_size = sizeof(args), - .fd = dev_fd(dev), .nsid = cfg.namespace_id, .slba = cfg.start_block, .nlb = nblocks, @@ -7688,8 +7728,8 @@ static int verify_cmd(int argc, char **argv, struct command *cmd, struct plugin } struct nvme_io_args args = { + .hnd = dev_fd(dev), .args_size = sizeof(args), - .fd = dev_fd(dev), .nsid = cfg.namespace_id, .slba = cfg.start_block, .nlb = cfg.block_count, @@ -7884,8 +7924,8 @@ static int get_lba_status(int argc, char **argv, struct command *cmd, } struct nvme_get_lba_status_args args = { + .hnd = dev_fd(dev), .args_size = sizeof(args), - .fd = dev_fd(dev), .nsid = cfg.namespace_id, .slba = cfg.slba, .mndw = cfg.mndw, @@ -7959,8 +7999,8 @@ static int capacity_mgmt(int argc, char **argv, struct command *cmd, struct plug } struct nvme_capacity_mgmt_args args = { + .hnd = dev_fd(dev), .args_size = sizeof(args), - .fd = dev_fd(dev), .op = cfg.operation, .element_id = cfg.element_id, .cdw11 = cfg.dw11, @@ -8090,8 +8130,8 @@ static int dir_receive(int argc, char **argv, struct command *cmd, struct plugin } struct nvme_directive_recv_args args = { + .hnd = dev_fd(dev), .args_size = sizeof(args), - .fd = dev_fd(dev), .nsid = cfg.namespace_id, .dspec = cfg.dspec, .doper = cfg.doper, @@ -8202,8 +8242,8 @@ static int lockdown_cmd(int argc, char **argv, struct command *cmd, struct plugi } struct nvme_lockdown_args args = { + .hnd = dev_fd(dev), .args_size = sizeof(args), - .fd = dev_fd(dev), .scp = cfg.scp, .prhbt = cfg.prhbt, .ifc = cfg.ifc, diff --git a/nvme.h b/nvme.h index d859983e7e..46e8603930 100644 --- a/nvme.h +++ b/nvme.h @@ -26,6 +26,8 @@ #include +#include + #include "plugin.h" #include "util/json.h" #include "util/argconfig.h" @@ -45,16 +47,11 @@ enum nvme_cli_topo_ranking { #define SYS_NVME "/sys/class/nvme" -enum nvme_dev_type { - NVME_DEV_DIRECT, - NVME_DEV_MI, -}; - struct nvme_dev { enum nvme_dev_type type; union { struct { - int fd; + struct dev_handle hnd; struct stat stat; } direct; struct { @@ -69,15 +66,15 @@ struct nvme_dev { #define dev_fd(d) __dev_fd(d, __func__, __LINE__) -static inline int __dev_fd(struct nvme_dev *dev, const char *func, int line) +static inline struct dev_handle* __dev_fd(struct nvme_dev *dev, const char *func, int line) { - if (dev->type != NVME_DEV_DIRECT) { + if ((dev->type != NVME_DEV_DIRECT)&&(dev->type != NVME_DEV_XNVME)) { fprintf(stderr, "warning: %s:%d not a direct transport!\n", func, line); - return -1; + return NULL; } - return dev->direct.fd; + return &(dev->direct.hnd); } static inline nvme_mi_ep_t dev_mi_ep(struct nvme_dev *dev) diff --git a/plugins/dera/dera-nvme.c b/plugins/dera/dera-nvme.c index 9408e506d7..59842b039d 100644 --- a/plugins/dera/dera-nvme.c +++ b/plugins/dera/dera-nvme.c @@ -95,7 +95,7 @@ enum dera_device_status DEVICE_STAUTS__OVER_TEMPRATURE = 0x09, }; -static int nvme_dera_get_device_status(int fd, enum dera_device_status *result) +static int nvme_dera_get_device_status(struct dev_handle *hnd, enum dera_device_status *result) { int err = 0; @@ -107,7 +107,7 @@ static int nvme_dera_get_device_status(int fd, enum dera_device_status *result) .cdw12 = 0x104, }; - err = nvme_submit_admin_passthru(fd, &cmd, NULL); + err = nvme_submit_admin_passthru(hnd, &cmd, NULL); if (!err && result) { *result = cmd.result; } diff --git a/plugins/fdp/fdp.c b/plugins/fdp/fdp.c index 1e292e8cfa..5895e09862 100644 --- a/plugins/fdp/fdp.c +++ b/plugins/fdp/fdp.c @@ -72,7 +72,7 @@ static int fdp_configs(int argc, char **argv, struct command *cmd, goto out; } - err = nvme_get_log_fdp_configurations(dev->direct.fd, cfg.egid, 0, + err = nvme_get_log_fdp_configurations(dev_fd(dev), cfg.egid, 0, sizeof(hdr), &hdr); if (err) { nvme_show_status(errno); @@ -85,7 +85,7 @@ static int fdp_configs(int argc, char **argv, struct command *cmd, goto out; } - err = nvme_get_log_fdp_configurations(dev->direct.fd, cfg.egid, 0, + err = nvme_get_log_fdp_configurations(dev_fd(dev), cfg.egid, 0, hdr.size, log); if (err) { nvme_show_status(errno); @@ -144,7 +144,7 @@ static int fdp_usage(int argc, char **argv, struct command *cmd, struct plugin * if (cfg.raw_binary) flags = BINARY; - err = nvme_get_log_reclaim_unit_handle_usage(dev->direct.fd, cfg.egid, + err = nvme_get_log_reclaim_unit_handle_usage(dev_fd(dev), cfg.egid, 0, sizeof(hdr), &hdr); if (err) { nvme_show_status(err); @@ -158,7 +158,7 @@ static int fdp_usage(int argc, char **argv, struct command *cmd, struct plugin * goto out; } - err = nvme_get_log_reclaim_unit_handle_usage(dev->direct.fd, cfg.egid, + err = nvme_get_log_reclaim_unit_handle_usage(dev_fd(dev), cfg.egid, 0, len, log); if (err) { nvme_show_status(err); @@ -217,7 +217,7 @@ static int fdp_stats(int argc, char **argv, struct command *cmd, struct plugin * memset(&stats, 0x0, sizeof(stats)); - err = nvme_get_log_fdp_stats(dev->direct.fd, cfg.egid, 0, sizeof(stats), &stats); + err = nvme_get_log_fdp_stats(dev_fd(dev), cfg.egid, 0, sizeof(stats), &stats); if (err) { nvme_show_status(err); goto out; @@ -278,7 +278,7 @@ static int fdp_events(int argc, char **argv, struct command *cmd, struct plugin memset(&events, 0x0, sizeof(events)); - err = nvme_get_log_fdp_events(dev->direct.fd, cfg.egid, + err = nvme_get_log_fdp_events(dev_fd(dev), cfg.egid, cfg.host_events, 0, sizeof(events), &events); if (err) { nvme_show_status(err); @@ -511,8 +511,8 @@ static int fdp_set_events(int argc, char **argv, struct command *cmd, struct plu } struct nvme_set_features_args args = { + .hnd = dev_fd(dev), .args_size = sizeof(args), - .fd = dev_fd(dev), .fid = NVME_FEAT_FID_FDP_EVENTS, .nsid = cfg.namespace_id, .cdw11 = (nev << 16) | cfg.ph, diff --git a/plugins/huawei/huawei-nvme.c b/plugins/huawei/huawei-nvme.c index 572086ce8c..cd1ba1d561 100644 --- a/plugins/huawei/huawei-nvme.c +++ b/plugins/huawei/huawei-nvme.c @@ -69,10 +69,14 @@ static int huawei_get_nvme_info(int fd, struct huawei_list_item *item, const cha int err; int len; struct stat nvme_stat_info; + struct dev_handle hnd; + + hnd.fd = fd; + hnd.dev_type = NVME_DEV_DIRECT; memset(item, 0, sizeof(*item)); - err = nvme_identify_ctrl(fd, &item->ctrl); + err = nvme_identify_ctrl(&hnd, &item->ctrl); if (err) return err; @@ -84,8 +88,8 @@ static int huawei_get_nvme_info(int fd, struct huawei_list_item *item, const cha } item->huawei_device = true; - err = nvme_get_nsid(fd, &item->nsid); - err = nvme_identify_ns(fd, item->nsid, &item->ns); + err = nvme_get_nsid(&hnd, &item->nsid); + err = nvme_identify_ns(&hnd, item->nsid, &item->ns); if (err) return err; diff --git a/plugins/innogrit/innogrit-nvme.c b/plugins/innogrit/innogrit-nvme.c index 1771538e33..2c5f06c2aa 100644 --- a/plugins/innogrit/innogrit-nvme.c +++ b/plugins/innogrit/innogrit-nvme.c @@ -138,7 +138,7 @@ static unsigned char setfilecontent(char *filenamea, unsigned char *buffer, return true; } -static int nvme_vucmd(int fd, unsigned char opcode, unsigned int cdw12, +static int nvme_vucmd(struct dev_handle *hnd, unsigned char opcode, unsigned int cdw12, unsigned int cdw13, unsigned int cdw14, unsigned int cdw15, char *data, int data_len) { @@ -153,7 +153,7 @@ static int nvme_vucmd(int fd, unsigned char opcode, unsigned int cdw12, cmd.nsid = 0; cmd.addr = (__u64)(__u64)(uintptr_t)data; cmd.data_len = data_len; - return nvme_submit_admin_passthru(fd, &cmd, NULL); + return nvme_submit_admin_passthru(hnd, &cmd, NULL); } static int innogrit_vsc_geteventlog(int argc, char **argv, diff --git a/plugins/intel/intel-nvme.c b/plugins/intel/intel-nvme.c index 8a29cf93bd..e2dfd97bbe 100644 --- a/plugins/intel/intel-nvme.c +++ b/plugins/intel/intel-nvme.c @@ -1076,7 +1076,7 @@ static int get_lat_stats_log(int argc, char **argv, struct command *cmd, struct struct nvme_get_features_args args = { .args_size = sizeof(args), - .fd = dev_fd(dev), + .hnd = dev_fd(dev), .fid = 0xf7, .nsid = 0, .sel = 0, @@ -1230,7 +1230,7 @@ static void print_intel_nlog(struct intel_vu_nlog *intel_nlog) } static int read_entire_cmd(struct nvme_passthru_cmd *cmd, int total_size, - const size_t max_tfer, int out_fd, int ioctl_fd, + const size_t max_tfer, int out_fd, struct dev_handle *hnd, __u8 *buf) { int err = 0; @@ -1238,7 +1238,7 @@ static int read_entire_cmd(struct nvme_passthru_cmd *cmd, int total_size, dword_tfer = min(max_tfer, total_size); while (total_size > 0) { - err = nvme_submit_admin_passthru(ioctl_fd, cmd, NULL); + err = nvme_submit_admin_passthru(hnd, cmd, NULL); if (err) { fprintf(stderr, "failed on cmd.data_len %u cmd.cdw13 %u cmd.cdw12 %x cmd.cdw10 %u err %x remaining size %d\n", @@ -1272,7 +1272,7 @@ static int write_header(__u8 *buf, int fd, size_t amnt) return 0; } -static int read_header(struct nvme_passthru_cmd *cmd,__u8 *buf, int ioctl_fd, +static int read_header(struct nvme_passthru_cmd *cmd,__u8 *buf, struct dev_handle *hnd, __u32 dw12, int nsid) { memset(cmd, 0, sizeof(*cmd)); @@ -1283,15 +1283,15 @@ static int read_header(struct nvme_passthru_cmd *cmd,__u8 *buf, int ioctl_fd, cmd->cdw12 = dw12; cmd->data_len = 0x1000; cmd->addr = (unsigned long)(void *)buf; - return read_entire_cmd(cmd, 0x400, 0x400, -1, ioctl_fd, buf); + return read_entire_cmd(cmd, 0x400, 0x400, -1, hnd, buf); } -static int setup_file(char *f, char *file, int fd, int type) +static int setup_file(char *f, char *file, struct dev_handle *hnd, int type) { struct nvme_id_ctrl ctrl; int err = 0, i = sizeof(ctrl.sn) - 1; - err = nvme_identify_ctrl(fd, &ctrl); + err = nvme_identify_ctrl(hnd, &ctrl); if (err) return err; @@ -1307,7 +1307,7 @@ static int setup_file(char *f, char *file, int fd, int type) return err; } -static int get_internal_log_old(__u8 *buf, int output, int fd, +static int get_internal_log_old(__u8 *buf, int output, struct dev_handle *hnd, struct nvme_passthru_cmd *cmd) { struct intel_vu_log *intel; @@ -1329,7 +1329,7 @@ static int get_internal_log_old(__u8 *buf, int output, int fd, cmd->opcode = 0xd2; cmd->cdw10 = min(dwmax, intel->size); cmd->data_len = min(dmamax, intel->size); - err = read_entire_cmd(cmd, intel->size, dwmax, output, fd, buf); + err = read_entire_cmd(cmd, intel->size, dwmax, output, hnd, buf); if (err) goto out; @@ -1583,8 +1583,8 @@ static int enable_lat_stats_tracking(int argc, char **argv, return err; struct nvme_get_features_args args_get = { + .hnd = dev_fd(dev), .args_size = sizeof(args_get), - .fd = dev_fd(dev), .fid = fid, .nsid = nsid, .sel = sel, @@ -1597,8 +1597,8 @@ static int enable_lat_stats_tracking(int argc, char **argv, }; struct nvme_set_features_args args_set = { + .hnd = dev_fd(dev), .args_size = sizeof(args_set), - .fd = dev_fd(dev), .fid = fid, .nsid = nsid, .cdw11 = option, @@ -1707,8 +1707,8 @@ static int set_lat_stats_thresholds(int argc, char **argv, } struct nvme_set_features_args args = { + .hnd = dev_fd(dev), .args_size = sizeof(args), - .fd = dev_fd(dev), .fid = fid, .nsid = nsid, .cdw11 = cfg.write ? 0x1 : 0x0, diff --git a/plugins/memblaze/memblaze-nvme.c b/plugins/memblaze/memblaze-nvme.c index 7a4633afa4..8fbc8162cf 100644 --- a/plugins/memblaze/memblaze-nvme.c +++ b/plugins/memblaze/memblaze-nvme.c @@ -342,14 +342,14 @@ static void show_memblaze_smart_log_old(struct nvme_memblaze_smart_log *smart, } } -static int show_memblaze_smart_log(int fd, __u32 nsid, const char *devname, +static int show_memblaze_smart_log(struct dev_handle *hnd, __u32 nsid, const char *devname, struct nvme_memblaze_smart_log *smart) { struct nvme_id_ctrl ctrl; char fw_ver[10]; int err = 0; - err = nvme_identify_ctrl(fd, &ctrl); + err = nvme_identify_ctrl(hnd, &ctrl); if (err) return err; @@ -477,8 +477,8 @@ static int mb_get_powermanager_status(int argc, char **argv, struct command *cmd return err; struct nvme_get_features_args args = { + .hnd = dev_fd(dev), .args_size = sizeof(args), - .fd = dev_fd(dev), .fid = feature_id, .nsid = 0, .sel = 0, @@ -535,8 +535,8 @@ static int mb_set_powermanager_status(int argc, char **argv, struct command *cmd return err; struct nvme_set_features_args args = { + .hnd = dev_fd(dev), .args_size = sizeof(args), - .fd = dev_fd(dev), .fid = cfg.feature_id, .nsid = 0, .cdw11 = cfg.value, @@ -612,8 +612,8 @@ 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; struct nvme_set_features_args args = { + .hnd = dev_fd(dev), .args_size = sizeof(args), - .fd = dev_fd(dev), .fid = cfg.feature_id, .nsid = 0, .cdw11 = cfg.value, @@ -772,7 +772,8 @@ static int mb_high_latency_log_print(int argc, char **argv, struct command *cmd, return err; } -static int memblaze_fw_commit(int fd, int select) + +static int memblaze_fw_commit(struct dev_handle *hnd, int select) { struct nvme_passthru_cmd cmd = { .opcode = nvme_admin_fw_commit, @@ -780,7 +781,7 @@ static int memblaze_fw_commit(int fd, int select) .cdw12 = select, }; - return nvme_submit_admin_passthru(fd, &cmd, NULL); + return nvme_submit_admin_passthru(hnd, &cmd, NULL); } static int mb_selective_download(int argc, char **argv, struct command *cmd, struct plugin *plugin) @@ -879,8 +880,8 @@ static int mb_selective_download(int argc, char **argv, struct command *cmd, str xfer = min(xfer, fw_size); struct nvme_fw_download_args args = { + .hnd = dev_fd(dev), .args_size = sizeof(args), - .fd = dev_fd(dev), .offset = offset, .data_len = xfer, .data = fw_buf, @@ -1084,8 +1085,8 @@ static int memblaze_clear_error_log(int argc, char **argv, struct command *cmd, return err; struct nvme_set_features_args args = { + .hnd = dev_fd(dev), .args_size = sizeof(args), - .fd = dev_fd(dev), .fid = cfg.feature_id, .nsid = 0, .cdw11 = cfg.value, @@ -1161,8 +1162,8 @@ static int mb_set_lat_stats(int argc, char **argv, option = cfg.enable; struct nvme_get_features_args args_get = { + .hnd = dev_fd(dev), .args_size = sizeof(args_get), - .fd = dev_fd(dev), .fid = fid, .nsid = nsid, .sel = sel, @@ -1175,8 +1176,8 @@ static int mb_set_lat_stats(int argc, char **argv, }; struct nvme_set_features_args args_set = { + .hnd = dev_fd(dev), .args_size = sizeof(args_set), - .fd = dev_fd(dev), .fid = fid, .nsid = nsid, .cdw11 = option, diff --git a/plugins/micron/micron-nvme.c b/plugins/micron/micron-nvme.c index bd5f7d7e69..780ae01e79 100644 --- a/plugins/micron/micron-nvme.c +++ b/plugins/micron/micron-nvme.c @@ -322,14 +322,14 @@ static int SetupDebugDataDirectories(char *strSN, char *strFilePath, return err; } -static int GetLogPageSize(int nFD, unsigned char ucLogID, int *nLogSize) +static int GetLogPageSize(struct dev_handle *hnd, unsigned char ucLogID, int *nLogSize) { int err = 0; unsigned char pTmpBuf[CommonChunkSize] = { 0 }; LogPageHeader_t *pLogHeader = NULL; if (ucLogID == 0xC1 || ucLogID == 0xC2 || ucLogID == 0xC4) { - err = nvme_get_log_simple(nFD, ucLogID, + err = nvme_get_log_simple(hnd, ucLogID, CommonChunkSize, pTmpBuf); if (err == 0) { pLogHeader = (LogPageHeader_t *) pTmpBuf; @@ -350,7 +350,7 @@ static int GetLogPageSize(int nFD, unsigned char ucLogID, int *nLogSize) return err; } -static int NVMEGetLogPage(int nFD, unsigned char ucLogID, unsigned char *pBuffer, int nBuffSize) +static int NVMEGetLogPage(struct dev_handle *hnd, unsigned char ucLogID, unsigned char *pBuffer, int nBuffSize) { int err = 0; struct nvme_passthru_cmd cmd = { 0 }; @@ -399,7 +399,7 @@ static int NVMEGetLogPage(int nFD, unsigned char ucLogID, unsigned char *pBuffer cmd.addr = (__u64) (uintptr_t) pTempPtr; cmd.nsid = 0xFFFFFFFF; cmd.data_len = uiXferDwords * 4; - err = nvme_submit_admin_passthru(nFD, &cmd, NULL); + err = nvme_submit_admin_passthru(hnd, &cmd, NULL); ullBytesRead += uiXferDwords * 4; pTempPtr = pBuffer + ullBytesRead; } @@ -407,7 +407,7 @@ static int NVMEGetLogPage(int nFD, unsigned char ucLogID, unsigned char *pBuffer return err; } -static int NVMEResetLog(int nFD, unsigned char ucLogID, int nBufferSize, +static int NVMEResetLog(struct dev_handle *hnd, unsigned char ucLogID, int nBufferSize, long long llMaxSize) { unsigned int *pBuffer = NULL; @@ -417,7 +417,7 @@ static int NVMEResetLog(int nFD, unsigned char ucLogID, int nBufferSize, return err; while (err == 0 && llMaxSize > 0) { - err = NVMEGetLogPage(nFD, ucLogID, (unsigned char *)pBuffer, nBufferSize); + err = NVMEGetLogPage(hnd, ucLogID, (unsigned char *)pBuffer, nBufferSize); if (err) { free(pBuffer); return err; @@ -433,7 +433,7 @@ static int NVMEResetLog(int nFD, unsigned char ucLogID, int nBufferSize, return err; } -static int GetCommonLogPage(int nFD, unsigned char ucLogID, +static int GetCommonLogPage(struct dev_handle *hnd, unsigned char ucLogID, unsigned char **pBuffer, int nBuffSize) { unsigned char *pTempPtr = NULL; @@ -443,7 +443,7 @@ static int GetCommonLogPage(int nFD, unsigned char ucLogID, goto exit_status; } memset(pTempPtr, 0, nBuffSize); - err = nvme_get_log_simple(nFD, ucLogID, nBuffSize, pTempPtr); + err = nvme_get_log_simple(hnd, ucLogID, nBuffSize, pTempPtr); *pBuffer = pTempPtr; exit_status: @@ -474,14 +474,14 @@ static int micron_parse_options(struct nvme_dev **dev, int argc, char **argv, return 0; } -static int micron_fw_commit(int fd, int select) +static int micron_fw_commit(struct dev_handle *hnd, int select) { struct nvme_passthru_cmd cmd = { .opcode = nvme_admin_fw_commit, .cdw10 = 8, .cdw12 = select, }; - return ioctl(fd, NVME_IOCTL_ADMIN_CMD, &cmd); + return ioctl(hnd->fd, NVME_IOCTL_ADMIN_CMD, &cmd); } static int micron_selective_download(int argc, char **argv, @@ -580,8 +580,8 @@ static int micron_selective_download(int argc, char **argv, xfer = min(xfer, fw_size); struct nvme_fw_download_args args = { + .hnd = dev_fd(dev), .args_size = sizeof(args), - .fd = dev_fd(dev), .offset = offset, .data_len = xfer, .data = fw_buf, @@ -674,8 +674,8 @@ static int micron_smbus_option(int argc, char **argv, } else if (!strcmp(opt.option, "status")) { struct nvme_get_features_args args = { - .args_size = sizeof(args), - .fd = dev_fd(dev), + .hnd = dev_fd(dev), + .args_size = sizeof(args), .fid = fid, .nsid = 1, .sel = opt.value, @@ -711,7 +711,7 @@ static int micron_smbus_option(int argc, char **argv, return -1; } - close(dev_fd(dev)); + close(dev_fd(dev)->fd); return err; } @@ -1725,16 +1725,16 @@ static void GetCtrlIDDInfo(const char *dir, struct nvme_id_ctrl *ctrlp) "nvme_controller_identify_data.bin", "id-ctrl"); } -static void GetSmartlogData(int fd, const char *dir) +static void GetSmartlogData(struct dev_handle *hnd, const char *dir) { struct nvme_smart_log smart_log; - if (nvme_get_log_smart(fd, -1, false, &smart_log) == 0) { + if (nvme_get_log_smart(hnd, -1, false, &smart_log) == 0) { WriteData((__u8*)&smart_log, sizeof(smart_log), dir, "smart_data.bin", "smart log"); } } -static void GetErrorlogData(int fd, int entries, const char *dir) +static void GetErrorlogData(struct dev_handle *hnd, int entries, const char *dir) { int logSize = entries * sizeof(struct nvme_error_log_page); struct nvme_error_log_page *error_log = @@ -1743,7 +1743,7 @@ static void GetErrorlogData(int fd, int entries, const char *dir) if (error_log == NULL) return; - if (nvme_get_log_error(fd, entries, false, error_log) == 0) { + if (nvme_get_log_error(hnd, entries, false, error_log) == 0) { WriteData((__u8*)error_log, logSize, dir, "error_information_log.bin", "error log"); } @@ -1751,7 +1751,7 @@ static void GetErrorlogData(int fd, int entries, const char *dir) free(error_log); } -static void GetGenericLogs(int fd, const char *dir) +static void GetGenericLogs(struct dev_handle *hnd, const char *dir) { struct nvme_self_test_log self_test_log; struct nvme_firmware_slot fw_log; @@ -1763,28 +1763,28 @@ static void GetGenericLogs(int fd, const char *dir) bool huge = false; /* get self test log */ - if (nvme_get_log_device_self_test(fd, &self_test_log) == 0) { + if (nvme_get_log_device_self_test(hnd, &self_test_log) == 0) { WriteData((__u8*)&self_test_log, sizeof(self_test_log), dir, "drive_self_test.bin", "self test log"); } /* get fw slot info log */ - if (nvme_get_log_fw_slot(fd, false, &fw_log) == 0) { + if (nvme_get_log_fw_slot(hnd, false, &fw_log) == 0) { WriteData((__u8*)&fw_log, sizeof(fw_log), dir, "firmware_slot_info_log.bin", "firmware log"); } /* get effects log */ - if (nvme_get_log_cmd_effects(fd, NVME_CSI_NVM, &effects) == 0) { + if (nvme_get_log_cmd_effects(hnd, NVME_CSI_NVM, &effects) == 0) { WriteData((__u8*)&effects, sizeof(effects), dir, "command_effects_log.bin", "effects log"); } /* get persistent event log */ - (void)nvme_get_log_persistent_event(fd, NVME_PEVENT_LOG_RELEASE_CTX, + (void)nvme_get_log_persistent_event(hnd, NVME_PEVENT_LOG_RELEASE_CTX, sizeof(pevent_log), &pevent_log); memset(&pevent_log, 0, sizeof(pevent_log)); - err = nvme_get_log_persistent_event(fd, NVME_PEVENT_LOG_EST_CTX_AND_READ, + err = nvme_get_log_persistent_event(hnd, NVME_PEVENT_LOG_EST_CTX_AND_READ, sizeof(pevent_log), &pevent_log); if (err) { fprintf(stderr, "Setting persistent event log read ctx failed (ignored)!\n"); @@ -1797,7 +1797,7 @@ static void GetGenericLogs(int fd, const char *dir) perror("could not alloc buffer for persistent event log page (ignored)!\n"); return; } - err = nvme_get_log_persistent_event(fd, NVME_PEVENT_LOG_READ, + err = nvme_get_log_persistent_event(hnd, NVME_PEVENT_LOG_READ, log_len, pevent_log_info); if (err == 0) { WriteData((__u8*)pevent_log_info, log_len, dir, @@ -1807,12 +1807,12 @@ static void GetGenericLogs(int fd, const char *dir) return; } -static void GetNSIDDInfo(int fd, const char *dir, int nsid) +static void GetNSIDDInfo(struct dev_handle *hnd, const char *dir, int nsid) { char file[PATH_MAX] = { 0 }; struct nvme_id_ns ns; - if (nvme_identify_ns(fd, nsid, &ns) == 0) { + if (nvme_identify_ns(hnd, nsid, &ns) == 0) { sprintf(file, "identify_namespace_%d_data.bin", nsid); WriteData((__u8*)&ns, sizeof(ns), dir, file, "id-ns"); } @@ -1858,7 +1858,7 @@ static void GetOSConfig(const char *strOSDirName) } } -static int micron_telemetry_log(int fd, __u8 type, __u8 **data, +static int micron_telemetry_log(struct dev_handle *hnd, __u8 type, __u8 **data, int *logSize, int da) { int err, bs = 512, offset = bs; @@ -1869,9 +1869,9 @@ static int micron_telemetry_log(int fd, __u8 type, __u8 **data, if (buffer == NULL) return -1; if (ctrl_init) - err = nvme_get_log_telemetry_ctrl(fd, true, 0, bs, buffer); + err = nvme_get_log_telemetry_ctrl(hnd, true, 0, bs, buffer); else - err = nvme_get_log_telemetry_host(fd, 0, bs, buffer); + err = nvme_get_log_telemetry_host(hnd, 0, bs, buffer); if (err != 0) { fprintf(stderr, "Failed to get telemetry log header for 0x%X\n", type); if (buffer != NULL) { @@ -1902,9 +1902,9 @@ static int micron_telemetry_log(int fd, __u8 type, __u8 **data, if ((buffer = (unsigned char *)realloc(buffer, (size_t)(*logSize))) != NULL) { while (err == 0 && offset != *logSize) { if (ctrl_init) - err = nvme_get_log_telemetry_ctrl(fd, true, 0, *logSize, buffer + offset); + err = nvme_get_log_telemetry_ctrl(hnd, true, 0, *logSize, buffer + offset); else - err = nvme_get_log_telemetry_host(fd, 0, *logSize, buffer + offset); + err = nvme_get_log_telemetry_host(hnd, 0, *logSize, buffer + offset); offset += bs; } } @@ -1920,7 +1920,7 @@ static int micron_telemetry_log(int fd, __u8 type, __u8 **data, return err; } -static int GetTelemetryData(int fd, const char *dir) +static int GetTelemetryData(struct dev_handle *hnd, const char *dir) { unsigned char *buffer = NULL; int i, err, logSize = 0; @@ -1934,7 +1934,7 @@ static int GetTelemetryData(int fd, const char *dir) }; for(i = 0; i < (int)(sizeof(tmap)/sizeof(tmap[0])); i++) { - err = micron_telemetry_log(fd, tmap[i].log, &buffer, &logSize, 0); + err = micron_telemetry_log(hnd, tmap[i].log, &buffer, &logSize, 0); if (err == 0 && logSize > 0 && buffer != NULL) { sprintf(msg, "telemetry log: 0x%X", tmap[i].log); WriteData(buffer, logSize, dir, tmap[i].file, msg); @@ -1948,7 +1948,7 @@ static int GetTelemetryData(int fd, const char *dir) return err; } -static int GetFeatureSettings(int fd, const char *dir) +static int GetFeatureSettings(struct dev_handle *hnd, const char *dir) { unsigned char *bufp, buf[4096] = { 0 }; int i, err, len, errcnt = 0; @@ -1983,8 +1983,8 @@ static int GetFeatureSettings(int fd, const char *dir) } struct nvme_get_features_args args = { + .hnd = hnd, .args_size = sizeof(args), - .fd = fd, .fid = fmap[i].id, .nsid = 1, .sel = 0, @@ -2379,8 +2379,8 @@ static int micron_latency_stats_track(int argc, char **argv, struct command *cmd } struct nvme_get_features_args g_args = { - .args_size = sizeof(g_args), - .fd = dev_fd(dev), + .hnd = dev_fd(dev), + .args_size = sizeof(g_args), .fid = fid, .nsid = 0, .sel = 0, @@ -2458,8 +2458,8 @@ static int micron_latency_stats_track(int argc, char **argv, struct command *cmd } struct nvme_set_features_args args = { - .args_size = sizeof(args), - .fd = dev_fd(dev), + .hnd = dev_fd(dev), + .args_size = sizeof(args), .fid = MICRON_FID_LATENCY_MONITOR, .nsid = 0, .cdw11 = enable, @@ -2800,8 +2800,8 @@ static int micron_telemetry_cntrl_option(int argc, char **argv, if (!strcmp(opt.option, "enable")) { struct nvme_set_features_args args = { - .args_size = sizeof(args), - .fd = dev_fd(dev), + .hnd = dev_fd(dev), + .args_size = sizeof(args), .fid = fid, .nsid = 1, .cdw11 = 1, @@ -2822,8 +2822,8 @@ static int micron_telemetry_cntrl_option(int argc, char **argv, } } else if (!strcmp(opt.option, "disable")) { struct nvme_set_features_args args = { - .args_size = sizeof(args), - .fd = dev_fd(dev), + .hnd = dev_fd(dev), + .args_size = sizeof(args), .fid = fid, .nsid = 1, .cdw11 = 0, @@ -2844,8 +2844,8 @@ static int micron_telemetry_cntrl_option(int argc, char **argv, } } else if (!strcmp(opt.option, "status")) { struct nvme_get_features_args args = { + .hnd = dev_fd(dev), .args_size = sizeof(args), - .fd = dev_fd(dev), .fid = fid, .nsid = 1, .sel = opt.select & 0x3, @@ -2888,7 +2888,7 @@ struct micron_common_log_header { }; /* helper function to retrieve logs with specific offset and max chunk size */ -int nvme_get_log_lpo(int fd, __u8 log_id, __u32 lpo, __u32 chunk, +int nvme_get_log_lpo(struct dev_handle *hnd, __u8 log_id, __u32 lpo, __u32 chunk, __u32 data_len, void *data) { __u32 offset = lpo, xfer_len = data_len; @@ -2897,8 +2897,8 @@ int nvme_get_log_lpo(int fd, __u8 log_id, __u32 lpo, __u32 chunk, .lpo = offset, .result = NULL, .log = ptr, + .hnd = hnd, .args_size = sizeof(args), - .fd = fd, .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, .lid = log_id, .len = xfer_len, @@ -2931,7 +2931,7 @@ int nvme_get_log_lpo(int fd, __u8 log_id, __u32 lpo, __u32 chunk, } /* retrieves logs with common log format */ -static int get_common_log(int fd, uint8_t id, uint8_t **buf, int *size) +static int get_common_log(struct dev_handle *hnd, uint8_t id, uint8_t **buf, int *size) { struct micron_common_log_header hdr = { 0 }; int log_size = sizeof(hdr), first = 0, second = 0; @@ -2939,7 +2939,7 @@ static int get_common_log(int fd, uint8_t id, uint8_t **buf, int *size) int ret = -1; int chunk = 0x4000; /* max chunk size to be used for these logs */ - ret = nvme_get_log_simple(fd, id, sizeof(hdr), &hdr); + ret = nvme_get_log_simple(hnd, id, sizeof(hdr), &hdr); if (ret) { fprintf(stderr, "pull hdr failed for %hhu with error: 0x%x\n", id, ret); return ret; @@ -2976,7 +2976,7 @@ static int get_common_log(int fd, uint8_t id, uint8_t **buf, int *size) return -ENOMEM; } memcpy(buffer, &hdr, sizeof(hdr)); - ret = nvme_get_log_lpo(fd, id, sizeof(hdr), chunk, hdr.log_size, + ret = nvme_get_log_lpo(hnd, id, sizeof(hdr), chunk, hdr.log_size, buffer + sizeof(hdr)); if (ret == 0) { log_size += hdr.log_size; @@ -2999,7 +2999,7 @@ static int get_common_log(int fd, uint8_t id, uint8_t **buf, int *size) second = hdr.write_pointer - sizeof(hdr); if (first) { - ret = nvme_get_log_lpo(fd, id, hdr.write_pointer, chunk, first, + ret = nvme_get_log_lpo(hnd, id, hdr.write_pointer, chunk, first, buffer + sizeof(hdr)); if (ret) { free(buffer); @@ -3009,7 +3009,7 @@ static int get_common_log(int fd, uint8_t id, uint8_t **buf, int *size) log_size += first; } if (second) { - ret = nvme_get_log_lpo(fd, id, sizeof(hdr), chunk, second, + ret = nvme_get_log_lpo(hnd, id, sizeof(hdr), chunk, second, buffer + sizeof(hdr) + first); if (ret) { fprintf(stderr, "failed to get log: 0x%X\n", id); diff --git a/plugins/netapp/netapp-nvme.c b/plugins/netapp/netapp-nvme.c index f5cb073308..06e98c897d 100644 --- a/plugins/netapp/netapp-nvme.c +++ b/plugins/netapp/netapp-nvme.c @@ -355,7 +355,7 @@ static void netapp_ontapdevices_print(struct ontapdevice_info *devices, } } -static int nvme_get_ontap_c2_log(int fd, __u32 nsid, void *buf, __u32 buflen) +static int nvme_get_ontap_c2_log(struct dev_handle *hnd, __u32 nsid, void *buf, __u32 buflen) { struct nvme_passthru_cmd get_log; int err; @@ -376,7 +376,7 @@ static int nvme_get_ontap_c2_log(int fd, __u32 nsid, void *buf, __u32 buflen) get_log.cdw10 |= ONTAP_C2_LOG_NSINFO_LSP << 8; get_log.cdw11 = numdu; - err = nvme_submit_admin_passthru(fd, &get_log, NULL); + err = nvme_submit_admin_passthru(hnd, &get_log, NULL); if (err) { fprintf(stderr, "ioctl error %0x\n", err); return 1; @@ -385,12 +385,12 @@ static int nvme_get_ontap_c2_log(int fd, __u32 nsid, void *buf, __u32 buflen) return 0; } -static int netapp_smdevices_get_info(int fd, struct smdevice_info *item, +static int netapp_smdevices_get_info(struct dev_handle *hnd, struct smdevice_info *item, const char *dev) { int err; - err = nvme_identify_ctrl(fd, &item->ctrl); + err = nvme_identify_ctrl(hnd, &item->ctrl); if (err) { fprintf(stderr, "Identify Controller failed to %s (%s)\n", dev, @@ -402,8 +402,8 @@ static int netapp_smdevices_get_info(int fd, struct smdevice_info *item, if (strncmp("NetApp E-Series", item->ctrl.mn, 15) != 0) return 0; /* not the right model of controller */ - err = nvme_get_nsid(fd, &item->nsid); - err = nvme_identify_ns(fd, item->nsid, &item->ns); + err = nvme_get_nsid(hnd, &item->nsid); + err = nvme_identify_ns(hnd, item->nsid, &item->ns); if (err) { fprintf(stderr, "Unable to identify namespace for %s (%s)\n", @@ -416,13 +416,13 @@ static int netapp_smdevices_get_info(int fd, struct smdevice_info *item, return 1; } -static int netapp_ontapdevices_get_info(int fd, struct ontapdevice_info *item, +static int netapp_ontapdevices_get_info(struct dev_handle *hnd, struct ontapdevice_info *item, const char *dev) { int err; void *nsdescs; - err = nvme_identify_ctrl(fd, &item->ctrl); + err = nvme_identify_ctrl(hnd, &item->ctrl); if (err) { fprintf(stderr, "Identify Controller failed to %s (%s)\n", dev, err < 0 ? strerror(-err) : @@ -434,9 +434,9 @@ static int netapp_ontapdevices_get_info(int fd, struct ontapdevice_info *item, /* not the right controller model */ return 0; - err = nvme_get_nsid(fd, &item->nsid); + err = nvme_get_nsid(hnd, &item->nsid); - err = nvme_identify_ns(fd, item->nsid, &item->ns); + err = nvme_identify_ns(hnd, item->nsid, &item->ns); if (err) { fprintf(stderr, "Unable to identify namespace for %s (%s)\n", dev, err < 0 ? strerror(-err) : @@ -449,7 +449,7 @@ static int netapp_ontapdevices_get_info(int fd, struct ontapdevice_info *item, return 0; } - err = nvme_identify_ns_descs(fd, item->nsid, nsdescs); + err = nvme_identify_ns_descs(hnd, item->nsid, nsdescs); if (err) { fprintf(stderr, "Unable to identify namespace descriptor for %s (%s)\n", dev, err < 0 ? strerror(-err) : @@ -461,7 +461,7 @@ static int netapp_ontapdevices_get_info(int fd, struct ontapdevice_info *item, memcpy(item->uuid, nsdescs + sizeof(struct nvme_ns_id_desc), sizeof(item->uuid)); free(nsdescs); - err = nvme_get_ontap_c2_log(fd, item->nsid, item->log_data, ONTAP_C2_LOG_SIZE); + err = nvme_get_ontap_c2_log(hnd, item->nsid, item->log_data, ONTAP_C2_LOG_SIZE); if (err) { fprintf(stderr, "Unable to get log page data for %s (%s)\n", dev, err < 0 ? strerror(-err): @@ -520,6 +520,7 @@ static int netapp_smdevices(int argc, char **argv, struct command *command, struct smdevice_info *smdevices; char path[264]; int num_smdevices = 0; + struct dev_handle hnd; struct config { char *output_format; @@ -566,7 +567,10 @@ static int netapp_smdevices(int argc, char **argv, struct command *command, continue; } - num_smdevices += netapp_smdevices_get_info(fd, + hnd.fd = fd; + hnd.dev_type = NVME_DEV_DIRECT; + + num_smdevices += netapp_smdevices_get_info(&hnd, &smdevices[num_smdevices], path); close(fd); } @@ -591,6 +595,7 @@ static int netapp_ontapdevices(int argc, char **argv, struct command *command, struct ontapdevice_info *ontapdevices; char path[264]; int num_ontapdevices = 0; + struct dev_handle hnd; struct config { char *output_format; @@ -636,8 +641,10 @@ static int netapp_ontapdevices(int argc, char **argv, struct command *command, strerror(errno)); continue; } + hnd.fd = fd; + hnd.dev_type = NVME_DEV_DIRECT; - num_ontapdevices += netapp_ontapdevices_get_info(fd, + num_ontapdevices += netapp_ontapdevices_get_info(&hnd, &ontapdevices[num_ontapdevices], path); close(fd); diff --git a/plugins/ocp/ocp-nvme.c b/plugins/ocp/ocp-nvme.c index 91c70f1faf..bc26617235 100644 --- a/plugins/ocp/ocp-nvme.c +++ b/plugins/ocp/ocp-nvme.c @@ -340,7 +340,7 @@ static void ocp_print_C0_log_json(void *data) json_free_object(root); } -static int get_c0_log_page(int fd, char *format) +static int get_c0_log_page(struct dev_handle *hnd, char *format) { __u8 *data; int i; @@ -360,7 +360,7 @@ static int get_c0_log_page(int fd, char *format) } memset(data, 0, sizeof(__u8) * C0_SMART_CLOUD_ATTR_LEN); - ret = nvme_get_log_simple(fd, C0_SMART_CLOUD_ATTR_OPCODE, + ret = nvme_get_log_simple(hnd, C0_SMART_CLOUD_ATTR_OPCODE, C0_SMART_CLOUD_ATTR_LEN, data); if (strcmp(format, "json")) @@ -837,8 +837,8 @@ static int eol_plp_failure_mode_get(struct nvme_dev *dev, const __u32 nsid, int err; struct nvme_get_features_args args = { + .hnd = dev_fd(dev), .args_size = sizeof(args), - .fd = dev_fd(dev), .fid = fid, .nsid = nsid, .sel = sel, @@ -884,19 +884,19 @@ static int eol_plp_failure_mode_set(struct nvme_dev *dev, const __u32 nsid, struct nvme_set_features_args args = { - .args_size = sizeof(args), - .fd = dev_fd(dev), - .fid = fid, - .nsid = nsid, - .cdw11 = mode << 30, - .cdw12 = 0, - .save = save, - .uuidx = uuid_index, - .cdw15 = 0, - .data_len = 0, - .data = NULL, - .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, - .result = &result, + .hnd = dev_fd(dev), + .args_size = sizeof(args), + .fid = fid, + .nsid = nsid, + .cdw11 = mode << 30, + .cdw12 = 0, + .save = save, + .uuidx = 0, + .cdw15 = 0, + .data_len = 0, + .data = NULL, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = &result, }; err = nvme_set_features(&args); diff --git a/plugins/scaleflux/sfx-nvme.c b/plugins/scaleflux/sfx-nvme.c index 4bcfbf6abd..c39dd8ff92 100644 --- a/plugins/scaleflux/sfx-nvme.c +++ b/plugins/scaleflux/sfx-nvme.c @@ -121,7 +121,7 @@ struct nvme_additional_smart_log { struct nvme_additional_smart_log_item grown_bb; //grown bad block }; -int nvme_query_cap(int fd, __u32 nsid, __u32 data_len, void *data) +int nvme_query_cap(struct dev_handle *hnd, __u32 nsid, __u32 data_len, void *data) { int rc = 0; struct nvme_passthru_cmd cmd = { @@ -131,10 +131,10 @@ int nvme_query_cap(int fd, __u32 nsid, __u32 data_len, void *data) .data_len = data_len, }; - rc = ioctl(fd, SFX_GET_FREESPACE, data); - return rc == 0 ? 0 : nvme_submit_admin_passthru(fd, &cmd, NULL); + rc = ioctl(hnd->fd, SFX_GET_FREESPACE, data); + return rc == 0 ? 0 : nvme_submit_admin_passthru(hnd, &cmd, NULL); } -int nvme_change_cap(int fd, __u32 nsid, __u64 capacity) +int nvme_change_cap(struct dev_handle *hnd, __u32 nsid, __u64 capacity) { struct nvme_passthru_cmd cmd = { .opcode = nvme_admin_change_cap, @@ -143,10 +143,10 @@ int nvme_change_cap(int fd, __u32 nsid, __u64 capacity) .cdw11 = (capacity >> 32), }; - return nvme_submit_admin_passthru(fd, &cmd, NULL); + return nvme_submit_admin_passthru(hnd, &cmd, NULL); } -int nvme_sfx_set_features(int fd, __u32 nsid, __u32 fid, __u32 value) +int nvme_sfx_set_features(struct dev_handle *hnd, __u32 nsid, __u32 fid, __u32 value) { struct nvme_passthru_cmd cmd = { .opcode = nvme_admin_sfx_set_features, @@ -155,10 +155,10 @@ int nvme_sfx_set_features(int fd, __u32 nsid, __u32 fid, __u32 value) .cdw11 = value, }; - return nvme_submit_admin_passthru(fd, &cmd, NULL); + return nvme_submit_admin_passthru(hnd, &cmd, NULL); } -int nvme_sfx_get_features(int fd, __u32 nsid, __u32 fid, __u32 *result) +int nvme_sfx_get_features(struct dev_handle *hnd, __u32 nsid, __u32 fid, __u32 *result) { int err = 0; struct nvme_passthru_cmd cmd = { @@ -167,7 +167,7 @@ int nvme_sfx_get_features(int fd, __u32 nsid, __u32 fid, __u32 *result) .cdw10 = fid, }; - err = nvme_submit_admin_passthru(fd, &cmd, NULL); + err = nvme_submit_admin_passthru(hnd, &cmd, NULL); if (!err && result) { *result = cmd.result; } @@ -667,7 +667,7 @@ static int get_lat_stats_log(int argc, char **argv, struct command *cmd, struct return err; } -int sfx_nvme_get_log(int fd, __u32 nsid, __u8 log_id, __u32 data_len, void *data) +int sfx_nvme_get_log(struct dev_handle *hnd, __u32 nsid, __u8 log_id, __u32 data_len, void *data) { struct nvme_passthru_cmd cmd = { .opcode = nvme_admin_get_log_page, @@ -681,7 +681,7 @@ int sfx_nvme_get_log(int fd, __u32 nsid, __u8 log_id, __u32 data_len, void *data cmd.cdw10 = log_id | (numdl << 16); cmd.cdw11 = numdu; - return nvme_submit_admin_passthru(fd, &cmd, NULL); + return nvme_submit_admin_passthru(hnd, &cmd, NULL); } /** @@ -693,14 +693,14 @@ int sfx_nvme_get_log(int fd, __u32 nsid, __u8 log_id, __u32 data_len, void *data * * @return -1 fail ; 0 success */ -static int get_bb_table(int fd, __u32 nsid, unsigned char *buf, __u64 size) +static int get_bb_table(struct dev_handle *hnd, __u32 nsid, unsigned char *buf, __u64 size) { - if (fd < 0 || !buf || size != 256*4096*sizeof(unsigned char)) { + if (hnd->fd < 0 || !buf || size != 256*4096*sizeof(unsigned char)) { fprintf(stderr, "Invalid Param \r\n"); return EINVAL; } - return sfx_nvme_get_log(fd, nsid, SFX_LOG_BBT, size, (void *)buf); + return sfx_nvme_get_log(hnd, nsid, SFX_LOG_BBT, size, (void *)buf); } /** @@ -855,7 +855,7 @@ static int query_cap_info(int argc, char **argv, struct command *cmd, struct plu return err; } -static int change_sanity_check(int fd, __u64 trg_in_4k, int *shrink) +static int change_sanity_check(struct dev_handle *hnd, __u64 trg_in_4k, int *shrink) { struct sfx_freespace_ctx freespace_ctx = { 0 }; struct sysinfo s_info; @@ -864,7 +864,7 @@ static int change_sanity_check(int fd, __u64 trg_in_4k, int *shrink) __u64 provisoned_cap_4k = 0; int extend = 0; - if (nvme_query_cap(fd, 0xffffffff, sizeof(freespace_ctx), &freespace_ctx)) { + if (nvme_query_cap(hnd, 0xffffffff, sizeof(freespace_ctx), &freespace_ctx)) { return -1; } @@ -999,7 +999,7 @@ static int change_cap(int argc, char **argv, struct command *cmd, struct plugin nvme_show_status(err); else { printf("ScaleFlux change-capacity: success\n"); - ioctl(dev_fd(dev), BLKRRPART); + ioctl(dev_fd(dev)->fd, BLKRRPART); } dev_close(dev); return err; @@ -1022,14 +1022,14 @@ static int sfx_verify_chr(int fd) return 0; } -static int sfx_clean_card(int fd) +static int sfx_clean_card(struct dev_handle *hnd) { int ret; - ret = sfx_verify_chr(fd); + ret = sfx_verify_chr(hnd->fd); if (ret) return ret; - ret = ioctl(fd, NVME_IOCTL_CLR_CARD); + ret = ioctl(hnd->fd, NVME_IOCTL_CLR_CARD); if (ret) perror("Ioctl Fail."); else diff --git a/plugins/seagate/seagate-nvme.c b/plugins/seagate/seagate-nvme.c index 1bd30a5471..021bd2f35d 100644 --- a/plugins/seagate/seagate-nvme.c +++ b/plugins/seagate/seagate-nvme.c @@ -1544,8 +1544,8 @@ static int clear_fw_activate_history(int argc, char **argv, struct command *cmd, } else { struct nvme_set_features_args args = { + .hnd = dev_fd(dev), .args_size = sizeof(args), - .fd = dev_fd(dev), .fid = 0xC1, .nsid = 0, .cdw11 = 0x80000000, @@ -1620,7 +1620,7 @@ static int vs_clr_pcie_correctable_errs(int argc, char **argv, struct command *c } else { struct nvme_set_features_args args = { .args_size = sizeof(args), - .fd = dev_fd(dev), + .hnd = dev_fd(dev), .fid = 0xC3, .nsid = 0, .cdw11 = 0x80000000, @@ -1736,7 +1736,7 @@ static int get_host_tele(int argc, char **argv, struct command *cmd, struct plug struct nvme_get_log_args args = { .args_size = sizeof(args), - .fd = dev_fd(dev), + .hnd = dev_fd(dev), .lid = cfg.log_id, .nsid = cfg.namespace_id, .lpo = offset, @@ -1853,7 +1853,7 @@ static int get_ctrl_tele(int argc, char **argv, struct command *cmd, struct plug struct nvme_get_log_args args = { .args_size = sizeof(args), - .fd = dev_fd(dev), + .hnd = dev_fd(dev), .lid = log_id, .nsid = cfg.namespace_id, .lpo = offset, @@ -1983,7 +1983,7 @@ static int vs_internal_log(int argc, char **argv, struct command *cmd, struct pl struct nvme_get_log_args args = { .args_size = sizeof(args), - .fd = dev_fd(dev), + .hnd = dev_fd(dev), .lid = log_id, .nsid = cfg.namespace_id, .lpo = offset, diff --git a/plugins/shannon/shannon-nvme.c b/plugins/shannon/shannon-nvme.c index 424b3f73be..9fe5ca462b 100644 --- a/plugins/shannon/shannon-nvme.c +++ b/plugins/shannon/shannon-nvme.c @@ -234,8 +234,8 @@ static int get_additional_feature(int argc, char **argv, struct command *cmd, st } struct nvme_get_features_args args = { + .hnd = dev_fd(dev), .args_size = sizeof(args), - .fd = dev_fd(dev), .fid = cfg.feature_id, .nsid = cfg.namespace_id, .sel = cfg.sel, @@ -360,8 +360,8 @@ static int set_additional_feature(int argc, char **argv, struct command *cmd, st } struct nvme_set_features_args args = { + .hnd = dev_fd(dev), .args_size = sizeof(args), - .fd = dev_fd(dev), .fid = cfg.feature_id, .nsid = cfg.namespace_id, .cdw11 = cfg.value, diff --git a/plugins/solidigm/solidigm-garbage-collection.c b/plugins/solidigm/solidigm-garbage-collection.c index 3828b9e67e..a185cd61c2 100644 --- a/plugins/solidigm/solidigm-garbage-collection.c +++ b/plugins/solidigm/solidigm-garbage-collection.c @@ -102,8 +102,8 @@ int solidigm_get_garbage_collection_log(int argc, char **argv, struct command *c .lpo = 0, .result = NULL, .log = &gc_log, + .hnd = dev_fd(dev), .args_size = sizeof(args), - .fd = dev_fd(dev), .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, .lid = solidigm_vu_gc_log_id, .len = sizeof(gc_log), @@ -131,7 +131,6 @@ int solidigm_get_garbage_collection_log(int argc, char **argv, struct command *c } /* Redundant close() to make static code analysis happy */ - close(dev->direct.fd); dev_close(dev); return err; } diff --git a/plugins/solidigm/solidigm-latency-tracking.c b/plugins/solidigm/solidigm-latency-tracking.c index b96ac6e6ce..452ce78d21 100644 --- a/plugins/solidigm/solidigm-latency-tracking.c +++ b/plugins/solidigm/solidigm-latency-tracking.c @@ -42,7 +42,7 @@ struct config { }; struct latency_tracker { - int fd; + struct dev_handle *hnd; __u8 uuid_index; struct config cfg; enum nvme_print_flags print_flags; @@ -278,8 +278,8 @@ static void latency_tracker_parse(struct latency_tracker *lt) static int latency_tracking_is_enable(struct latency_tracker *lt, __u32 * enabled) { struct nvme_get_features_args args_get = { + .hnd = lt->hnd, .args_size = sizeof(args_get), - .fd = lt->fd, .uuidx = lt->uuid_index, .fid = LATENCY_TRACKING_FID, .nsid = 0, @@ -309,9 +309,9 @@ static int latency_tracking_enable(struct latency_tracker *lt) } struct nvme_set_features_args args_set = { + .hnd = lt->hnd, .args_size = sizeof(args_set), - .fd = lt->fd, - .uuidx = lt->uuid_index, + .uuidx = lt->uuid_index, .fid = LATENCY_TRACKING_FID, .nsid = 0, .cdw11 = lt->cfg.enable, @@ -359,9 +359,9 @@ static int latency_tracker_get_log(struct latency_tracker *lt) .lpo = 0, .result = NULL, .log = <->stats, + .hnd = lt->hnd, .args_size = sizeof(args), - .fd = lt->fd, - .uuidx = lt->uuid_index, + .uuidx = lt->uuid_index, .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, .lid = lt->cfg.write ? WRITE_LOG_ID : READ_LOG_ID, .len = sizeof(lt->stats), @@ -419,7 +419,7 @@ int solidigm_get_latency_tracking_log(int argc, char **argv, struct command *cmd if (err) return err; - lt.fd = dev_fd(dev); + lt.hnd = dev_fd(dev); lt.print_flags = validate_output_format(lt.cfg.output_format); if (lt.print_flags == -EINVAL) { @@ -478,7 +478,7 @@ int solidigm_get_latency_tracking_log(int argc, char **argv, struct command *cmd fprintf(stderr, "Could not read feature id 0xE2.\n"); } /* Redundant close() to make static code analysis happy */ - close(dev->direct.fd); + close(dev_fd(dev)->fd); dev_close(dev); return err; } diff --git a/plugins/solidigm/solidigm-smart.c b/plugins/solidigm/solidigm-smart.c index 568d3abfd3..5905e4e20e 100644 --- a/plugins/solidigm/solidigm-smart.c +++ b/plugins/solidigm/solidigm-smart.c @@ -238,8 +238,8 @@ int solidigm_get_additional_smart_log(int argc, char **argv, struct command *cmd .lpo = 0, .result = NULL, .log = &smart_log_payload, + .hnd = dev_fd(dev), .args_size = sizeof(args), - .fd = dev_fd(dev), .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, .lid = solidigm_vu_smart_log_id, .len = sizeof(smart_log_payload), @@ -268,7 +268,7 @@ int solidigm_get_additional_smart_log(int argc, char **argv, struct command *cmd } /* Redundant close() to make static code analysis happy */ - close(dev->direct.fd); + close(dev_fd(dev)->fd); dev_close(dev); return err; } diff --git a/plugins/solidigm/solidigm-telemetry.c b/plugins/solidigm/solidigm-telemetry.c index 9946991d74..eef2135211 100644 --- a/plugins/solidigm/solidigm-telemetry.c +++ b/plugins/solidigm/solidigm-telemetry.c @@ -173,7 +173,7 @@ int solidigm_get_telemetry_log(int argc, char **argv, struct command *cmd, struc close_fd: if (!cfg.is_input_file) { /* Redundant close() to make static code analysis happy */ - close(dev->direct.fd); + close(dev_fd(dev)->fd); dev_close(dev); } ret: diff --git a/plugins/toshiba/toshiba-nvme.c b/plugins/toshiba/toshiba-nvme.c index 5540fea75d..de5956369a 100644 --- a/plugins/toshiba/toshiba-nvme.c +++ b/plugins/toshiba/toshiba-nvme.c @@ -49,7 +49,7 @@ typedef enum { } DeviceCode; -static int nvme_sct_op(int fd, __u32 opcode, __u32 cdw10, __u32 cdw11, void* data, __u32 data_len ) +static int nvme_sct_op(struct dev_handle *hnd, __u32 opcode, __u32 cdw10, __u32 cdw11, void* data, __u32 data_len ) { void *metadata = NULL; const __u32 cdw2 = 0; @@ -66,7 +66,7 @@ static int nvme_sct_op(int fd, __u32 opcode, __u32 cdw10, __u32 cdw11, void* da int err = 0; __u32 result; - err = nvme_admin_passthru(fd, opcode, flags, rsvd, + err = nvme_admin_passthru(hnd, opcode, flags, rsvd, namespace_id, cdw2, cdw3, cdw10, cdw11, cdw12, cdw13, cdw14, cdw15, data_len, data, metadata_len, metadata, @@ -74,7 +74,7 @@ static int nvme_sct_op(int fd, __u32 opcode, __u32 cdw10, __u32 cdw11, void* da return err; } -static int nvme_get_sct_status(int fd, __u32 device_mask) +static int nvme_get_sct_status(struct dev_handle *hnd, __u32 device_mask) { int err; void* data = NULL; @@ -85,7 +85,7 @@ static int nvme_get_sct_status(int fd, __u32 device_mask) return ENOMEM; memset(data, 0, data_len); - err = nvme_sct_op(fd, OP_SCT_STATUS, DW10_SCT_STATUS_COMMAND, DW11_SCT_STATUS_COMMAND, data, data_len); + err = nvme_sct_op(hnd, OP_SCT_STATUS, DW10_SCT_STATUS_COMMAND, DW11_SCT_STATUS_COMMAND, data, data_len); if (err) { fprintf(stderr, "%s: SCT status failed :%d\n", __func__, err); goto end; @@ -129,7 +129,7 @@ static int nvme_get_sct_status(int fd, __u32 device_mask) return err; } -static int nvme_sct_command_transfer_log(int fd, bool current) +static int nvme_sct_command_transfer_log(struct dev_handle *hnd, bool current) { int err; void *data = NULL; @@ -148,12 +148,12 @@ static int nvme_sct_command_transfer_log(int fd, bool current) memcpy(data, &action_code, sizeof(action_code)); memcpy(data + 2, &function_code, sizeof(function_code)); - err = nvme_sct_op(fd, OP_SCT_COMMAND_TRANSFER, DW10_SCT_COMMAND_TRANSFER, DW11_SCT_COMMAND_TRANSFER, data, data_len); + err = nvme_sct_op(hnd, OP_SCT_COMMAND_TRANSFER, DW10_SCT_COMMAND_TRANSFER, DW11_SCT_COMMAND_TRANSFER, data, data_len); free(data); return err; } -static int nvme_sct_data_transfer(int fd, void* data, size_t data_len, size_t offset) +static int nvme_sct_data_transfer(struct dev_handle *hnd, void* data, size_t data_len, size_t offset) { __u32 dw10, dw11, lba_count = (data_len) / 512; @@ -167,7 +167,7 @@ static int nvme_sct_data_transfer(int fd, void* data, size_t data_len, size_t of dw10 = (offset << 16) | lba_count; dw11 = (offset >> 16); - return nvme_sct_op(fd, OP_SCT_DATA_TRANSFER, dw10, dw11, data, data_len); + return nvme_sct_op(hnd, OP_SCT_DATA_TRANSFER, dw10, dw11, data, data_len); } static int d_raw_to_fd(const unsigned char *buf, unsigned len, int fd) @@ -211,7 +211,7 @@ static void progress_runner(float progress) fflush(stdout); } -static int nvme_get_internal_log(int fd, const char* const filename, bool current) +static int nvme_get_internal_log(struct dev_handle *hnd, const char* const filename, bool current) { int err; int o_fd = -1; @@ -233,7 +233,7 @@ static int nvme_get_internal_log(int fd, const char* const filename, bool curren unsigned int j; float progress = 0.0; - err = nvme_sct_command_transfer_log(fd, current); + err = nvme_sct_command_transfer_log(hnd, current); if (err) { fprintf(stderr, "%s: SCT command transfer failed\n", __func__); goto end; @@ -246,7 +246,7 @@ static int nvme_get_internal_log(int fd, const char* const filename, bool curren memset(page_data, 0, max_pages * page_data_len); /* Read the header to get the last log page - offsets 8->11, 12->15, 16->19 */ - err = nvme_sct_data_transfer(fd, page_data, page_data_len, 0); + err = nvme_sct_data_transfer(hnd, page_data, page_data_len, 0); if (err) { fprintf(stderr, "%s: SCT data transfer failed, page 0\n",__func__); goto end; @@ -290,7 +290,7 @@ static int nvme_get_internal_log(int fd, const char* const filename, bool curren if (pages_chunk + i >= pages) pages_chunk = pages - i; - err = nvme_sct_data_transfer(fd, page_data, + err = nvme_sct_data_transfer(hnd, page_data, pages_chunk * page_data_len, i * page_sector_len); if (err) { @@ -319,7 +319,7 @@ static int nvme_get_internal_log(int fd, const char* const filename, bool curren progress = 1.0f; progress_runner(progress); fprintf(stdout,"\n"); - err = nvme_get_sct_status(fd, MASK_IGNORE); + err = nvme_get_sct_status(hnd, MASK_IGNORE); if (err) { fprintf(stderr, "%s: bad SCT status\n", __func__); goto end; @@ -334,14 +334,14 @@ static int nvme_get_internal_log(int fd, const char* const filename, bool curren return err; } -static int nvme_get_internal_log_file(int fd, const char* const filename, bool current) +static int nvme_get_internal_log_file(struct dev_handle *hnd, const char* const filename, bool current) { int err; /* Check device supported */ - err = nvme_get_sct_status(fd, MASK_0 | MASK_1); + err = nvme_get_sct_status(hnd, MASK_0 | MASK_1); if (!err) - err = nvme_get_internal_log(fd, filename, current); + err = nvme_get_internal_log(hnd, filename, current); return err; } @@ -557,8 +557,8 @@ static int clear_correctable_errors(int argc, char **argv, struct command *cmd, goto end; struct nvme_set_features_args args = { + .hnd = dev_fd(dev), .args_size = sizeof(args), - .fd = dev_fd(dev), .fid = feature_id, .nsid = namespace_id, .cdw11 = value, diff --git a/plugins/virtium/virtium-nvme.c b/plugins/virtium/virtium-nvme.c index c8df12610e..a30a6fdcbf 100644 --- a/plugins/virtium/virtium-nvme.c +++ b/plugins/virtium/virtium-nvme.c @@ -257,7 +257,7 @@ static void vt_process_string(char *str, const size_t size) } } -static int vt_add_entry_to_log(const int fd, const char *path, const struct vtview_save_log_settings *cfg) +static int vt_add_entry_to_log(struct dev_handle *hnd, const char *path, const struct vtview_save_log_settings *cfg) { struct vtview_smart_log_entry smart; const char *filename; @@ -272,26 +272,26 @@ static int vt_add_entry_to_log(const int fd, const char *path, const struct vtvi filename = cfg->output_file; smart.time_stamp = time(NULL); - ret = nvme_get_nsid(fd, &nsid); + ret = nvme_get_nsid(hnd, &nsid); if (ret < 0) { printf("Cannot read namespace-id\n"); return -1; } - ret = nvme_identify_ns(fd, nsid, &smart.raw_ns); + ret = nvme_identify_ns(hnd, nsid, &smart.raw_ns); if (ret) { printf("Cannot read namespace identify\n"); return -1; } - ret = nvme_identify_ctrl(fd, &smart.raw_ctrl); + ret = nvme_identify_ctrl(hnd, &smart.raw_ctrl); if (ret) { printf("Cannot read device identify controller\n"); return -1; } - ret = nvme_get_log_smart(fd, NVME_NSID_ALL, false, &smart.raw_smart); + ret = nvme_get_log_smart(hnd, NVME_NSID_ALL, false, &smart.raw_smart); if (ret) { printf("Cannot read device SMART log\n"); return -1; @@ -304,7 +304,7 @@ static int vt_add_entry_to_log(const int fd, const char *path, const struct vtvi return (ret); } -static int vt_update_vtview_log_header(const int fd, const char *path, const struct vtview_save_log_settings *cfg) +static int vt_update_vtview_log_header(struct dev_handle *hnd, const char *path, const struct vtview_save_log_settings *cfg) { struct vtview_log_header header; const char *filename; @@ -337,13 +337,13 @@ static int vt_update_vtview_log_header(const int fd, const char *path, const str printf("Log file: %s\n", filename); header.time_stamp = time(NULL); - ret = nvme_identify_ctrl(fd, &header.raw_ctrl); + ret = nvme_identify_ctrl(hnd, &header.raw_ctrl); if (ret) { printf("Cannot read identify device\n"); return -1; } - ret = nvme_get_log_fw_slot(fd, false, &header.raw_fw); + ret = nvme_get_log_fw_slot(hnd, false, &header.raw_fw); if (ret) { printf("Cannot read device firmware log\n"); return -1; diff --git a/plugins/wdc/wdc-nvme.c b/plugins/wdc/wdc-nvme.c index 2d5d173bc4..a3fce1283d 100644 --- a/plugins/wdc/wdc-nvme.c +++ b/plugins/wdc/wdc-nvme.c @@ -2001,8 +2001,8 @@ static bool get_dev_mgment_cbs_data(nvme_root_t r, struct nvme_dev *dev, /* get the log page length */ struct nvme_get_log_args args_len = { + .hnd = dev_fd(dev), .args_size = sizeof(args_len), - .fd = dev_fd(dev), .lid = lid, .nsid = 0xFFFFFFFF, .lpo = 0, @@ -2038,8 +2038,8 @@ static bool get_dev_mgment_cbs_data(nvme_root_t r, struct nvme_dev *dev, /* get the log page data */ struct nvme_get_log_args args_data = { + .hnd = dev_fd(dev), .args_size = sizeof(args_data), - .fd = dev_fd(dev), .lid = lid, .nsid = 0xFFFFFFFF, .lpo = 0, @@ -2079,8 +2079,8 @@ static bool get_dev_mgment_cbs_data(nvme_root_t r, struct nvme_dev *dev, uuid_ix = 0; /* get the log page data */ struct nvme_get_log_args args = { + .hnd = dev_fd(dev), .args_size = sizeof(args), - .fd = dev_fd(dev), .lid = lid, .nsid = 0xFFFFFFFF, .lpo = 0, @@ -2188,7 +2188,7 @@ static int wdc_do_clear_dump(struct nvme_dev *dev, __u8 opcode, __u32 cdw12) return ret; } -static __u32 wdc_dump_length(int fd, __u32 opcode, __u32 cdw10, __u32 cdw12, __u32 *dump_length) +static __u32 wdc_dump_length(struct dev_handle *hnd, __u32 opcode, __u32 cdw10, __u32 cdw12, __u32 *dump_length) { int ret; __u8 buf[WDC_NVME_LOG_SIZE_DATA_LEN] = {0}; @@ -2203,7 +2203,7 @@ static __u32 wdc_dump_length(int fd, __u32 opcode, __u32 cdw10, __u32 cdw12, __u admin_cmd.cdw10 = cdw10; admin_cmd.cdw12 = cdw12; - ret = nvme_submit_admin_passthru(fd, &admin_cmd, NULL); + ret = nvme_submit_admin_passthru(hnd, &admin_cmd, NULL); if (ret != 0) { l->log_size = 0; ret = -1; @@ -2219,7 +2219,7 @@ static __u32 wdc_dump_length(int fd, __u32 opcode, __u32 cdw10, __u32 cdw12, __u return ret; } -static __u32 wdc_dump_length_e6(int fd, __u32 opcode, __u32 cdw10, __u32 cdw12, struct wdc_e6_log_hdr *dump_hdr) +static __u32 wdc_dump_length_e6(struct dev_handle *hnd, __u32 opcode, __u32 cdw10, __u32 cdw12, struct wdc_e6_log_hdr *dump_hdr) { int ret; struct nvme_passthru_cmd admin_cmd; @@ -2231,7 +2231,7 @@ static __u32 wdc_dump_length_e6(int fd, __u32 opcode, __u32 cdw10, __u32 cdw12, admin_cmd.cdw10 = cdw10; admin_cmd.cdw12 = cdw12; - ret = nvme_submit_admin_passthru(fd, &admin_cmd, NULL); + ret = nvme_submit_admin_passthru(hnd, &admin_cmd, NULL); if (ret != 0) { fprintf(stderr, "ERROR : WDC : reading dump length failed\n"); nvme_show_status(ret); @@ -2240,7 +2240,7 @@ static __u32 wdc_dump_length_e6(int fd, __u32 opcode, __u32 cdw10, __u32 cdw12, return ret; } -static __u32 wdc_dump_dui_data(int fd, __u32 dataLen, __u32 offset, __u8 *dump_data, bool last_xfer) +static __u32 wdc_dump_dui_data(struct dev_handle *hnd, __u32 dataLen, __u32 offset, __u8 *dump_data, bool last_xfer) { int ret; struct nvme_passthru_cmd admin_cmd; @@ -2258,7 +2258,7 @@ static __u32 wdc_dump_dui_data(int fd, __u32 dataLen, __u32 offset, __u8 *dump_d admin_cmd.cdw14 = WDC_NVME_CAP_DUI_DISABLE_IO; - ret = nvme_submit_admin_passthru(fd, &admin_cmd, NULL); + ret = nvme_submit_admin_passthru(hnd, &admin_cmd, NULL); if (ret != 0) { fprintf(stderr, "ERROR : WDC : reading DUI data failed\n"); nvme_show_status(ret); @@ -2267,7 +2267,7 @@ static __u32 wdc_dump_dui_data(int fd, __u32 dataLen, __u32 offset, __u8 *dump_d return ret; } -static __u32 wdc_dump_dui_data_v2(int fd, __u32 dataLen, __u64 offset, __u8 *dump_data, bool last_xfer) +static __u32 wdc_dump_dui_data_v2(struct dev_handle *hnd, __u32 dataLen, __u64 offset, __u8 *dump_data, bool last_xfer) { int ret; struct nvme_passthru_cmd admin_cmd; @@ -2289,7 +2289,7 @@ static __u32 wdc_dump_dui_data_v2(int fd, __u32 dataLen, __u64 offset, __u8 *dum else admin_cmd.cdw14 = WDC_NVME_CAP_DUI_DISABLE_IO; - ret = nvme_submit_admin_passthru(fd, &admin_cmd, NULL); + ret = nvme_submit_admin_passthru(hnd, &admin_cmd, NULL); if (ret != 0) { fprintf(stderr, "ERROR : WDC : reading DUI data V2 failed\n"); nvme_show_status(ret); @@ -2357,7 +2357,7 @@ static int wdc_do_dump(struct nvme_dev *dev, __u32 opcode,__u32 data_len, return ret; } -static int wdc_do_dump_e6(int fd, __u32 opcode,__u32 data_len, +static int wdc_do_dump_e6(struct dev_handle *hnd, __u32 opcode,__u32 data_len, __u32 cdw12, char *file, __u32 xfer_size, __u8 *log_hdr) { int ret = 0; @@ -2392,7 +2392,7 @@ static int wdc_do_dump_e6(int fd, __u32 opcode,__u32 data_len, admin_cmd.cdw10 = xfer_size >> 2; admin_cmd.cdw13 = curr_data_offset >> 2; - ret = nvme_submit_admin_passthru(fd, &admin_cmd, NULL); + ret = nvme_submit_admin_passthru(hnd, &admin_cmd, NULL); if (ret != 0) { nvme_show_status(ret); fprintf(stderr, "%s: ERROR : WDC : Get chunk %d, size = 0x%x, offset = 0x%x, addr = 0x%lx\n", @@ -2608,7 +2608,7 @@ static int wdc_do_cap_diag(nvme_root_t r, struct nvme_dev *dev, char *file, return ret; } -static int wdc_do_cap_dui(int fd, char *file, __u32 xfer_size, int data_area, int verbose, __u64 file_size, __u64 offset) +static int wdc_do_cap_dui(struct dev_handle *hnd, char *file, __u32 xfer_size, int data_area, int verbose, __u64 file_size, __u64 offset) { int ret = 0; __u32 dui_log_hdr_size = WDC_NVME_CAP_DUI_HEADER_SIZE; @@ -2634,7 +2634,7 @@ static int wdc_do_cap_dui(int fd, char *file, __u32 xfer_size, int data_area, in memset(log_hdr, 0, dui_log_hdr_size); /* get the dui telemetry and log headers */ - ret = wdc_dump_dui_data(fd, WDC_NVME_CAP_DUI_HEADER_SIZE, 0x00, (__u8 *)log_hdr, last_xfer); + ret = wdc_dump_dui_data(hnd, WDC_NVME_CAP_DUI_HEADER_SIZE, 0x00, (__u8 *)log_hdr, last_xfer); if (ret != 0) { fprintf(stderr, "%s: ERROR : WDC : Get DUI headers failed\n", __func__); fprintf(stderr, "%s: ERROR : WDC : ", __func__); @@ -2715,7 +2715,7 @@ static int wdc_do_cap_dui(int fd, char *file, __u32 xfer_size, int data_area, in if (log_size <= xfer_size) last_xfer = true; - ret = wdc_dump_dui_data(fd, xfer_size, curr_data_offset, buffer_addr, last_xfer); + ret = wdc_dump_dui_data(hnd, xfer_size, curr_data_offset, buffer_addr, last_xfer); if (ret != 0) { fprintf(stderr, "%s: ERROR : WDC : Get chunk %d, size = 0x%"PRIx64", offset = 0x%x, addr = %p\n", __func__, i, (uint64_t)log_size, curr_data_offset, buffer_addr); @@ -2829,7 +2829,7 @@ static int wdc_do_cap_dui(int fd, char *file, __u32 xfer_size, int data_area, in if (log_size <= xfer_size_long) last_xfer = true; - ret = wdc_dump_dui_data_v2(fd, (__u32)xfer_size_long, curr_data_offset, buffer_addr, last_xfer); + ret = wdc_dump_dui_data_v2(hnd, (__u32)xfer_size_long, curr_data_offset, buffer_addr, last_xfer); if (ret != 0) { fprintf(stderr, "%s: ERROR : WDC : Get chunk %d, size = 0x%"PRIx64", offset = 0x%"PRIx64", addr = %p\n", __func__, i, (uint64_t)total_size, (uint64_t)curr_data_offset, buffer_addr); @@ -2944,7 +2944,7 @@ static int wdc_do_cap_dui(int fd, char *file, __u32 xfer_size, int data_area, in if (log_size <= xfer_size_long) last_xfer = true; - ret = wdc_dump_dui_data_v2(fd, (__u32)xfer_size_long, curr_data_offset, buffer_addr, last_xfer); + ret = wdc_dump_dui_data_v2(hnd, (__u32)xfer_size_long, curr_data_offset, buffer_addr, last_xfer); if (ret != 0) { fprintf(stderr, "%s: ERROR : WDC : Get chunk %d, size = 0x%"PRIx64", offset = 0x%"PRIx64", addr = %p\n", __func__, i, (uint64_t)log_size, (uint64_t)curr_data_offset, buffer_addr); @@ -3049,7 +3049,7 @@ static int wdc_cap_diag(int argc, char **argv, struct command *command, return ret; } -static int wdc_do_get_sn730_log_len(int fd, uint32_t *len_buf, uint32_t subopcode) +static int wdc_do_get_sn730_log_len(struct dev_handle *hnd, uint32_t *len_buf, uint32_t subopcode) { int ret; uint32_t *output = NULL; @@ -3068,14 +3068,14 @@ static int wdc_do_get_sn730_log_len(int fd, uint32_t *len_buf, uint32_t subopcod admin_cmd.cdw12 = subopcode; admin_cmd.cdw10 = SN730_LOG_CHUNK_SIZE / 4; - ret = nvme_submit_admin_passthru(fd, &admin_cmd, NULL); + ret = nvme_submit_admin_passthru(hnd, &admin_cmd, NULL); if (ret == 0) *len_buf = *output; free(output); return ret; } -static int wdc_do_get_sn730_log(int fd, void * log_buf, uint32_t offset, uint32_t subopcode) +static int wdc_do_get_sn730_log(struct dev_handle *hnd, void * log_buf, uint32_t offset, uint32_t subopcode) { int ret; uint8_t *output = NULL; @@ -3093,13 +3093,13 @@ static int wdc_do_get_sn730_log(int fd, void * log_buf, uint32_t offset, uint32_ admin_cmd.cdw13 = offset; admin_cmd.cdw10 = SN730_LOG_CHUNK_SIZE / 4; - ret = nvme_submit_admin_passthru(fd, &admin_cmd, NULL); + ret = nvme_submit_admin_passthru(hnd, &admin_cmd, NULL); if (!ret) memcpy(log_buf, output, SN730_LOG_CHUNK_SIZE); return ret; } -static int get_sn730_log_chunks(int fd, uint8_t* log_buf, uint32_t log_len, uint32_t subopcode) +static int get_sn730_log_chunks(struct dev_handle *hnd, uint8_t* log_buf, uint32_t log_len, uint32_t subopcode) { int ret = 0; uint8_t* chunk_buf = NULL; @@ -3114,7 +3114,7 @@ static int get_sn730_log_chunks(int fd, uint8_t* log_buf, uint32_t log_len, uint while (remaining > 0) { memset(chunk_buf, 0, SN730_LOG_CHUNK_SIZE); - ret = wdc_do_get_sn730_log(fd, chunk_buf, curr_offset, subopcode); + ret = wdc_do_get_sn730_log(hnd, chunk_buf, curr_offset, subopcode); if (!ret) { if (remaining >= SN730_LOG_CHUNK_SIZE) { memcpy(log_buf + (curr_offset * SN730_LOG_CHUNK_SIZE), @@ -3133,7 +3133,7 @@ static int get_sn730_log_chunks(int fd, uint8_t* log_buf, uint32_t log_len, uint return ret; } -static int wdc_do_sn730_get_and_tar(int fd, char * outputName) +static int wdc_do_sn730_get_and_tar(struct dev_handle *hnd, char * outputName) { int ret = 0; void *retPtr; @@ -3183,22 +3183,22 @@ static int wdc_do_sn730_get_and_tar(int fd, char * outputName) fprintf(stderr, "Stored log files in directory: %s\n", tarInfo->bufferFolderPath); } - ret = wdc_do_get_sn730_log_len(fd, &full_log_len, SN730_GET_FULL_LOG_LENGTH); + ret = wdc_do_get_sn730_log_len(hnd, &full_log_len, SN730_GET_FULL_LOG_LENGTH); if (ret) { nvme_show_status(ret); goto free_buf; } - ret = wdc_do_get_sn730_log_len(fd, &key_log_len, SN730_GET_KEY_LOG_LENGTH); + ret = wdc_do_get_sn730_log_len(hnd, &key_log_len, SN730_GET_KEY_LOG_LENGTH); if (ret) { nvme_show_status(ret); goto free_buf; } - ret = wdc_do_get_sn730_log_len(fd, &core_dump_log_len, SN730_GET_COREDUMP_LOG_LENGTH); + ret = wdc_do_get_sn730_log_len(hnd, &core_dump_log_len, SN730_GET_COREDUMP_LOG_LENGTH); if (ret) { nvme_show_status(ret); goto free_buf; } - ret = wdc_do_get_sn730_log_len(fd, &extended_log_len, SN730_GET_EXTENDED_LOG_LENGTH); + ret = wdc_do_get_sn730_log_len(hnd, &extended_log_len, SN730_GET_EXTENDED_LOG_LENGTH); if (ret) { nvme_show_status(ret); goto free_buf; @@ -3216,28 +3216,28 @@ static int wdc_do_sn730_get_and_tar(int fd, char * outputName) } /* Get the full log */ - ret = get_sn730_log_chunks(fd, full_log_buf, full_log_len, SN730_GET_FULL_LOG_SUBOPCODE); + ret = get_sn730_log_chunks(hnd, full_log_buf, full_log_len, SN730_GET_FULL_LOG_SUBOPCODE); if (ret) { nvme_show_status(ret); goto free_buf; } /* Get the key log */ - ret = get_sn730_log_chunks(fd, key_log_buf, key_log_len, SN730_GET_KEY_LOG_SUBOPCODE); + ret = get_sn730_log_chunks(hnd, key_log_buf, key_log_len, SN730_GET_KEY_LOG_SUBOPCODE); if (ret) { nvme_show_status(ret); goto free_buf; } /* Get the core dump log */ - ret = get_sn730_log_chunks(fd, core_dump_log_buf, core_dump_log_len, SN730_GET_CORE_LOG_SUBOPCODE); + ret = get_sn730_log_chunks(hnd, core_dump_log_buf, core_dump_log_len, SN730_GET_CORE_LOG_SUBOPCODE); if (ret) { nvme_show_status(ret); goto free_buf; } /* Get the extended log */ - ret = get_sn730_log_chunks(fd, extended_log_buf, extended_log_len, SN730_GET_EXTEND_LOG_SUBOPCODE); + ret = get_sn730_log_chunks(hnd, extended_log_buf, extended_log_len, SN730_GET_EXTEND_LOG_SUBOPCODE); if (ret) { nvme_show_status(ret); goto free_buf; @@ -5271,7 +5271,7 @@ static void wdc_print_fw_act_history_log_json(__u8 *data, int num_entries, __u32 json_free_object(root); } -static int nvme_get_ext_smart_cloud_log(int fd, __u8 **data, int uuid_index, __u32 namespace_id) +static int nvme_get_ext_smart_cloud_log(struct dev_handle *hnd, __u8 **data, int uuid_index, __u32 namespace_id) { int ret, i; __u8 *log_ptr = NULL; @@ -5283,8 +5283,8 @@ static int nvme_get_ext_smart_cloud_log(int fd, __u8 **data, int uuid_index, __u /* Get the 0xC0 log data */ struct nvme_get_log_args args = { + .hnd = hnd, .args_size = sizeof(args), - .fd = fd, .lid = WDC_NVME_GET_SMART_CLOUD_ATTR_LOG_ID, .nsid = namespace_id, .lpo = 0, @@ -5330,7 +5330,7 @@ static int nvme_get_ext_smart_cloud_log(int fd, __u8 **data, int uuid_index, __u } -static int nvme_get_hw_rev_log(int fd, __u8 **data, int uuid_index, __u32 namespace_id) +static int nvme_get_hw_rev_log(struct dev_handle *hnd, __u8 **data, int uuid_index, __u32 namespace_id) { int ret, i; wdc_nvme_hw_rev_log *log_ptr = NULL; @@ -5342,8 +5342,8 @@ static int nvme_get_hw_rev_log(int fd, __u8 **data, int uuid_index, __u32 namesp /* Get the 0xC0 log data */ struct nvme_get_log_args args = { + .hnd = hnd, .args_size = sizeof(args), - .fd = fd, .lid = WDC_NVME_GET_HW_REV_LOG_OPCODE, .nsid = namespace_id, .lpo = 0, @@ -6288,8 +6288,8 @@ static int wdc_get_c0_log_page(nvme_root_t r, struct nvme_dev *dev, char *format /* Get the 0xC0 log data */ struct nvme_get_log_args args = { + .hnd = dev_fd(dev), .args_size = sizeof(args), - .fd = dev_fd(dev), .lid = WDC_NVME_GET_SMART_CLOUD_ATTR_LOG_ID, .nsid = namespace_id, .lpo = 0, @@ -6351,8 +6351,8 @@ static int wdc_get_c0_log_page(nvme_root_t r, struct nvme_dev *dev, char *format /* Get the 0xC0 log data */ struct nvme_get_log_args args = { + .hnd = dev_fd(dev), .args_size = sizeof(args), - .fd = dev_fd(dev), .lid = WDC_NVME_GET_EOL_STATUS_LOG_OPCODE, .nsid = NVME_NSID_ALL, .lpo = 0, @@ -7727,7 +7727,7 @@ static int wdc_get_unsupported_reqs_log(int argc, char **argv, struct command *c return ret; } -static int wdc_do_clear_pcie_correctable_errors(int fd) +static int wdc_do_clear_pcie_correctable_errors(struct dev_handle *hnd) { int ret; struct nvme_passthru_cmd admin_cmd; @@ -7737,12 +7737,12 @@ static int wdc_do_clear_pcie_correctable_errors(int fd) admin_cmd.cdw12 = ((WDC_NVME_CLEAR_PCIE_CORR_SUBCMD << WDC_NVME_SUBCMD_SHIFT) | WDC_NVME_CLEAR_PCIE_CORR_CMD); - ret = nvme_submit_admin_passthru(fd, &admin_cmd, NULL); + ret = nvme_submit_admin_passthru(hnd, &admin_cmd, NULL); nvme_show_status(ret); return ret; } -static int wdc_do_clear_pcie_correctable_errors_vuc(int fd) +static int wdc_do_clear_pcie_correctable_errors_vuc(struct dev_handle *hnd) { int ret; struct nvme_passthru_cmd admin_cmd; @@ -7750,18 +7750,18 @@ static int wdc_do_clear_pcie_correctable_errors_vuc(int fd) memset(&admin_cmd, 0, sizeof (admin_cmd)); admin_cmd.opcode = WDC_NVME_CLEAR_PCIE_CORR_OPCODE_VUC; - ret = nvme_submit_admin_passthru(fd, &admin_cmd, NULL); + ret = nvme_submit_admin_passthru(hnd, &admin_cmd, NULL); nvme_show_status(ret); return ret; } -static int wdc_do_clear_pcie_correctable_errors_fid(int fd) +static int wdc_do_clear_pcie_correctable_errors_fid(struct dev_handle *hnd) { int ret; __u32 result; __u32 value = 1 << 31; /* Bit 31 - clear PCIe correctable count */ - ret = nvme_set_features_simple(fd, WDC_NVME_CLEAR_PCIE_CORR_FEATURE_ID, 0, value, + ret = nvme_set_features_simple(hnd, WDC_NVME_CLEAR_PCIE_CORR_FEATURE_ID, 0, value, false, &result); nvme_show_status(ret); @@ -8177,8 +8177,8 @@ static int wdc_vs_fw_activate_history(int argc, char **argv, struct command *com /* Get the 0xC0 log data */ struct nvme_get_log_args args = { + .hnd = dev_fd(dev), .args_size = sizeof(args), - .fd = dev_fd(dev), .lid = WDC_NVME_GET_SMART_CLOUD_ATTR_LOG_ID, .nsid = 0xFFFFFFFF, .lpo = 0, @@ -8230,7 +8230,7 @@ static int wdc_vs_fw_activate_history(int argc, char **argv, struct command *com return ret; } -static int wdc_do_clear_fw_activate_history_vuc(int fd) +static int wdc_do_clear_fw_activate_history_vuc(struct dev_handle *hnd) { int ret = -1; struct nvme_passthru_cmd admin_cmd; @@ -8240,19 +8240,19 @@ static int wdc_do_clear_fw_activate_history_vuc(int fd) admin_cmd.cdw12 = ((WDC_NVME_CLEAR_FW_ACT_HIST_SUBCMD << WDC_NVME_SUBCMD_SHIFT) | WDC_NVME_CLEAR_FW_ACT_HIST_CMD); - ret = nvme_submit_admin_passthru(fd, &admin_cmd, NULL); + ret = nvme_submit_admin_passthru(hnd, &admin_cmd, NULL); nvme_show_status(ret); return ret; } -static int wdc_do_clear_fw_activate_history_fid(int fd) +static int wdc_do_clear_fw_activate_history_fid(struct dev_handle *hnd) { int ret = -1; __u32 result; __u32 value = 1 << 31; /* Bit 31 - Clear Firmware Update History Log */ - ret = nvme_set_features_simple(fd, WDC_NVME_CLEAR_FW_ACT_HIST_VU_FID, 0, value, + ret = nvme_set_features_simple(hnd, WDC_NVME_CLEAR_FW_ACT_HIST_VU_FID, 0, value, false, &result); nvme_show_status(ret); diff --git a/plugins/zns/zns.c b/plugins/zns/zns.c index f8809ba474..bc111bb1e8 100644 --- a/plugins/zns/zns.c +++ b/plugins/zns/zns.c @@ -272,8 +272,8 @@ static int zns_mgmt_send(int argc, char **argv, struct command *cmd, struct plug } struct nvme_zns_mgmt_send_args args = { + .hnd = dev_fd(dev), .args_size = sizeof(args), - .fd = dev_fd(dev), .nsid = cfg.namespace_id, .slba = cfg.zslba, .zsa = zsa, @@ -305,14 +305,14 @@ static int zns_mgmt_send(int argc, char **argv, struct command *cmd, struct plug return err; } -static int get_zdes_bytes(int fd, __u32 nsid) +static int get_zdes_bytes(struct dev_handle *hnd, __u32 nsid) { struct nvme_zns_id_ns ns; struct nvme_id_ns id_ns; __u8 lbaf; int err; - err = nvme_identify_ns(fd, nsid, &id_ns); + err = nvme_identify_ns(hnd, nsid, &id_ns); if (err > 0) { nvme_show_status(err); return -1; @@ -321,7 +321,7 @@ static int get_zdes_bytes(int fd, __u32 nsid) return -1; } - err = nvme_zns_identify_ns(fd, nsid, &ns); + err = nvme_zns_identify_ns(hnd, nsid, &ns); if (err > 0) { nvme_show_status(err); return -1; @@ -437,8 +437,8 @@ static int zone_mgmt_send(int argc, char **argv, struct command *cmd, struct plu } struct nvme_zns_mgmt_send_args args = { + .hnd = dev_fd(dev), .args_size = sizeof(args), - .fd = dev_fd(dev), .nsid = cfg.namespace_id, .slba = cfg.zslba, .zsa = cfg.zsa, @@ -527,8 +527,8 @@ static int open_zone(int argc, char **argv, struct command *cmd, struct plugin * } struct nvme_zns_mgmt_send_args args = { + .hnd = dev_fd(dev), .args_size = sizeof(args), - .fd = dev_fd(dev), .nsid = cfg.namespace_id, .slba = cfg.zslba, .zsa = NVME_ZNS_ZSA_OPEN, @@ -641,8 +641,8 @@ static int set_zone_desc(int argc, char **argv, struct command *cmd, struct plug } struct nvme_zns_mgmt_send_args args = { + .hnd = dev_fd(dev), .args_size = sizeof(args), - .fd = dev_fd(dev), .nsid = cfg.namespace_id, .slba = cfg.zslba, .zsa = NVME_ZNS_ZSA_SET_DESC_EXT, @@ -708,8 +708,8 @@ static int zrwa_flush_zone(int argc, char **argv, struct command *cmd, struct pl } struct nvme_zns_mgmt_send_args args = { + .hnd = dev_fd(dev), .args_size = sizeof(args), - .fd = dev_fd(dev), .nsid = cfg.namespace_id, .slba = cfg.lba, .zsa = NVME_ZNS_ZSA_ZRWA_FLUSH, @@ -801,8 +801,8 @@ static int zone_mgmt_recv(int argc, char **argv, struct command *cmd, struct plu } struct nvme_zns_mgmt_recv_args args = { + .hnd = dev_fd(dev), .args_size = sizeof(args), - .fd = dev_fd(dev), .nsid = cfg.namespace_id, .slba = cfg.zslba, .zra = cfg.zra, @@ -1186,8 +1186,8 @@ static int zone_append(int argc, char **argv, struct command *cmd, struct plugin control |= NVME_IO_ZNS_APPEND_PIREMAP; struct nvme_zns_append_args args = { + .hnd = dev_fd(dev), .args_size = sizeof(args), - .fd = dev_fd(dev), .nsid = cfg.namespace_id, .zslba = cfg.zslba, .nlb = nblocks,