From: Eyal Ben David Date: Tue, 28 Aug 2018 16:49:09 +0000 (+0300) Subject: nvme list : fix nvme list output if identify failed on device X-Git-Tag: v1.7~81^2~1 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=6c10501eb7e8423892735c5aa3b8c135d26fdbf3;p=users%2Fsagi%2Fnvme-cli.git 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 --- diff --git a/nvme-ioctl.c b/nvme-ioctl.c index d63c863d..094bd6e2 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 f149bab4..fb7e842e 100644 --- a/nvme.c +++ b/nvme.c @@ -1652,37 +1652,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))