summaryrefslogtreecommitdiffstats
path: root/nvme-print-json.c
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2023-06-30 22:38:51 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2023-06-30 22:38:51 +0000
commit5d64e8a26388e2abbf6a6585d17392d6e944ae7b (patch)
tree4eae47918df5f83f14e05bede9c361237a7dc089 /nvme-print-json.c
parentReleasing debian version 2.4+really2.4-3. (diff)
downloadnvme-cli-5d64e8a26388e2abbf6a6585d17392d6e944ae7b.tar.xz
nvme-cli-5d64e8a26388e2abbf6a6585d17392d6e944ae7b.zip
Merging upstream version 2.5.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'nvme-print-json.c')
-rw-r--r--nvme-print-json.c319
1 files changed, 225 insertions, 94 deletions
diff --git a/nvme-print-json.c b/nvme-print-json.c
index eb7e484..923b28e 100644
--- a/nvme-print-json.c
+++ b/nvme-print-json.c
@@ -3,15 +3,19 @@
#include <assert.h>
#include <errno.h>
-#include "nvme-print-json.h"
+#include "nvme-print.h"
#include "util/json.h"
#include "nvme.h"
#include "common.h"
+#define ERROR_MSG_LEN 100
+
static const uint8_t zero_uuid[16] = { 0 };
+static struct print_ops json_print_ops;
-void json_nvme_id_ns(struct nvme_id_ns *ns, bool cap_only)
+static void json_nvme_id_ns(struct nvme_id_ns *ns, unsigned int nsid,
+ unsigned int lba_index, bool cap_only)
{
char nguid_buf[2 * sizeof(ns->nguid) + 1],
eui64_buf[2 * sizeof(ns->eui64) + 1];
@@ -259,7 +263,8 @@ void json_nvme_id_ns(struct nvme_id_ns *ns, bool cap_only)
json_free_object(root);
}
-void json_error_log(struct nvme_error_log_page *err_log, int entries)
+static void json_error_log(struct nvme_error_log_page *err_log, int entries,
+ const char *devname)
{
struct json_object *root;
struct json_object *errors;
@@ -446,8 +451,8 @@ void json_changed_ns_list_log(struct nvme_ns_list *log,
json_free_object(root);
}
-void json_endurance_log(struct nvme_endurance_group_log *endurance_group,
- __u16 group_id)
+static void json_endurance_log(struct nvme_endurance_group_log *endurance_group,
+ __u16 group_id, const char *devname)
{
struct json_object *root;
@@ -497,10 +502,10 @@ void json_endurance_log(struct nvme_endurance_group_log *endurance_group,
json_free_object(root);
}
-void json_smart_log(struct nvme_smart_log *smart, unsigned int nsid,
- enum nvme_print_flags flags)
+static void json_smart_log(struct nvme_smart_log *smart, unsigned int nsid,
+ const char *devname)
{
- int c, human = flags & VERBOSE;
+ int c, human = json_print_ops.flags & VERBOSE;
struct json_object *root;
char key[21];
@@ -585,7 +590,8 @@ void json_smart_log(struct nvme_smart_log *smart, unsigned int nsid,
json_free_object(root);
}
-void json_ana_log(struct nvme_ana_log *ana_log, const char *devname)
+static void json_ana_log(struct nvme_ana_log *ana_log, const char *devname,
+ size_t len)
{
int offset = sizeof(struct nvme_ana_log);
struct nvme_ana_log *hdr = ana_log;
@@ -643,7 +649,8 @@ void json_ana_log(struct nvme_ana_log *ana_log, const char *devname)
json_free_object(root);
}
-void json_self_test_log(struct nvme_self_test_log *self_test, __u8 dst_entries)
+static void json_self_test_log(struct nvme_self_test_log *self_test, __u8 dst_entries,
+ __u32 size, const char *devname)
{
struct json_object *valid_attrs;
struct json_object *root;
@@ -737,7 +744,7 @@ struct json_object* json_effects_log(enum nvme_csi csi,
return root;
}
-void json_effects_log_list(struct list_head *list)
+static void json_effects_log_list(struct list_head *list)
{
struct json_object *json_list;
nvme_effects_log_node_t *node;
@@ -755,7 +762,7 @@ void json_effects_log_list(struct list_head *list)
json_free_object(json_list);
}
-void json_sanitize_log(struct nvme_sanitize_log_page *sanitize_log,
+static void json_sanitize_log(struct nvme_sanitize_log_page *sanitize_log,
const char *devname)
{
struct json_object *root;
@@ -777,7 +784,7 @@ void json_sanitize_log(struct nvme_sanitize_log_page *sanitize_log,
(status >> NVME_SANITIZE_SSTAT_COMPLETED_PASSES_SHIFT) &
NVME_SANITIZE_SSTAT_COMPLETED_PASSES_MASK);
- status_str = get_sanitize_log_sstat_status_str(status);
+ status_str = nvme_sstat_status_to_string(status);
sprintf(str, "(%d) %s", status & NVME_SANITIZE_SSTAT_STATUS_MASK,
status_str);
json_object_add_value_string(sstat, "status", str);
@@ -805,9 +812,9 @@ void json_sanitize_log(struct nvme_sanitize_log_page *sanitize_log,
json_free_object(root);
}
-void json_predictable_latency_per_nvmset(
- struct nvme_nvmset_predictable_lat_log *plpns_log,
- __u16 nvmset_id)
+static void json_predictable_latency_per_nvmset(
+ struct nvme_nvmset_predictable_lat_log *plpns_log,
+ __u16 nvmset_id, const char *devname)
{
struct json_object *root;
@@ -840,9 +847,9 @@ void json_predictable_latency_per_nvmset(
json_free_object(root);
}
-void json_predictable_latency_event_agg_log(
- struct nvme_aggregate_predictable_lat_event *pea_log,
- __u64 log_entries)
+static void json_predictable_latency_event_agg_log(
+ struct nvme_aggregate_predictable_lat_event *pea_log,
+ __u64 log_entries, __u32 size, const char *devname)
{
struct json_object *root;
struct json_object *valid_attrs;
@@ -869,30 +876,26 @@ void json_predictable_latency_event_agg_log(
json_free_object(root);
}
-void add_bitmap(int i, __u8 seb, struct json_object *root, int json_flag)
+static void json_add_bitmap(int i, __u8 seb, struct json_object *root)
{
char evt_str[50];
char key[128];
for (int bit = 0; bit < 8; bit++) {
if (nvme_pel_event_to_string(bit + i * 8)) {
- if (json_flag == 1) {
- sprintf(key, "bitmap_%x", (bit + i * 8));
- if ((seb >> bit) & 0x1)
- snprintf(evt_str, sizeof(evt_str), "Support %s",
- nvme_pel_event_to_string(bit + i * 8));
- json_object_add_value_string(root, key, evt_str);
- } else {
- if (nvme_pel_event_to_string(bit + i * 8))
- if ((seb >> bit) & 0x1)
- printf(" Support %s\n",
- nvme_pel_event_to_string(bit + i * 8));
- }
+ sprintf(key, "bitmap_%x", (bit + i * 8));
+ if ((seb >> bit) & 0x1)
+ snprintf(evt_str, sizeof(evt_str), "Support %s",
+ nvme_pel_event_to_string(bit + i * 8));
+ json_object_add_value_string(root, key, evt_str);
}
}
}
-void json_persistent_event_log(void *pevent_log_info, __u32 size)
+
+static void json_persistent_event_log(void *pevent_log_info, __u8 action,
+ __u32 size, const char *devname)
+
{
struct json_object *root;
struct json_object *valid_attrs;
@@ -963,7 +966,7 @@ void json_persistent_event_log(void *pevent_log_info, __u32 size)
for (int i = 0; i < 32; i++) {
if (pevent_log_head->seb[i] == 0)
continue;
- add_bitmap(i, pevent_log_head->seb[i], root, 1);
+ json_add_bitmap(i, pevent_log_head->seb[i], root);
}
} else {
printf("No log data can be shown with this log len at least " \
@@ -1219,9 +1222,10 @@ void json_persistent_event_log(void *pevent_log_info, __u32 size)
json_free_object(root);
}
-void json_endurance_group_event_agg_log(
- struct nvme_aggregate_predictable_lat_event *endurance_log,
- __u64 log_entries)
+
+static void json_endurance_group_event_agg_log(
+ struct nvme_aggregate_predictable_lat_event *endurance_log,
+ __u64 log_entries, __u32 size, const char *devname)
{
struct json_object *root;
struct json_object *valid_attrs;
@@ -1244,7 +1248,9 @@ void json_endurance_group_event_agg_log(
json_free_object(root);
}
-void json_lba_status_log(void *lba_status)
+
+static void json_lba_status_log(void *lba_status, __u32 size,
+ const char *devname)
{
struct json_object *root;
struct json_object *desc;
@@ -1304,7 +1310,9 @@ void json_lba_status_log(void *lba_status)
json_free_object(root);
}
-void json_resv_notif_log(struct nvme_resv_notification_log *resv)
+
+static void json_resv_notif_log(struct nvme_resv_notification_log *resv,
+ const char *devname)
{
struct json_object *root;
@@ -1323,7 +1331,10 @@ void json_resv_notif_log(struct nvme_resv_notification_log *resv)
json_free_object(root);
}
-void json_fid_support_effects_log(struct nvme_fid_supported_effects_log *fid_log)
+
+static void json_fid_support_effects_log(
+ struct nvme_fid_supported_effects_log *fid_log,
+ const char *devname)
{
struct json_object *root;
struct json_object *fids;
@@ -1350,7 +1361,10 @@ void json_fid_support_effects_log(struct nvme_fid_supported_effects_log *fid_log
json_free_object(root);
}
-void json_mi_cmd_support_effects_log(struct nvme_mi_cmd_supported_effects_log *mi_cmd_log)
+
+static void json_mi_cmd_support_effects_log(
+ struct nvme_mi_cmd_supported_effects_log *mi_cmd_log,
+ const char *devname)
{
struct json_object *root;
struct json_object *mi_cmds;
@@ -1378,7 +1392,9 @@ void json_mi_cmd_support_effects_log(struct nvme_mi_cmd_supported_effects_log *m
json_free_object(root);
}
-void json_boot_part_log(void *bp_log)
+
+static void json_boot_part_log(void *bp_log, const char *devname,
+ __u32 size)
{
struct nvme_boot_partition *hdr;
struct json_object *root;
@@ -1397,8 +1413,9 @@ void json_boot_part_log(void *bp_log)
json_free_object(root);
}
-void json_media_unit_stat_log(struct nvme_media_unit_stat_log *mus)
+static void json_media_unit_stat_log(struct nvme_media_unit_stat_log *mus)
{
+
struct json_object *root;
struct json_object *entries;
struct json_object *entry;
@@ -1431,8 +1448,9 @@ void json_media_unit_stat_log(struct nvme_media_unit_stat_log *mus)
json_free_object(root);
}
-void json_supported_cap_config_log(
- struct nvme_supported_cap_config_list_log *cap_log)
+
+static void json_supported_cap_config_log(
+ struct nvme_supported_cap_config_list_log *cap_log)
{
struct json_object *root;
struct json_object *cap_list;
@@ -1522,7 +1540,8 @@ void json_supported_cap_config_log(
json_free_object(root);
}
-void json_nvme_fdp_configs(struct nvme_fdp_config_log *log, size_t len)
+
+static void json_nvme_fdp_configs(struct nvme_fdp_config_log *log, size_t len)
{
struct json_object *root, *obj_configs;
uint16_t n;
@@ -1573,7 +1592,8 @@ void json_nvme_fdp_configs(struct nvme_fdp_config_log *log, size_t len)
json_free_object(root);
}
-void json_nvme_fdp_usage(struct nvme_fdp_ruhu_log *log, size_t len)
+
+static void json_nvme_fdp_usage(struct nvme_fdp_ruhu_log *log, size_t len)
{
struct json_object *root, *obj_ruhus;
uint16_t nruh;
@@ -1603,7 +1623,8 @@ void json_nvme_fdp_usage(struct nvme_fdp_ruhu_log *log, size_t len)
json_free_object(root);
}
-void json_nvme_fdp_stats(struct nvme_fdp_stats_log *log)
+
+static void json_nvme_fdp_stats(struct nvme_fdp_stats_log *log)
{
struct json_object *root = json_create_object();
@@ -1617,7 +1638,8 @@ void json_nvme_fdp_stats(struct nvme_fdp_stats_log *log)
json_free_object(root);
}
-void json_nvme_fdp_events(struct nvme_fdp_events_log *log)
+
+static void json_nvme_fdp_events(struct nvme_fdp_events_log *log)
{
struct json_object *root, *obj_events;
uint32_t n;
@@ -1661,7 +1683,7 @@ void json_nvme_fdp_events(struct nvme_fdp_events_log *log)
json_free_object(root);
}
-void json_nvme_fdp_ruh_status(struct nvme_fdp_ruh_status *status, size_t len)
+static void json_nvme_fdp_ruh_status(struct nvme_fdp_ruh_status *status, size_t len)
{
struct json_object *root, *obj_ruhss;
uint16_t nruhsd;
@@ -1695,7 +1717,6 @@ void json_nvme_fdp_ruh_status(struct nvme_fdp_ruh_status *status, size_t len)
}
static unsigned int json_print_nvme_subsystem_multipath(nvme_subsystem_t s,
- bool show_ana,
json_object *paths)
{
nvme_ns_t n;
@@ -1719,9 +1740,8 @@ static unsigned int json_print_nvme_subsystem_multipath(nvme_subsystem_t s,
nvme_ctrl_get_address(c));
json_object_add_value_string(path_attrs, "State",
nvme_ctrl_get_state(c));
- if (show_ana)
- json_object_add_value_string(path_attrs, "ANAState",
- nvme_path_get_ana_state(p));
+ json_object_add_value_string(path_attrs, "ANAState",
+ nvme_path_get_ana_state(p));
json_array_add_value_object(paths, path_attrs);
i++;
}
@@ -1750,7 +1770,8 @@ static void json_print_nvme_subsystem_ctrls(nvme_subsystem_t s,
}
}
-void json_print_nvme_subsystem_list(nvme_root_t r, bool show_ana)
+static void json_print_nvme_subsystem_list(nvme_root_t r, bool show_ana)
+
{
struct json_object *host_attrs, *subsystem_attrs;
struct json_object *subsystems, *paths;
@@ -1780,7 +1801,7 @@ void json_print_nvme_subsystem_list(nvme_root_t r, bool show_ana)
json_array_add_value_object(subsystems, subsystem_attrs);
paths = json_create_array();
- if (!json_print_nvme_subsystem_multipath(s, show_ana, paths))
+ if (!show_ana || !json_print_nvme_subsystem_multipath(s, paths))
json_print_nvme_subsystem_ctrls(s, paths);
json_object_add_value_array(subsystem_attrs, "Paths",
@@ -1794,7 +1815,7 @@ void json_print_nvme_subsystem_list(nvme_root_t r, bool show_ana)
json_free_object(root);
}
-void json_ctrl_registers(void *bar)
+static void json_ctrl_registers(void *bar, bool fabrics)
{
uint64_t cap, asq, acq, bpmbl, cmbmsc;
uint32_t vs, intms, intmc, cc, csts, nssr, crto, aqa, cmbsz, cmbloc,
@@ -1881,8 +1902,9 @@ static void d_json(unsigned char *buf, int len, int width, int group,
}
}
-void json_nvme_cmd_set_independent_id_ns(
- struct nvme_id_independent_id_ns *ns)
+static void json_nvme_cmd_set_independent_id_ns(
+ struct nvme_id_independent_id_ns *ns,
+ unsigned int nsid)
{
struct json_object *root;
root = json_create_object();
@@ -1902,7 +1924,7 @@ void json_nvme_cmd_set_independent_id_ns(
json_free_object(root);
}
-void json_nvme_id_ns_descs(void *data)
+static void json_nvme_id_ns_descs(void *data, unsigned int nsid)
{
/* large enough to hold uuid str (37) or nguid str (32) + zero byte */
char json_str[40];
@@ -1998,7 +2020,7 @@ void json_nvme_id_ns_descs(void *data)
json_free_object(root);
}
-void json_nvme_id_ctrl_nvm(struct nvme_id_ctrl_nvm *ctrl_nvm)
+static void json_nvme_id_ctrl_nvm(struct nvme_id_ctrl_nvm *ctrl_nvm)
{
struct json_object *root;
@@ -2015,8 +2037,10 @@ void json_nvme_id_ctrl_nvm(struct nvme_id_ctrl_nvm *ctrl_nvm)
json_free_object(root);
}
-void json_nvme_nvm_id_ns(struct nvme_nvm_id_ns *nvm_ns,
- struct nvme_id_ns *ns, bool cap_only)
+static void json_nvme_nvm_id_ns(struct nvme_nvm_id_ns *nvm_ns,
+ unsigned int nsid, struct nvme_id_ns *ns,
+ unsigned int lba_index, bool cap_only)
+
{
struct json_object *root;
struct json_object *elbafs;
@@ -2047,7 +2071,7 @@ void json_nvme_nvm_id_ns(struct nvme_nvm_id_ns *nvm_ns,
json_free_object(root);
}
-void json_nvme_zns_id_ctrl(struct nvme_zns_id_ctrl *ctrl)
+static void json_nvme_zns_id_ctrl(struct nvme_zns_id_ctrl *ctrl)
{
struct json_object *root;
@@ -2059,8 +2083,8 @@ void json_nvme_zns_id_ctrl(struct nvme_zns_id_ctrl *ctrl)
json_free_object(root);
}
-void json_nvme_zns_id_ns(struct nvme_zns_id_ns *ns,
- struct nvme_id_ns *id_ns)
+static void json_nvme_zns_id_ns(struct nvme_zns_id_ns *ns,
+ struct nvme_id_ns *id_ns)
{
struct json_object *root;
struct json_object *lbafs;
@@ -2101,7 +2125,7 @@ void json_nvme_zns_id_ns(struct nvme_zns_id_ns *ns,
json_free_object(root);
}
-void json_nvme_list_ns(struct nvme_ns_list *ns_list)
+static void json_nvme_list_ns(struct nvme_ns_list *ns_list)
{
struct json_object *root;
struct json_object *valid_attrs;
@@ -2125,8 +2149,8 @@ void json_nvme_list_ns(struct nvme_ns_list *ns_list)
json_free_object(root);
}
-void json_nvme_finish_zone_list(__u64 nr_zones,
- struct json_object *zone_list)
+static void json_zns_finish_zone_list(__u64 nr_zones,
+ struct json_object *zone_list)
{
struct json_object *root = json_create_object();
json_object_add_value_uint(root, "nr_zones", nr_zones);
@@ -2136,9 +2160,9 @@ void json_nvme_finish_zone_list(__u64 nr_zones,
json_free_object(root);
}
-void json_nvme_zns_report_zones(void *report, __u32 descs,
- __u8 ext_size, __u32 report_size,
- struct json_object *zone_list)
+static void json_nvme_zns_report_zones(void *report, __u32 descs,
+ __u8 ext_size, __u32 report_size,
+ struct json_object *zone_list)
{
struct json_object *zone;
struct json_object *ext_data;
@@ -2158,9 +2182,9 @@ void json_nvme_zns_report_zones(void *report, __u32 descs,
json_object_add_value_uint64(zone, "cap",
le64_to_cpu(desc->zcap));
json_object_add_value_string(zone, "state",
- zone_state_to_string(desc->zs >> 4));
+ nvme_zone_state_to_string(desc->zs >> 4));
json_object_add_value_string(zone, "type",
- zone_type_to_string(desc->zt));
+ nvme_zone_type_to_string(desc->zt));
json_object_add_value_uint(zone, "attrs", desc->za);
json_object_add_value_uint(zone, "attrs_info", desc->zai);
@@ -2180,8 +2204,9 @@ void json_nvme_zns_report_zones(void *report, __u32 descs,
}
}
-void json_nvme_list_ctrl(struct nvme_ctrl_list *ctrl_list, __u16 num)
+static void json_nvme_list_ctrl(struct nvme_ctrl_list *ctrl_list)
{
+ __u16 num = le16_to_cpu(ctrl_list->num);
struct json_object *root;
struct json_object *valid_attrs;
struct json_object *valid;
@@ -2207,7 +2232,8 @@ void json_nvme_list_ctrl(struct nvme_ctrl_list *ctrl_list, __u16 num)
json_free_object(root);
}
-void json_nvme_id_nvmset(struct nvme_id_nvmset_list *nvmset)
+static void json_nvme_id_nvmset(struct nvme_id_nvmset_list *nvmset,
+ unsigned int nvmeset_id)
{
__u32 nent = nvmset->nid;
struct json_object *entries;
@@ -2243,7 +2269,7 @@ void json_nvme_id_nvmset(struct nvme_id_nvmset_list *nvmset)
json_free_object(root);
}
-void json_nvme_primary_ctrl_cap(const struct nvme_primary_ctrl_cap *caps)
+static void json_nvme_primary_ctrl_cap(const struct nvme_primary_ctrl_cap *caps)
{
struct json_object *root;
@@ -2272,7 +2298,7 @@ void json_nvme_primary_ctrl_cap(const struct nvme_primary_ctrl_cap *caps)
json_free_object(root);
}
-void json_nvme_list_secondary_ctrl(const struct nvme_secondary_ctrl_list *sc_list,
+static void json_nvme_list_secondary_ctrl(const struct nvme_secondary_ctrl_list *sc_list,
__u32 count)
{
const struct nvme_secondary_ctrl *sc_entry = &sc_list->sc_entry[0];
@@ -2313,8 +2339,8 @@ void json_nvme_list_secondary_ctrl(const struct nvme_secondary_ctrl_list *sc_lis
json_free_object(root);
}
-void json_nvme_id_ns_granularity_list(
- const struct nvme_id_ns_granularity_list *glist)
+static void json_nvme_id_ns_granularity_list(
+ const struct nvme_id_ns_granularity_list *glist)
{
int i;
struct json_object *root;
@@ -2344,7 +2370,7 @@ void json_nvme_id_ns_granularity_list(
json_free_object(root);
}
-void json_nvme_id_uuid_list(const struct nvme_id_uuid_list *uuid_list)
+static void json_nvme_id_uuid_list(const struct nvme_id_uuid_list *uuid_list)
{
struct json_object *root;
struct json_object *entries;
@@ -2373,7 +2399,7 @@ void json_nvme_id_uuid_list(const struct nvme_id_uuid_list *uuid_list)
json_free_object(root);
}
-void json_id_domain_list(struct nvme_id_domain_list *id_dom)
+static void json_id_domain_list(struct nvme_id_domain_list *id_dom)
{
struct json_object *root;
struct json_object *entries;
@@ -2406,7 +2432,7 @@ void json_id_domain_list(struct nvme_id_domain_list *id_dom)
json_free_object(root);
}
-void json_nvme_endurance_group_list(struct nvme_id_endurance_group_list *endgrp_list)
+static void json_nvme_endurance_group_list(struct nvme_id_endurance_group_list *endgrp_list)
{
struct json_object *root;
struct json_object *valid_attrs;
@@ -2432,7 +2458,8 @@ void json_nvme_endurance_group_list(struct nvme_id_endurance_group_list *endgrp_
json_free_object(root);
}
-void json_support_log(struct nvme_supported_log_pages *support_log)
+static void json_support_log(struct nvme_supported_log_pages *support_log,
+ const char *devname)
{
struct json_object *root;
struct json_object *valid;
@@ -2500,6 +2527,7 @@ static void json_detail_list(nvme_root_t r)
json_object_add_value_string(jctrl, "Firmware", nvme_ctrl_get_firmware(c));
json_object_add_value_string(jctrl, "Transport", nvme_ctrl_get_transport(c));
json_object_add_value_string(jctrl, "Address", nvme_ctrl_get_address(c));
+ json_object_add_value_string(jctrl, "Slot", nvme_ctrl_get_phy_slot(c));
nvme_ctrl_for_each_ns(c, n) {
struct json_object *jns = json_create_object();
@@ -2619,10 +2647,9 @@ static void json_simple_list(nvme_root_t r)
json_free_object(jroot);
}
-void json_print_list_items(nvme_root_t r,
- enum nvme_print_flags flags)
+static void json_print_list_items(nvme_root_t r)
{
- if (flags & VERBOSE)
+ if (json_print_ops.flags & VERBOSE)
json_detail_list(r);
else
json_simple_list(r);
@@ -2670,8 +2697,8 @@ static unsigned int json_subsystem_topology_multipath(nvme_subsystem_t s,
return i;
}
-void json_print_nvme_subsystem_topology(nvme_subsystem_t s,
- json_object *namespaces)
+static void json_print_nvme_subsystem_topology(nvme_subsystem_t s,
+ json_object *namespaces)
{
nvme_ctrl_t c;
nvme_ns_t n;
@@ -2704,7 +2731,7 @@ void json_print_nvme_subsystem_topology(nvme_subsystem_t s,
}
}
-void json_simple_topology(nvme_root_t r)
+static void json_simple_topology(nvme_root_t r)
{
struct json_object *host_attrs, *subsystem_attrs;
struct json_object *subsystems, *namespaces;
@@ -2748,8 +2775,7 @@ void json_simple_topology(nvme_root_t r)
json_free_object(root);
}
-/* fabrics.c */
-void json_discovery_log(struct nvmf_discovery_log *log, int numrec)
+static void json_discovery_log(struct nvmf_discovery_log *log, int numrec)
{
struct json_object *root;
struct json_object *entries;
@@ -2803,7 +2829,7 @@ void json_discovery_log(struct nvmf_discovery_log *log, int numrec)
json_free_object(root);
}
-void json_connect_msg(nvme_ctrl_t c)
+static void json_connect_msg(nvme_ctrl_t c)
{
struct json_object *root;
@@ -2822,7 +2848,7 @@ static void json_output_object(struct json_object *root)
json_free_object(root);
}
-void json_output_status(int status)
+static void json_output_status(int status)
{
struct json_object *root = json_create_object();
int val;
@@ -2854,3 +2880,108 @@ void json_output_status(int status)
json_output_object(root);
}
+
+static void json_output_message(bool error, const char *msg, va_list ap)
+{
+ struct json_object *root = json_create_object();
+ char *value;
+ const char *key = error ? "error" : "result";
+
+ if (vasprintf(&value, msg, ap) < 0)
+ value = NULL;
+
+ if (value)
+ json_object_add_value_string(root, key, value);
+ else
+ json_object_add_value_string(root, key, "Could not allocate string");
+
+ json_output_object(root);
+
+ free(value);
+}
+
+static void json_output_perror(const char *msg)
+{
+ struct json_object *root = json_create_object();
+ char *error;
+
+ if (asprintf(&error, "%s: %s", msg, strerror(errno)) < 0)
+ error = NULL;
+
+ if (error)
+ json_object_add_value_string(root, "error", error);
+ else
+ json_object_add_value_string(root, "error", "Could not allocate string");
+
+ json_output_object(root);
+
+ free(error);
+}
+
+static struct print_ops json_print_ops = {
+ .ana_log = json_ana_log,
+ .boot_part_log = json_boot_part_log,
+ .ctrl_list = json_nvme_list_ctrl,
+ .ctrl_registers = json_ctrl_registers,
+ .discovery_log = json_discovery_log,
+ .effects_log_list = json_effects_log_list,
+ .endurance_group_event_agg_log = json_endurance_group_event_agg_log,
+ .endurance_group_list = json_nvme_endurance_group_list,
+ .endurance_log = json_endurance_log,
+ .error_log = json_error_log,
+ .fdp_config_log = json_nvme_fdp_configs,
+ .fdp_event_log = json_nvme_fdp_events,
+ .fdp_ruh_status = json_nvme_fdp_ruh_status,
+ .fdp_stats_log = json_nvme_fdp_stats,
+ .fdp_usage_log = json_nvme_fdp_usage,
+ .fid_supported_effects_log = json_fid_support_effects_log,
+ .fw_log = json_fw_log,
+ .id_ctrl = json_nvme_id_ctrl,
+ .ns_list = json_nvme_list_ns,
+ .nvm_id_ns = json_nvme_nvm_id_ns,
+ .id_ctrl_nvm = json_nvme_id_ctrl_nvm,
+ .id_domain_list = json_id_domain_list,
+ .id_independent_id_ns = json_nvme_cmd_set_independent_id_ns,
+ .id_ns = json_nvme_id_ns,
+ .id_ns_descs = json_nvme_id_ns_descs,
+ .id_ns_granularity_list = json_nvme_id_ns_granularity_list,
+ .id_nvmset_list = json_nvme_id_nvmset,
+ .id_uuid_list = json_nvme_id_uuid_list,
+ .lba_status_log = json_lba_status_log,
+ .media_unit_stat_log = json_media_unit_stat_log,
+ .mi_cmd_support_effects_log = json_mi_cmd_support_effects_log,
+ .ns_list_log = json_changed_ns_list_log,
+ .persistent_event_log = json_persistent_event_log,
+ .predictable_latency_event_agg_log = json_predictable_latency_event_agg_log,
+ .predictable_latency_per_nvmset = json_predictable_latency_per_nvmset,
+ .primary_ctrl_cap = json_nvme_primary_ctrl_cap,
+ .resv_notification_log = json_resv_notif_log,
+ .resv_report = json_nvme_resv_report,
+ .sanitize_log_page = json_sanitize_log,
+ .secondary_ctrl_list = json_nvme_list_secondary_ctrl,
+ .self_test_log = json_self_test_log,
+ .smart_log = json_smart_log,
+ .supported_cap_config_list_log = json_supported_cap_config_log,
+ .supported_log_pages = json_support_log,
+ .zns_changed_zone_log = NULL,
+ .zns_report_zones = json_nvme_zns_report_zones,
+ .zns_finish_zone_list = json_zns_finish_zone_list,
+ .zns_id_ctrl = json_nvme_zns_id_ctrl,
+ .zns_id_ns = json_nvme_zns_id_ns,
+
+ .list_items = json_print_list_items,
+ .print_nvme_subsystem_list = json_print_nvme_subsystem_list,
+ .topology_ctrl = json_simple_topology,
+ .topology_namespace = json_simple_topology,
+
+ .connect_msg = json_connect_msg,
+ .show_message = json_output_message,
+ .show_perror = json_output_perror,
+ .show_status = json_output_status,
+};
+
+struct print_ops *nvme_get_json_print_ops(enum nvme_print_flags flags)
+{
+ json_print_ops.flags = flags;
+ return &json_print_ops;
+}