From cf2ab19f1881a8945bb07fa42dbbc018fc55f797 Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Thu, 7 Oct 2021 09:06:28 +0200 Subject: [PATCH] nvme-print: Use array array instead of ccan/list Commit 155fbebfe7b7 ("Update effects-log to handle multiple command sets") added a dependency to libvnme/ccan which conflicts with making the libnvme shared library. We can simply replace the list by an fixed sized array as we know we either have 1 or 2 elements in the list. Signed-off-by: Daniel Wagner --- Makefile | 2 +- nvme-print.c | 19 ++++++++++++------- nvme-print.h | 5 +---- nvme.c | 49 +++++++++++++++++++++++-------------------------- 4 files changed, 37 insertions(+), 38 deletions(-) diff --git a/Makefile b/Makefile index 2e43862f..5fbdfd0b 100644 --- a/Makefile +++ b/Makefile @@ -62,7 +62,7 @@ default: $(NVME) NVME-VERSION-FILE: FORCE @$(SHELL_PATH) ./NVME-VERSION-GEN -include NVME-VERSION-FILE -override CFLAGS += -DNVME_VERSION='"$(NVME_VERSION)"' -I$(LIBNVMEDIR)src/ -I$(LIBNVMEDIR)/ccan +override CFLAGS += -DNVME_VERSION='"$(NVME_VERSION)"' -I$(LIBNVMEDIR)src/ NVME_DPKG_VERSION=1~`lsb_release -sc` diff --git a/nvme-print.c b/nvme-print.c index 4fdcecbe..6c330d89 100644 --- a/nvme-print.c +++ b/nvme-print.c @@ -846,16 +846,18 @@ struct json_object* json_effects_log(enum nvme_csi csi, return root; } -void json_effects_log_list(struct list_head *list) { +void json_effects_log_list(nvme_effects_log_node_t *nodes[]) { struct json_object *json_list; nvme_effects_log_node_t *node; + int idx = 0; json_list = json_create_array(); - - list_for_each(list, node, node) { - json_object *json_page = + + while ((node = nodes[idx])) { + 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); @@ -4813,20 +4815,23 @@ 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(struct list_head *list, +void nvme_print_effects_log_pages(nvme_effects_log_node_t *nodes[], int flags) { + int idx = 0; + if (flags & JSON) - return json_effects_log_list(list); + return json_effects_log_list(nodes); nvme_effects_log_node_t *node; - list_for_each(list, node, node) { + while ((node = nodes[idx])) { 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 aa153e0f..7bc8a84d 100644 --- a/nvme-print.h +++ b/nvme-print.h @@ -4,12 +4,9 @@ #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); @@ -39,7 +36,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(struct list_head *list, int flags); +void nvme_print_effects_log_pages(nvme_effects_log_node_t *nodes[], 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 04574269..66263196 100644 --- a/nvme.c +++ b/nvme.c @@ -492,27 +492,29 @@ ret: return nvme_status_to_errno(err, false); } -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, nvme_effects_log_node_t **node, int flags) { int err; - nvme_effects_log_node_t *node = malloc(sizeof(nvme_effects_log_node_t)); - if (!node) { + nvme_effects_log_node_t *n; + + n = malloc(sizeof(nvme_effects_log_node_t)); + if (!n) { perror("Failed to allocate memory"); - return; + return -1; } - node->csi = csi; + n->csi = csi; - err = nvme_get_log_cmd_effects(fd, csi, &node->effects); + err = nvme_get_log_cmd_effects(fd, csi, &n->effects); if (!err) { - list_add(list, &node->node); - return; - } - else if (err > 0) + *node = n; + return 0; + } else if (err > 0) nvme_show_status(err); else perror("effects log page"); - free(node); + free(n); + return -1; } static int get_effects_log(int argc, char **argv, struct command *cmd, struct plugin *plugin) @@ -521,8 +523,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 = ""; - struct list_head log_pages; - nvme_effects_log_node_t *node; + nvme_effects_log_node_t *nodes[3] = { NULL }; + int idx = 0; void *bar = NULL; @@ -561,8 +563,6 @@ 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; @@ -581,29 +581,26 @@ 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) { - collect_effects_log(fd, NVME_CSI_NVM, &log_pages, flags); + if (collect_effects_log(fd, NVME_CSI_NVM, &nodes[idx], flags) == 0) + idx++; } if (other_command_sets_supported) { - collect_effects_log(fd, NVME_CSI_ZNS, &log_pages, flags); + collect_effects_log(fd, NVME_CSI_ZNS, &nodes[idx], flags); } - nvme_print_effects_log_pages(&log_pages, flags); - + nvme_print_effects_log_pages(nodes, flags); } else { - collect_effects_log(fd, cfg.csi, &log_pages, flags); - nvme_print_effects_log_pages(&log_pages, flags); + collect_effects_log(fd, cfg.csi, &nodes[0], flags); + nvme_print_effects_log_pages(nodes, 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