]> www.infradead.org Git - users/sagi/nvme-cli.git/commitdiff
nvme list : fix nvme list output if identify failed on device
authorEyal Ben David <eyalbe@il.ibm.com>
Tue, 28 Aug 2018 16:49:09 +0000 (19:49 +0300)
committerEyal Ben David <eyalbe@il.ibm.com>
Tue, 28 Aug 2018 16:49:09 +0000 (19:49 +0300)
changed files:
nvme.c        function list()
nvme-ioctl.c  function nvme_get_nsid() : return -errno if fstat fails

nvme-ioctl.c
nvme.c

index d63c863d43bb2520086d8e9cbbf35722a7f1d1eb..094bd6e20319350bde6d540a253b462034a0e0e4 100644 (file)
@@ -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 f149bab42af4b8248c79572d8739dda182781bd4..fb7e842ecb347f7e7dbfdcf2a3e2eddd164910aa 100644 (file)
--- 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))