From 8b1b0460dc6ec3355b601be924dd0e788de8c667 Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Mon, 27 Jan 2025 23:22:35 +0900 Subject: [PATCH] nvme: add NVMe 2.1 changed-alloc-ns-list-log command The command functions combined with the changed-ns-list-log command. The output almost same but different as lists attached or allocated NSs. Signed-off-by: Tokunori Ikegami --- nvme-builtin.h | 3 ++- nvme-print-binary.c | 3 +-- nvme-print-json.c | 8 +++++--- nvme-print-stdout.c | 3 +-- nvme-print.c | 7 +++---- nvme-print.h | 6 +++--- nvme-wrap.c | 6 ++++++ nvme-wrap.h | 2 ++ nvme.c | 37 +++++++++++++++++++++++++++++-------- 9 files changed, 52 insertions(+), 23 deletions(-) diff --git a/nvme-builtin.h b/nvme-builtin.h index 0134e602..486b1e5a 100644 --- a/nvme-builtin.h +++ b/nvme-builtin.h @@ -36,7 +36,7 @@ COMMAND_LIST( ENTRY("get-log", "Generic NVMe get log, returns log in raw format", get_log) ENTRY("telemetry-log", "Retrieve FW Telemetry log write to file", get_telemetry_log) ENTRY("fw-log", "Retrieve FW Log, show it", get_fw_log) - ENTRY("changed-ns-list-log", "Retrieve Changed Namespace List, show it", get_changed_ns_list_log) + ENTRY("changed-ns-list-log", "Retrieve Changed Attached Namespace List, show it", get_changed_attach_ns_list_log) ENTRY("smart-log", "Retrieve SMART Log, show it", get_smart_log) ENTRY("ana-log", "Retrieve ANA Log, show it", get_ana_log) ENTRY("error-log", "Retrieve Error Log, show it", get_error_log) @@ -60,6 +60,7 @@ COMMAND_LIST( ENTRY("supported-cap-config-log", "Retrieve the list of Supported Capacity Configuration Descriptors", get_supp_cap_config_log) ENTRY("mgmt-addr-list-log", "Retrieve Management Address List Log, show it", get_mgmt_addr_list_log) ENTRY("rotational-media-info-log", "Retrieve Rotational Media Information Log, show it", get_rotational_media_info_log) + ENTRY("changed-alloc-ns-list-log", "Retrieve Changed Allocated Namespace List, show it", get_changed_alloc_ns_list_log) ENTRY("set-feature", "Set a feature and show the resulting value", set_feature) ENTRY("set-property", "Set a property and show the resulting value", set_property) ENTRY("get-property", "Get a property and show the resulting value", get_property) diff --git a/nvme-print-binary.c b/nvme-print-binary.c index 5d29beab..2c5135a7 100644 --- a/nvme-print-binary.c +++ b/nvme-print-binary.c @@ -233,8 +233,7 @@ static void binary_fw_log(struct nvme_firmware_slot *fw_log, d_raw((unsigned char *)fw_log, sizeof(*fw_log)); } -static void binary_changed_ns_list_log(struct nvme_ns_list *log, - const char *devname) +static void binary_changed_ns_list_log(struct nvme_ns_list *log, const char *devname, bool alloc) { d_raw((unsigned char *)log, sizeof(*log)); } diff --git a/nvme-print-json.c b/nvme-print-json.c index 03833f7f..ee4338aa 100644 --- a/nvme-print-json.c +++ b/nvme-print-json.c @@ -583,8 +583,7 @@ void json_fw_log(struct nvme_firmware_slot *fw_log, const char *devname) json_print(r); } -void json_changed_ns_list_log(struct nvme_ns_list *log, - const char *devname) +void json_changed_ns_list_log(struct nvme_ns_list *log, const char *devname, bool alloc) { struct json_object *r = json_create_object(); struct json_object *nsi = json_create_object(); @@ -593,10 +592,13 @@ void json_changed_ns_list_log(struct nvme_ns_list *log, __u32 nsid; int i; + _cleanup_free_ char *k = NULL; + if (log->ns[0] == cpu_to_le32(0xffffffff)) return; - obj_add_str(r, "Changed Namespace List Log", devname); + if (asprintf(&k, "Changed %s Namespace List Log", alloc ? "Allocated" : "Attached") > 0) + obj_add_str(r, k, devname); for (i = 0; i < NVME_ID_NS_LIST_MAX; i++) { nsid = le32_to_cpu(log->ns[i]); diff --git a/nvme-print-stdout.c b/nvme-print-stdout.c index 1b47921f..cc4d1fcd 100644 --- a/nvme-print-stdout.c +++ b/nvme-print-stdout.c @@ -4034,8 +4034,7 @@ static void stdout_fw_log(struct nvme_firmware_slot *fw_log, } } -static void stdout_changed_ns_list_log(struct nvme_ns_list *log, - const char *devname) +static void stdout_changed_ns_list_log(struct nvme_ns_list *log, const char *devname, bool alloc) { __u32 nsid; int i; diff --git a/nvme-print.c b/nvme-print.c index 98aaa566..bb41543b 100644 --- a/nvme-print.c +++ b/nvme-print.c @@ -740,11 +740,10 @@ void nvme_show_fw_log(struct nvme_firmware_slot *fw_log, nvme_print(fw_log, flags, fw_log, devname); } -void nvme_show_changed_ns_list_log(struct nvme_ns_list *log, - const char *devname, - nvme_print_flags_t flags) +void nvme_show_changed_ns_list_log(struct nvme_ns_list *log, const char *devname, + nvme_print_flags_t flags, bool alloc) { - nvme_print(ns_list_log, flags, log, devname); + nvme_print(ns_list_log, flags, log, devname, alloc); } void nvme_print_effects_log_pages(struct list_head *list, diff --git a/nvme-print.h b/nvme-print.h index 4aeba5fc..55616279 100644 --- a/nvme-print.h +++ b/nvme-print.h @@ -58,7 +58,7 @@ struct print_ops { void (*media_unit_stat_log)(struct nvme_media_unit_stat_log *mus); void (*mi_cmd_support_effects_log)(struct nvme_mi_cmd_supported_effects_log *mi_cmd_log, const char *devname); void (*ns_list)(struct nvme_ns_list *ns_list); - void (*ns_list_log)(struct nvme_ns_list *log, const char *devname); + void (*ns_list_log)(struct nvme_ns_list *log, const char *devname, bool alloc); void (*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); void (*persistent_event_log)(void *pevent_log_info, __u8 action, __u32 size, const char *devname); void (*predictable_latency_event_agg_log)(struct nvme_aggregate_predictable_lat_event *pea_log, __u64 log_entries, __u32 size, const char *devname); @@ -174,8 +174,8 @@ void nvme_show_fw_log(struct nvme_firmware_slot *fw_log, const char *devname, nvme_print_flags_t flags); void nvme_print_effects_log_pages(struct list_head *list, nvme_print_flags_t flags); -void nvme_show_changed_ns_list_log(struct nvme_ns_list *log, - const char *devname, nvme_print_flags_t flags); +void nvme_show_changed_ns_list_log(struct nvme_ns_list *log, const char *devname, + nvme_print_flags_t flags, bool alloc); void nvme_show_endurance_log(struct nvme_endurance_group_log *endurance_log, __u16 group_id, const char *devname, nvme_print_flags_t flags); void nvme_show_sanitize_log(struct nvme_sanitize_log_page *sanitize, diff --git a/nvme-wrap.c b/nvme-wrap.c index bcec2d19..0b1039a6 100644 --- a/nvme-wrap.c +++ b/nvme-wrap.c @@ -214,6 +214,12 @@ int nvme_cli_get_log_changed_ns_list(struct nvme_dev *dev, bool rae, return do_admin_op(get_log_changed_ns_list, dev, rae, ns_log); } +int nvme_cli_get_log_changed_alloc_ns_list(struct nvme_dev *dev, bool rae, __u32 len, + struct nvme_ns_list *ns_log) +{ + return do_admin_op(get_log_changed_alloc_ns_list, dev, rae, len, ns_log); +} + int nvme_cli_get_log_cmd_effects(struct nvme_dev *dev, enum nvme_csi csi, struct nvme_cmd_effects_log *effects_log) { diff --git a/nvme-wrap.h b/nvme-wrap.h index 19a5e359..bde7d720 100644 --- a/nvme-wrap.h +++ b/nvme-wrap.h @@ -72,6 +72,8 @@ int nvme_cli_get_log_fw_slot(struct nvme_dev *dev, bool rae, struct nvme_firmware_slot *fw_log); int nvme_cli_get_log_changed_ns_list(struct nvme_dev *dev, bool rae, struct nvme_ns_list *ns_log); +int nvme_cli_get_log_changed_alloc_ns_list(struct nvme_dev *dev, bool rae, __u32 len, + struct nvme_ns_list *ns_log); int nvme_cli_get_log_cmd_effects(struct nvme_dev *dev, enum nvme_csi csi, struct nvme_cmd_effects_log *effects_log); int nvme_cli_get_log_device_self_test(struct nvme_dev *dev, diff --git a/nvme.c b/nvme.c index 44a44317..06deeaeb 100644 --- a/nvme.c +++ b/nvme.c @@ -1354,10 +1354,9 @@ static int get_fw_log(int argc, char **argv, struct command *cmd, struct plugin return err; } -static int get_changed_ns_list_log(int argc, char **argv, struct command *cmd, struct plugin *plugin) +static int get_changed_ns_list_log(int argc, char **argv, bool alloc) { - const char *desc = "Retrieve Changed Namespaces log for the given device " - "in either decoded format (default) or binary."; + _cleanup_free_ char *desc = NULL; _cleanup_free_ struct nvme_ns_list *changed_ns_list_log = NULL; _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; @@ -1375,6 +1374,11 @@ static int get_changed_ns_list_log(int argc, char **argv, struct command *cmd, s NVME_ARGS(opts, OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw_output)); + if (asprintf(&desc, "Retrieve Changed %s Namespaces log for the given device %s", + alloc ? "Allocated" : "Attached", + "in either decoded format (default) or binary.") < 0) + desc = NULL; + err = parse_and_open(&dev, argc, argv, desc, opts); if (err) return err; @@ -1392,19 +1396,36 @@ static int get_changed_ns_list_log(int argc, char **argv, struct command *cmd, s if (!changed_ns_list_log) return -ENOMEM; - err = nvme_cli_get_log_changed_ns_list(dev, true, - changed_ns_list_log); + if (alloc) + err = nvme_cli_get_log_changed_alloc_ns_list(dev, true, + sizeof(*changed_ns_list_log), + changed_ns_list_log); + else + err = nvme_cli_get_log_changed_ns_list(dev, true, + changed_ns_list_log); if (!err) - nvme_show_changed_ns_list_log(changed_ns_list_log, - dev->name, flags); + nvme_show_changed_ns_list_log(changed_ns_list_log, dev->name, flags, alloc); else if (err > 0) nvme_show_status(err); else - nvme_show_error("changed ns list log: %s", nvme_strerror(errno)); + nvme_show_error("changed %s ns list log: %s", alloc ? "allocated" : "attached", + nvme_strerror(errno)); return err; } +static int get_changed_attach_ns_list_log(int argc, char **argv, struct command *cmd, + struct plugin *plugin) +{ + return get_changed_ns_list_log(argc, argv, false); +} + +static int get_changed_alloc_ns_list_log(int argc, char **argv, struct command *cmd, + struct plugin *plugin) +{ + return get_changed_ns_list_log(argc, argv, true); +} + static int get_pred_lat_per_nvmset_log(int argc, char **argv, struct command *cmd, struct plugin *plugin) { -- 2.50.1