From 0ffab5433084c8f93d152938e58be2a2162d8059 Mon Sep 17 00:00:00 2001 From: David Milburn Date: Tue, 18 Dec 2018 15:55:49 -0600 Subject: [PATCH 5/5] nvme list : fix nvme list output if identify failed on device commit 6c10501eb7e8423892735c5aa3b8c135d26fdbf3 Author: Eyal Ben David Date: Tue Aug 28 19:49:09 2018 +0300 nvme list : fix nvme list output if identify failed on device changed files: nvme.c function list() nvme-ioctl.c function nvme_get_nsid() : return -errno if fstat fails Signed-off-by: David Milburn --- nvme-ioctl.c | 2 +- nvme.c | 37 +++++++++++++++++++++++++------------ 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/nvme-ioctl.c b/nvme-ioctl.c index c28a0d9..5444806 100644 --- a/nvme-ioctl.c +++ b/nvme-ioctl.c @@ -74,7 +74,7 @@ int nvme_get_nsid(int fd) int err = fstat(fd, &nvme_stat); if (err < 0) - return err; + return -errno; if (!S_ISBLK(nvme_stat.st_mode)) { fprintf(stderr, diff --git a/nvme.c b/nvme.c index 0722132..700a4d1 100644 --- a/nvme.c +++ b/nvme.c @@ -1580,37 +1580,50 @@ static int list(int argc, char **argv, struct command *cmd, struct plugin *plugi list_items = calloc(n, sizeof(*list_items)); if (!list_items) { fprintf(stderr, "can not allocate controller list payload\n"); - return ENOMEM; + ret = -ENOMEM; + goto cleanup_devices; } for (i = 0; i < n; i++) { snprintf(path, sizeof(path), "%s%s", dev, devices[i]->d_name); fd = open(path, O_RDONLY); if (fd < 0) { - fprintf(stderr, "can not open %s: %s\n", path, + fprintf(stderr, "cannot open %s: %s\n", path, strerror(errno)); - return errno; + ret = -errno; + goto cleanup_list_items; } ret = get_nvme_info(fd, &list_items[list_cnt], path); close(fd); - if (ret) + if (ret == 0) { + list_cnt++; + } + else if (ret > 0) { fprintf(stderr, "%s: failed to obtain nvme info: %s\n", - path, strerror(errno)); + path, nvme_status_to_string(ret)); + } + else { + fprintf(stderr, "%s: failed to obtain nvme info: %s\n", + path, strerror(-ret)); + } + } + + if (list_cnt) { + if (fmt == JSON) + json_print_list_items(list_items, list_cnt); else - list_cnt++; + show_list_items(list_items, list_cnt); } - if (fmt == JSON) - json_print_list_items(list_items, list_cnt); - else - show_list_items(list_items, list_cnt); + cleanup_list_items: + free(list_items); + cleanup_devices: for (i = 0; i < n; i++) free(devices[i]); free(devices); - free(list_items); - return 0; + return ret; } int __id_ctrl(int argc, char **argv, struct command *cmd, struct plugin *plugin, void (*vs)(__u8 *vs, struct json_object *root)) -- 1.8.3.1