From f5146741f33ed31ea7c9355a3631e1758de0cc2b Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Thu, 21 Oct 2021 13:06:40 +0200 Subject: [PATCH] Revert "nvme-print: Use array array instead of ccan/list" This reverts commit cf2ab19f1881a8945bb07fa42dbbc018fc55f797. --- nvme-print.c | 15 +++++---------- nvme-print.h | 5 ++++- nvme.c | 49 ++++++++++++++++++++++++++----------------------- 3 files changed, 35 insertions(+), 34 deletions(-) diff --git a/nvme-print.c b/nvme-print.c index a2ecc0ff..f7cc9090 100644 --- a/nvme-print.c +++ b/nvme-print.c @@ -846,18 +846,16 @@ struct json_object* json_effects_log(enum nvme_csi csi, return root; } -void json_effects_log_list(nvme_effects_log_node_t *nodes[]) { +void json_effects_log_list(struct list_head *list) { struct json_object *json_list; nvme_effects_log_node_t *node; - int idx = 0; json_list = json_create_array(); - while ((node = nodes[idx])) { + list_for_each(list, node, node) { struct json_object *json_page = json_effects_log(node->csi, &node->effects); json_array_add_value_object(json_list, json_page); - idx++; } json_print_object(json_list, NULL); @@ -4796,23 +4794,20 @@ void nvme_print_effects_log_page(enum nvme_csi csi, struct nvme_cmd_effects_log nvme_print_effects_log_segment(0, 0x80, 0x100, effects, "Vendor Specific I/O Commands", human); } -void nvme_print_effects_log_pages(nvme_effects_log_node_t *nodes[], +void nvme_print_effects_log_pages(struct list_head *list, int flags) { - int idx = 0; - if (flags & JSON) - return json_effects_log_list(nodes); + return json_effects_log_list(list); nvme_effects_log_node_t *node; - while ((node = nodes[idx])) { + list_for_each(list, node, node) { if (flags & BINARY) { d_raw((unsigned char *)&node->effects, sizeof(node->effects)); } else { nvme_print_effects_log_page(node->csi, &node->effects, flags); } - idx++; } } diff --git a/nvme-print.h b/nvme-print.h index 33ab3f97..905c1e2f 100644 --- a/nvme-print.h +++ b/nvme-print.h @@ -4,9 +4,12 @@ #include "nvme.h" #include +#include + typedef struct nvme_effects_log_node { enum nvme_csi csi; struct nvme_cmd_effects_log effects; + struct list_node node; } nvme_effects_log_node_t; void d(unsigned char *buf, int len, int width, int group); @@ -36,7 +39,7 @@ void nvme_show_self_test_log(struct nvme_self_test_log *self_test, __u8 dst_entr __u32 size, const char *devname, enum nvme_print_flags flags); void nvme_show_fw_log(struct nvme_firmware_slot *fw_log, const char *devname, enum nvme_print_flags flags); -void nvme_print_effects_log_pages(nvme_effects_log_node_t *nodes[], int flags); +void nvme_print_effects_log_pages(struct list_head *list, int flags); void nvme_show_changed_ns_list_log(struct nvme_ns_list *log, const char *devname, enum nvme_print_flags flags); void nvme_show_endurance_log(struct nvme_endurance_group_log *endurance_log, diff --git a/nvme.c b/nvme.c index f40b47e6..1b03555e 100644 --- a/nvme.c +++ b/nvme.c @@ -504,29 +504,27 @@ ret: return nvme_status_to_errno(err, false); } -static int collect_effects_log(int fd, enum nvme_csi csi, nvme_effects_log_node_t **node, int flags) +void collect_effects_log(int fd, enum nvme_csi csi, struct list_head *list, int flags) { int err; - nvme_effects_log_node_t *n; - - n = malloc(sizeof(nvme_effects_log_node_t)); - if (!n) { + nvme_effects_log_node_t *node = malloc(sizeof(nvme_effects_log_node_t)); + if (!node) { perror("Failed to allocate memory"); - return -1; + return; } - n->csi = csi; + node->csi = csi; - err = nvme_get_log_cmd_effects(fd, csi, &n->effects); + err = nvme_get_log_cmd_effects(fd, csi, &node->effects); if (!err) { - *node = n; - return 0; - } else if (err > 0) + list_add(list, &node->node); + return; + } + else if (err > 0) nvme_show_status(err); else perror("effects log page"); - free(n); - return -1; + free(node); } static int get_effects_log(int argc, char **argv, struct command *cmd, struct plugin *plugin) @@ -535,8 +533,8 @@ static int get_effects_log(int argc, char **argv, struct command *cmd, struct pl const char *raw = "show log in binary format"; const char *human_readable = "show log in readable format"; const char *csi = ""; - nvme_effects_log_node_t *nodes[3] = { NULL }; - int idx = 0; + struct list_head log_pages; + nvme_effects_log_node_t *node; void *bar = NULL; @@ -575,6 +573,8 @@ static int get_effects_log(int argc, char **argv, struct command *cmd, struct pl if (cfg.human_readable) flags |= VERBOSE; + list_head_init(&log_pages); + if (cfg.csi < 0) { nvme_root_t nvme_root; uint64_t cap_value; @@ -593,26 +593,29 @@ static int get_effects_log(int argc, char **argv, struct command *cmd, struct pl nvme_command_set_supported = (cap_value & (1UL << 37)) != 0; other_command_sets_supported = (cap_value & (1UL << (37+6))) != 0; + if (nvme_command_set_supported) { - if (collect_effects_log(fd, NVME_CSI_NVM, &nodes[idx], flags) == 0) - idx++; + collect_effects_log(fd, NVME_CSI_NVM, &log_pages, flags); } if (other_command_sets_supported) { - collect_effects_log(fd, NVME_CSI_ZNS, &nodes[idx], flags); + collect_effects_log(fd, NVME_CSI_ZNS, &log_pages, flags); } - nvme_print_effects_log_pages(nodes, flags); + nvme_print_effects_log_pages(&log_pages, flags); + } else { - collect_effects_log(fd, cfg.csi, &nodes[0], flags); - nvme_print_effects_log_pages(nodes, flags); + collect_effects_log(fd, cfg.csi, &log_pages, flags); + nvme_print_effects_log_pages(&log_pages, flags); } - for (idx = 0; nodes[idx]; idx++) - free(nodes[idx]); close_fd: + while ((node = list_pop(&log_pages, nvme_effects_log_node_t, node))) { + free(node); + } + close(fd); ret: return nvme_status_to_errno(err, false); -- 2.50.1