From: Tokunori Ikegami Date: Sun, 2 Feb 2025 11:20:46 +0000 (+0900) Subject: nvme: add dispersed-ns-participating-nss-log command X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=6dba5272189bcdd489c414b61fc90d878692b54e;p=users%2Fsagi%2Fnvme-cli.git nvme: add dispersed-ns-participating-nss-log command Since added the NVMe 2.1 log page. Signed-off-by: Tokunori Ikegami --- diff --git a/nvme-builtin.h b/nvme-builtin.h index 486b1e5a..caa60721 100644 --- a/nvme-builtin.h +++ b/nvme-builtin.h @@ -61,6 +61,7 @@ COMMAND_LIST( 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("dispersed-ns-participating-nss-log", "Retrieve Dispersed Namespace Participating NVM Subsystems Log, show it", get_dispersed_ns_participating_nss_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 2c5135a7..e9aa5688 100644 --- a/nvme-print-binary.c +++ b/nvme-print-binary.c @@ -316,6 +316,11 @@ static void binary_rotational_media_info_log(struct nvme_rotational_media_info_l d_raw((unsigned char *)info, sizeof(*info)); } +static void binary_dispersed_ns_psub_log(struct nvme_dispersed_ns_participating_nss_log *log) +{ + d_raw((unsigned char *)log, sizeof(*log)); +} + static struct print_ops binary_print_ops = { /* libnvme types.h print functions */ .ana_log = binary_ana_log, @@ -384,6 +389,7 @@ static struct print_ops binary_print_ops = { .show_finish = NULL, .mgmt_addr_list_log = binary_mgmt_addr_list_log, .rotational_media_info_log = binary_rotational_media_info_log, + .dispersed_ns_psub_log = binary_dispersed_ns_psub_log, /* libnvme tree print functions */ .list_item = NULL, diff --git a/nvme-print-json.c b/nvme-print-json.c index ee4338aa..57110c15 100644 --- a/nvme-print-json.c +++ b/nvme-print-json.c @@ -4657,6 +4657,26 @@ static void json_rotational_media_info_log(struct nvme_rotational_media_info_log json_print(r); } +static void json_dispersed_ns_psub_log(struct nvme_dispersed_ns_participating_nss_log *log) +{ + struct json_object *r = json_create_object(); + __u64 numpsub = le64_to_cpu(log->numpsub); + __u64 i; + char json_str[STR_LEN]; + char psub[NVME_NQN_LENGTH + 1]; + + obj_add_uint64(r, "genctr", le64_to_cpu(log->genctr)); + obj_add_uint64(r, "numpsub", numpsub); + for (i = 0; i < numpsub; i++) { + snprintf(json_str, sizeof(json_str), "participating_nss %"PRIu64"", (uint64_t)i); + snprintf(psub, sizeof(psub), "%-.*s", NVME_NQN_LENGTH, + &log->participating_nss[i * NVME_NQN_LENGTH]); + obj_add_str(r, json_str, psub); + } + + json_print(r); +} + static struct print_ops json_print_ops = { /* libnvme types.h print functions */ .ana_log = json_ana_log, @@ -4726,6 +4746,7 @@ static struct print_ops json_print_ops = { .show_finish = json_show_finish, .mgmt_addr_list_log = json_mgmt_addr_list_log, .rotational_media_info_log = json_rotational_media_info_log, + .dispersed_ns_psub_log = json_dispersed_ns_psub_log, /* libnvme tree print functions */ .list_item = json_list_item, diff --git a/nvme-print-stdout.c b/nvme-print-stdout.c index cc4d1fcd..9faf8466 100644 --- a/nvme-print-stdout.c +++ b/nvme-print-stdout.c @@ -5603,6 +5603,18 @@ static void stdout_rotational_media_info_log(struct nvme_rotational_media_info_l printf("fldc: %u\n", le32_to_cpu(info->fldc)); } +static void stdout_dispersed_ns_psub_log(struct nvme_dispersed_ns_participating_nss_log *log) +{ + __u64 numpsub = le64_to_cpu(log->numpsub); + __u64 i; + + printf("genctr: %"PRIu64"\n", le64_to_cpu(log->genctr)); + printf("numpsub: %"PRIu64"\n", (uint64_t)numpsub); + for (i = 0; i < numpsub; i++) + printf("participating_nss %"PRIu64": %-.*s\n", (uint64_t)i, NVME_NQN_LENGTH, + &log->participating_nss[i * NVME_NQN_LENGTH]); +} + static struct print_ops stdout_print_ops = { /* libnvme types.h print functions */ .ana_log = stdout_ana_log, @@ -5672,6 +5684,7 @@ static struct print_ops stdout_print_ops = { .show_finish = NULL, .mgmt_addr_list_log = stdout_mgmt_addr_list_log, .rotational_media_info_log = stdout_rotational_media_info_log, + .dispersed_ns_psub_log = stdout_dispersed_ns_psub_log, /* libnvme tree print functions */ .list_item = stdout_list_item, diff --git a/nvme-print.c b/nvme-print.c index bb41543b..77f4b17e 100644 --- a/nvme-print.c +++ b/nvme-print.c @@ -1502,3 +1502,9 @@ void nvme_show_rotational_media_info_log(struct nvme_rotational_media_info_log * { nvme_print(rotational_media_info_log, flags, info); } + +void nvme_show_dispersed_ns_psub_log(struct nvme_dispersed_ns_participating_nss_log *log, + nvme_print_flags_t flags) +{ + nvme_print(dispersed_ns_psub_log, flags, log); +} diff --git a/nvme-print.h b/nvme-print.h index 55616279..e446c07e 100644 --- a/nvme-print.h +++ b/nvme-print.h @@ -90,6 +90,7 @@ struct print_ops { void (*show_finish)(void); void (*mgmt_addr_list_log)(struct nvme_mgmt_addr_list_log *ma_log); void (*rotational_media_info_log)(struct nvme_rotational_media_info_log *info); + void (*dispersed_ns_psub_log)(struct nvme_dispersed_ns_participating_nss_log *log); /* libnvme tree print functions */ void (*list_item)(nvme_ns_t n); @@ -335,4 +336,6 @@ void nvme_show_mgmt_addr_list_log(struct nvme_mgmt_addr_list_log *ma_list, nvme_print_flags_t flags); void nvme_show_rotational_media_info_log(struct nvme_rotational_media_info_log *info, nvme_print_flags_t flags); +void nvme_show_dispersed_ns_psub_log(struct nvme_dispersed_ns_participating_nss_log *log, + nvme_print_flags_t flags); #endif /* NVME_PRINT_H */ diff --git a/nvme-wrap.c b/nvme-wrap.c index 0b1039a6..2cc5204f 100644 --- a/nvme-wrap.c +++ b/nvme-wrap.c @@ -451,3 +451,9 @@ int nvme_cli_get_log_rotational_media_info(struct nvme_dev *dev, __u16 endgid, _ return -ENODEV; } + +int nvme_cli_get_log_dispersed_ns_participating_nss(struct nvme_dev *dev, __u32 nsid, __u32 len, + struct nvme_dispersed_ns_participating_nss_log *log) +{ + return do_admin_op(get_log_dispersed_ns_participating_nss, dev, nsid, len, log); +} diff --git a/nvme-wrap.h b/nvme-wrap.h index bde7d720..b675f4f0 100644 --- a/nvme-wrap.h +++ b/nvme-wrap.h @@ -154,4 +154,7 @@ int nvme_cli_get_log_mgmt_addr_list(struct nvme_dev *dev, __u32 len, int nvme_cli_get_log_rotational_media_info(struct nvme_dev *dev, __u16 endgid, __u32 len, struct nvme_rotational_media_info_log *info); +int nvme_cli_get_log_dispersed_ns_participating_nss(struct nvme_dev *dev, __u32 nsid, __u32 len, + struct nvme_dispersed_ns_participating_nss_log *log); + #endif /* _NVME_WRAP_H */ diff --git a/nvme.c b/nvme.c index 06deeaeb..a50ffab6 100644 --- a/nvme.c +++ b/nvme.c @@ -10165,6 +10165,94 @@ static int get_rotational_media_info_log(int argc, char **argv, struct command * return err; } +static int get_dispersed_ns_psub(struct nvme_dev *dev, __u32 nsid, + struct nvme_dispersed_ns_participating_nss_log **logp) +{ + int err; + __u64 header_len = sizeof(**logp); + __u64 psub_list_len; + struct nvme_get_log_args args = { + .args_size = sizeof(args), + .fd = dev_fd(dev), + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .lid = NVME_LOG_LID_DISPERSED_NS_PARTICIPATING_NSS, + .nsid = nsid, + .lpo = header_len, + }; + struct nvme_dispersed_ns_participating_nss_log *log = nvme_alloc(header_len); + + if (!log) + return -ENOMEM; + + err = nvme_cli_get_log_dispersed_ns_participating_nss(dev, nsid, header_len, log); + if (err) + goto err_free; + + psub_list_len = le64_to_cpu(log->numpsub) * NVME_NQN_LENGTH; + + log = nvme_realloc(log, header_len + psub_list_len); + if (!log) { + err = -ENOMEM; + goto err_free; + } + + args.log = log->participating_nss, + args.len = psub_list_len; + + err = nvme_cli_get_log_page(dev, NVME_LOG_PAGE_PDU_SIZE, &args); + if (err) + goto err_free; + + *logp = log; + return 0; + +err_free: + free(log); + return err; +} + +static int get_dispersed_ns_participating_nss_log(int argc, char **argv, struct command *cmd, + struct plugin *plugin) +{ + const char *desc = "Retrieve Dispersed Namespace Participating NVM Subsystems Log, show it"; + nvme_print_flags_t flags; + int err; + + _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; + + _cleanup_free_ struct nvme_dispersed_ns_participating_nss_log *log = NULL; + + struct config { + __u32 namespace_id; + }; + + struct config cfg = { + .namespace_id = 1, + }; + + NVME_ARGS(opts, OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id_desired)); + + err = parse_and_open(&dev, argc, argv, desc, opts); + if (err) + return err; + + err = validate_output_format(nvme_cfg.output_format, &flags); + if (err < 0) { + nvme_show_error("Invalid output format"); + return err; + } + + err = get_dispersed_ns_psub(dev, cfg.namespace_id, &log); + if (!err) + nvme_show_dispersed_ns_psub_log(log, flags); + else if (err > 0) + nvme_show_status(err); + else + nvme_show_perror("dispersed ns participating nss log"); + + return err; +} + void register_extension(struct plugin *plugin) { plugin->parent = &nvme;