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);
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++;
}
}
#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);
__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,
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)
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;
if (cfg.human_readable)
flags |= VERBOSE;
- list_head_init(&log_pages);
-
if (cfg.csi < 0) {
nvme_root_t nvme_root;
uint64_t cap_value;
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);