Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

nvme: add dispersed-ns-participating-nss-log command #2691

Merged
merged 4 commits into from
Feb 10, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 55 additions & 0 deletions Documentation/nvme-dispersed-ns-participating-nss-log.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
nvme-dispersed-ns-participating-nss-log(1)
==========================================

NAME
----
nvme-dispersed-ns-participating-nss-log - Retrieve Dispersed Namespace
Participating NVM Subsystems Log, show it

SYNOPSIS
--------
[verse]
'nvme dispersed-ns-participating-nss-log' <device>
[--namespace-id=<nsid> | -n <nsid>] [--verbose | -v]
[--output-format=<fmt> | -o <fmt>] [--timeout=<timeout>]

DESCRIPTION
-----------
Retrieve Dispersed Namespace Participating NVM Subsystems Log, show it

The <device> parameter is mandatory NVMe character device (ex: /dev/nvme0).

On success it returns 0, error code otherwise.

OPTIONS
-------
-n <nsid>::
--namespace-id=<nsid>::
The namespace identifier to delete.
Retrieve the dispersed namespace participating NVM subsystems log for
the given nsid.

-v::
--verbose::
Increase the information detail in the output.

-o <fmt>::
--output-format=<fmt>::
Set the reporting format to 'normal', 'json' or 'binary'. Only one
output format can be used at a time.

-t <timeout>::
--timeout=<timeout>::
Override default timeout value. In milliseconds.

EXAMPLES
--------
* Has the program issue a dispersed-ns-participating-nss-log
+
------------
# nvme dispersed-ns-participating-nss-log /dev/nvme0 --namespace-id=2
------------

NVME
----
Part of the nvme-user suite.
21 changes: 19 additions & 2 deletions completions/_nvme
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,7 @@ _nvme () {
'io-mgmt-send:send an I/O management send command'
'mgmt-addr-list-log:retrieve management address list log'
'changed-ns-list-log:retrieve changed allocated namespaces log'
'dispersed-ns-participating-nss-log:retrieve dispersed namespace participating NVM subsystems log'
'version:show the program version'
'ocp:OCP cloud SSD extensions'
'solidigm:Solidigm plug-in extensions'
Expand Down Expand Up @@ -2590,7 +2591,7 @@ _nvme () {
-t':alias of --timeout'
)
_arguments '*:: :->subcmds'
_describe -t commands "nvme set-reg options" _io_mgmt_recv
_describe -t commands "nvme io-mgmt-recv-reg options" _io_mgmt_recv
;;
(io-mgmt-send)
local _io_mgmt_send
Expand All @@ -2614,7 +2615,7 @@ _nvme () {
-t':alias of --timeout'
)
_arguments '*:: :->subcmds'
_describe -t commands "nvme set-reg options" _io_mgmt_send
_describe -t commands "nvme io-mgmt-send options" _io_mgmt_send
;;
(mgmt-addr-list-log)
local _mal_log
Expand Down Expand Up @@ -2657,6 +2658,22 @@ _nvme () {
_arguments '*:: :->subcmds'
_describe -t commands "nvme changed-alloc-ns-list-log options" _changed_alloc_ns_list_log
;;
(dispersed-ns-participating-nss-log)
local _dns_psub_log
_caplog=(
/dev/nvme':supply a device to use (required)'
--namespace-id=':show infos for namespace <nsid>'
-n':alias of --namespace-id'
--verbose':Increase the information detail in the output.'
-v':alias for --verbose'
--output-format=':Output format: normal|json|binary'
-o ':alias for --output-format'
--timeout=':value for timeout'
-t ':alias for --timeout'
)
_arguments '*:: :->subcmds'
_describe -t commands "nvme dispersed-ns-participating-nss-log" _dns_psub_log
;;
(version)
local _version
_version=(
Expand Down
23 changes: 19 additions & 4 deletions completions/bash-nvme-completion.sh
Original file line number Diff line number Diff line change
Expand Up @@ -465,18 +465,28 @@ nvme_list_opts () {
--nmimt= -m --nmd0= -0 --nmd1= -1 --input-file= -i"
;;
"get-reg")
opts+=" --offset, -O --human-readable -H --cap --vs --cmbloc \
opts+=" --offset= -O --human-readable -H --cap --vs --cmbloc \
--cmbsz --bpinfo --cmbsts --cmbebs --cmbswtp --crto \
--pmrcap --pmrsts --pmrebs --pmrswtp --intms --intmc \
--cc --csts --nssr --aqa --asq --acq --bprsel --bpmbl \
--cmbmsc --nssd --pmrctl --pmrmscl --pmrmscu \
--output-format -o --verbose -v --timeout= -t"
;;
"set-reg")
opts+=" --offset, -O --value= -V --mmio32 -m --intms= --intmc= \
opts+=" --offset= -O --value= -V --mmio32 -m --intms= --intmc= \
--cc= --csts= --nssr= --aqa= --asq= --acq= --bprsel= \
--bpmbl= --cmbmsc= --nssd= --pmrctl= --pmrmscl= \
--pmrmscu= --output-format= -o --verbose= -v \
--pmrmscu= --output-format= -o --verbose -v \
--timeout= -t"
;;
"io-mgmt-recv")
opts+=" --namespace-id= -n --mos= -s --mo= -m --data= -d \
--data-len= -l --output-format= -o --verbose -v \
--timeout= -t"
;;
"io-mgmt-send")
opts+=" --namespace-id= -n --mos= -s --mo= -m --data= -d \
--data-len= -l --output-format= -o --verbose -v \
--timeout= -t"
;;
"mgmt-addr-list-log")
Expand All @@ -490,6 +500,10 @@ nvme_list_opts () {
opts+=" --output-format= -o --raw-binary -b --verbose -v \
--timeout= -t"
;;
"dispersed-ns-participating-nss-log")
opts+=" --namespace-id= -n --verbose -v --output-format= -o \
--timeout= -t"
;;
"version")
opts+=$NO_OPTS
;;
Expand Down Expand Up @@ -1681,7 +1695,8 @@ _nvme_subcmds () {
supported-log-pages lockdown media-unit-stat-log \
supported-cap-config-log dim show-topology list-endgrp \
nvme-mi-recv nvme-mi-send get-reg set-reg mgmt-addr-list-log \
rotational-media-info-log changed-alloc-ns-list-log"
rotational-media-info-log changed-alloc-ns-list-log \
io-mgmt-recv io-mgmt-send dispersed-ns-participating-nss-log"

# Add plugins:
for plugin in "${!_plugin_subcmds[@]}"; do
Expand Down
1 change: 1 addition & 0 deletions nvme-builtin.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@
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)

Check failure on line 64 in nvme-builtin.h

View workflow job for this annotation

GitHub Actions / checkpatch review

WARNING: line length of 165 exceeds 120 columns
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)
Expand Down
6 changes: 6 additions & 0 deletions nvme-print-binary.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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,
Expand Down
21 changes: 21 additions & 0 deletions nvme-print-json.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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,
Expand Down
13 changes: 13 additions & 0 deletions nvme-print-stdout.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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,
Expand Down
6 changes: 6 additions & 0 deletions nvme-print.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
3 changes: 3 additions & 0 deletions nvme-print.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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 */
6 changes: 6 additions & 0 deletions nvme-wrap.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
3 changes: 3 additions & 0 deletions nvme-wrap.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
88 changes: 88 additions & 0 deletions nvme.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down