Blob Blame History Raw
From 43c1ac652b74182e483f2e8033a5f5fe417fb429 Mon Sep 17 00:00:00 2001
From: Daniel Wagner <dwagner@suse.de>
Date: Mon, 11 Jul 2022 13:39:39 +0200
Subject: [PATCH] nvme: Return status/error code for effects-log command

collect_effects_log eats up the return code from
nvme_get_log_cmd_effects. Forward it to the shell..

Fixes: 155fbebfe7b7 ("Update effects-log to handle multiple command sets")

Signed-off-by: Daniel Wagner <dwagner@suse.de>
---
 nvme.c | 44 ++++++++++++++++++++++++--------------------
 1 file changed, 24 insertions(+), 20 deletions(-)

diff --git a/nvme.c b/nvme.c
index a2a9996a..6df08d7e 100644
--- a/nvme.c
+++ b/nvme.c
@@ -587,18 +587,22 @@ ret:
 	return err;
 }
 
-void collect_effects_log(int fd, enum nvme_csi csi, struct list_head *list, int flags)
+static int collect_effects_log(int fd, enum nvme_csi csi,
+			       struct list_head *list, int flags)
 {
+	nvme_effects_log_node_t *node;
 	int err;
-	nvme_effects_log_node_t *node = malloc(sizeof(nvme_effects_log_node_t));
+
+	node = malloc(sizeof(nvme_effects_log_node_t));
 	if (!node)
-		return;
+		return -ENOMEM;
+
 	node->csi = csi;
 
 	err = nvme_get_log_cmd_effects(fd, csi, &node->effects);
 	if (!err) {
 		list_add(list, &node->node);
-		return;
+		return err;
 	}
 	else if (err > 0)
 		nvme_show_status(err);
@@ -606,6 +610,7 @@ void collect_effects_log(int fd, enum nvme_csi csi, struct list_head *list, int
 		fprintf(stderr, "effects log page: %s\n", nvme_strerror(errno));
 
 	free(node);
+	return err;
 }
 
 static int get_effects_log(int argc, char **argv, struct command *cmd, struct plugin *plugin)
@@ -676,29 +681,28 @@ static int get_effects_log(int argc, char **argv, struct command *cmd, struct pl
 		nvme_command_set_supported = NVME_CAP_CSS(cap) & NVME_CAP_CSS_NVM;
 		other_command_sets_supported = NVME_CAP_CSS(cap) & NVME_CAP_CSS_CSI;
 
+		if (nvme_command_set_supported)
+			err = collect_effects_log(fd, NVME_CSI_NVM,
+						  &log_pages, flags);
 
-		if (nvme_command_set_supported) {
-			collect_effects_log(fd, NVME_CSI_NVM, &log_pages, flags);
-		}
-
-		if (other_command_sets_supported) {
-			collect_effects_log(fd, NVME_CSI_ZNS, &log_pages, flags);
-		}
-
-		nvme_print_effects_log_pages(&log_pages, flags);
+		if (!err && other_command_sets_supported)
+			err = collect_effects_log(fd, NVME_CSI_ZNS,
+						  &log_pages, flags);
 
-	}
-	else {
-		collect_effects_log(fd, cfg.csi, &log_pages, flags);
-		nvme_print_effects_log_pages(&log_pages, flags);
+	} else {
+		err = collect_effects_log(fd, cfg.csi, &log_pages, flags);
 	}
 
+	if (!err)
+		nvme_print_effects_log_pages(&log_pages, flags);
+	else if (err > 0)
+		nvme_show_status(err);
+	else
+		perror("effects log page");
 
 close_fd:
-	while ((node = list_pop(&log_pages, nvme_effects_log_node_t, node))) {
+	while ((node = list_pop(&log_pages, nvme_effects_log_node_t, node)))
 		free(node);
-	}
-
 	close(fd);
 ret:
 	return err;
-- 
2.31.1