]> www.infradead.org Git - users/sagi/nvme-cli.git/commitdiff
nvme-print: Use array array instead of ccan/list
authorDaniel Wagner <dwagner@suse.de>
Thu, 7 Oct 2021 07:06:28 +0000 (09:06 +0200)
committerDaniel Wagner <dwagner@suse.de>
Thu, 7 Oct 2021 07:15:12 +0000 (09:15 +0200)
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 <dwagner@suse.de>
Makefile
nvme-print.c
nvme-print.h
nvme.c

index 2e43862f6fc9e9ab509af8bef79b4fd80fce8339..5fbdfd0bf697e37fabfb7f4bdf3923e754d121f5 100644 (file)
--- 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`
 
index 4fdcecbee5586e36d7fe8f2bfbfc3cc59859a7a3..6c330d89a441bbb1b19ca713fd66cf9e195c5d36 100644 (file)
@@ -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++;
        }
 }
 
index aa153e0fbaf946230dae27e41ca9f1b66bcb9fb5..7bc8a84dd3b3812fa66fd3747016514f43a5bb22 100644 (file)
@@ -4,12 +4,9 @@
 #include "nvme.h"
 #include <inttypes.h>
 
-#include <ccan/list/list.h>
-
 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 04574269370c2955b79abf67e8d1ea1bb5cd8ad2..662631967ebea43633e2fd0b3e2ebf942eb26294 100644 (file)
--- 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);