Blob Blame History Raw
From 0ffab5433084c8f93d152938e58be2a2162d8059 Mon Sep 17 00:00:00 2001
From: David Milburn <dmilburn@redhat.com>
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 <eyalbe@il.ibm.com>
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 <dmilburn@redhat.com>
---
 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