Import from AlmaLinux stable repository

This commit is contained in:
eabdullin 2025-12-04 12:39:15 +00:00
parent c8b2a6aa5e
commit 78306bffd9
14 changed files with 8 additions and 1445 deletions

2
.gitignore vendored
View File

@ -1 +1 @@
SOURCES/nvme-cli-2.11.tar.gz
SOURCES/nvme-cli-2.13.tar.gz

View File

@ -1 +1 @@
e3a599bd67057c5bb9a8e7e621d439b9fbcaf7b6 SOURCES/nvme-cli-2.11.tar.gz
b5bb4ff66afbd7e51eadf7ceb99a088c8189c597 SOURCES/nvme-cli-2.13.tar.gz

View File

@ -1,239 +0,0 @@
From ab841e9a58688e64c5ce50e6159f34fc1a414c48 Mon Sep 17 00:00:00 2001
From: Martin George <marting@netapp.com>
Date: Mon, 11 Nov 2024 22:08:39 +0530
Subject: [PATCH] netapp-ontapdev: add verbose output
Add a vebose output option to display additional information of
ONTAP devices on the host.
Signed-off-by: Martin George <marting@netapp.com>
---
plugins/netapp/netapp-nvme.c | 141 +++++++++++++++++++++++++++++++----
1 file changed, 126 insertions(+), 15 deletions(-)
diff --git a/plugins/netapp/netapp-nvme.c b/plugins/netapp/netapp-nvme.c
index 9f05ffc5..cebd019e 100644
--- a/plugins/netapp/netapp-nvme.c
+++ b/plugins/netapp/netapp-nvme.c
@@ -119,6 +119,42 @@ static void netapp_get_ns_size(char *size, unsigned long long *lba,
sprintf(size, "%.2f%sB", nsze, s_suffix);
}
+static void netapp_get_ns_attrs(char *size, char *used, char *blk_size,
+ char *version, unsigned long long *lba,
+ struct nvme_id_ctrl *ctrl, struct nvme_id_ns *ns)
+{
+ __u8 lba_index;
+
+ nvme_id_ns_flbas_to_lbaf_inuse(ns->flbas, &lba_index);
+ *lba = 1ULL << ns->lbaf[lba_index].ds;
+
+ /* get the namespace size */
+ double nsze = le64_to_cpu(ns->nsze) * (*lba);
+ const char *s_suffix = suffix_si_get(&nsze);
+
+ sprintf(size, "%.2f%sB", nsze, s_suffix);
+
+ /* get the namespace utilization */
+ double nuse = le64_to_cpu(ns->nuse) * (*lba);
+ const char *u_suffix = suffix_si_get(&nuse);
+
+ sprintf(used, "%.2f%sB", nuse, u_suffix);
+
+ /* get the namespace block size */
+ long long addr = 1LL << ns->lbaf[lba_index].ds;
+ const char *l_suffix = suffix_binary_get(&addr);
+
+ sprintf(blk_size, "%u%sB", (unsigned int)addr, l_suffix);
+
+ /* get the ontap version */
+ int i, max = sizeof(ctrl->fr);
+
+ memcpy(version, ctrl->fr, sizeof(ctrl->fr));
+ /* strip trailing whitespaces */
+ for (i = max - 1; i >= 0 && version[i] == ' '; i--)
+ version[i] = '\0';
+}
+
static void ontap_labels_to_str(char *dst, char *src, int count)
{
int i;
@@ -235,7 +271,8 @@ static void netapp_smdevice_json(struct json_object *devices, char *devname,
static void netapp_ontapdevice_json(struct json_object *devices, char *devname,
char *vsname, char *nspath, int nsid, char *uuid,
- char *size, long long lba, long long nsze)
+ unsigned long long lba, char *version,
+ unsigned long long nsze, unsigned long long nuse)
{
struct json_object *device_attrs;
@@ -245,9 +282,10 @@ static void netapp_ontapdevice_json(struct json_object *devices, char *devname,
json_object_add_value_string(device_attrs, "Namespace_Path", nspath);
json_object_add_value_int(device_attrs, "NSID", nsid);
json_object_add_value_string(device_attrs, "UUID", uuid);
- json_object_add_value_string(device_attrs, "Size", size);
- json_object_add_value_int(device_attrs, "LBA_Data_Size", lba);
- json_object_add_value_int(device_attrs, "Namespace_Size", nsze);
+ json_object_add_value_uint64(device_attrs, "LBA_Data_Size", lba);
+ json_object_add_value_uint64(device_attrs, "Namespace_Size", nsze);
+ json_object_add_value_uint64(device_attrs, "UsedBytes", nuse);
+ json_object_add_value_string(device_attrs, "Version", version);
json_array_add_value_object(devices, device_attrs);
}
@@ -410,6 +448,66 @@ out:
json_free_object(root);
}
+static void netapp_ontapdevices_print_verbose(struct ontapdevice_info *devices,
+ int count, int format, const char *devname)
+{
+ char vsname[ONTAP_LABEL_LEN] = " ";
+ char nspath[ONTAP_NS_PATHLEN] = " ";
+ unsigned long long lba;
+ char size[128], used[128];
+ char blk_size[128], version[8];
+ char uuid_str[37] = " ";
+ int i;
+
+ char *formatstr = NULL;
+ char basestr[] =
+ "%s, Vserver %s, Path %s, NSID %d, UUID %s, %s, %s, %s, %s\n";
+ char columnstr[] = "%-16s %-25s %-50s %-4d %-38s %-9s %-9s %-9s %-9s\n";
+
+ if (format == NNORMAL)
+ formatstr = basestr;
+ else if (format == NCOLUMN) {
+ printf("%-16s %-25s %-50s %-4s %-38s %-9s %-9s %-9s %-9s\n",
+ "Device", "Vserver", "Namespace Path",
+ "NSID", "UUID", "Size", "Used",
+ "Format", "Version");
+ printf("%-16s %-25s %-50s %-4s %-38s %-9s %-9s %-9s %-9s\n",
+ "----------------", "-------------------------",
+ "--------------------------------------------------",
+ "----", "--------------------------------------",
+ "---------", "---------", "---------", "---------");
+ formatstr = columnstr;
+ }
+
+ for (i = 0; i < count; i++) {
+ if (devname && !strcmp(devname, basename(devices[i].dev))) {
+ /* found the device, fetch and print for that alone */
+ netapp_get_ns_attrs(size, used, blk_size, version,
+ &lba, &devices[i].ctrl, &devices[i].ns);
+ nvme_uuid_to_string(devices[i].uuid, uuid_str);
+ netapp_get_ontap_labels(vsname, nspath,
+ devices[i].log_data);
+
+ printf(formatstr, devices[i].dev, vsname, nspath,
+ devices[i].nsid, uuid_str, size, used,
+ blk_size, version);
+ return;
+ }
+ }
+
+ for (i = 0; i < count; i++) {
+ /* fetch info and print for all devices */
+ netapp_get_ns_attrs(size, used, blk_size, version,
+ &lba, &devices[i].ctrl, &devices[i].ns);
+ nvme_uuid_to_string(devices[i].uuid, uuid_str);
+ netapp_get_ontap_labels(vsname, nspath, devices[i].log_data);
+
+ printf(formatstr, devices[i].dev, vsname, nspath,
+ devices[i].nsid, uuid_str, size, used,
+ blk_size, version);
+ }
+}
+
static void netapp_ontapdevices_print_regular(struct ontapdevice_info *devices,
int count, int format, const char *devname)
{
@@ -472,7 +570,8 @@ static void netapp_ontapdevices_print_json(struct ontapdevice_info *devices,
char vsname[ONTAP_LABEL_LEN] = " ";
char nspath[ONTAP_NS_PATHLEN] = " ";
unsigned long long lba;
- char size[128];
+ char size[128], used[128];
+ char blk_size[128], version[8];
char uuid_str[37] = " ";
int i;
@@ -483,28 +582,33 @@ static void netapp_ontapdevices_print_json(struct ontapdevice_info *devices,
for (i = 0; i < count; i++) {
if (devname && !strcmp(devname, basename(devices[i].dev))) {
/* found the device, fetch info for that alone */
- netapp_get_ns_size(size, &lba, &devices[i].ns);
+ netapp_get_ns_attrs(size, used, blk_size, version,
+ &lba, &devices[i].ctrl, &devices[i].ns);
nvme_uuid_to_string(devices[i].uuid, uuid_str);
- netapp_get_ontap_labels(vsname, nspath, devices[i].log_data);
+ netapp_get_ontap_labels(vsname, nspath,
+ devices[i].log_data);
netapp_ontapdevice_json(json_devices, devices[i].dev,
vsname, nspath, devices[i].nsid,
- uuid_str, size, lba,
- le64_to_cpu(devices[i].ns.nsze));
+ uuid_str, lba, version,
+ le64_to_cpu(devices[i].ns.nsze),
+ le64_to_cpu(devices[i].ns.nuse));
goto out;
}
}
for (i = 0; i < count; i++) {
/* fetch info for all devices */
- netapp_get_ns_size(size, &lba, &devices[i].ns);
+ netapp_get_ns_attrs(size, used, blk_size, version,
+ &lba, &devices[i].ctrl, &devices[i].ns);
nvme_uuid_to_string(devices[i].uuid, uuid_str);
netapp_get_ontap_labels(vsname, nspath, devices[i].log_data);
netapp_ontapdevice_json(json_devices, devices[i].dev,
vsname, nspath, devices[i].nsid,
- uuid_str, size, lba,
- le64_to_cpu(devices[i].ns.nsze));
+ uuid_str, lba, version,
+ le64_to_cpu(devices[i].ns.nsze),
+ le64_to_cpu(devices[i].ns.nuse));
}
out:
@@ -776,6 +880,7 @@ static int netapp_ontapdevices(int argc, char **argv, struct command *command,
int num_ontapdevices = 0;
struct config {
+ bool verbose;
char *output_format;
};
@@ -784,6 +889,7 @@ static int netapp_ontapdevices(int argc, char **argv, struct command *command,
};
OPT_ARGS(opts) = {
+ OPT_FLAG("verbose", 'v', &cfg.verbose, "Increase output verbosity"),
OPT_FMT("output-format", 'o', &cfg.output_format, "Output Format: normal|json|column"),
OPT_END()
};
@@ -839,9 +945,14 @@ static int netapp_ontapdevices(int argc, char **argv, struct command *command,
}
if (num_ontapdevices) {
- if (fmt == NNORMAL || fmt == NCOLUMN)
- netapp_ontapdevices_print_regular(ontapdevices,
- num_ontapdevices, fmt, devname);
+ if (fmt == NNORMAL || fmt == NCOLUMN) {
+ if (argconfig_parse_seen(opts, "verbose"))
+ netapp_ontapdevices_print_verbose(ontapdevices,
+ num_ontapdevices, fmt, devname);
+ else
+ netapp_ontapdevices_print_regular(ontapdevices,
+ num_ontapdevices, fmt, devname);
+ }
else if (fmt == NJSON)
netapp_ontapdevices_print_json(ontapdevices,
num_ontapdevices, devname);
--
2.43.5

View File

@ -1,39 +0,0 @@
From a8d1efcaba26dd992d89da2e60999642d7ae8eca Mon Sep 17 00:00:00 2001
From: Martin George <marting@netapp.com>
Date: Wed, 13 Nov 2024 00:14:07 +0530
Subject: [PATCH] netapp-ontapdev-doc: add verbose details
Add verbose option details to the ontapdevices documentation.
Signed-off-by: Martin George <marting@netapp.com>
---
Documentation/nvme-netapp-ontapdevices.txt | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/Documentation/nvme-netapp-ontapdevices.txt b/Documentation/nvme-netapp-ontapdevices.txt
index fc28947d..e56bae57 100644
--- a/Documentation/nvme-netapp-ontapdevices.txt
+++ b/Documentation/nvme-netapp-ontapdevices.txt
@@ -8,7 +8,7 @@ nvme-netapp-ontapdevices - Display information about ONTAP devices
SYNOPSIS
--------
[verse]
-'nvme netapp ontapdevices' [--output-format=<fmt> | -o <fmt>]
+'nvme netapp ontapdevices' [--output-format=<fmt> | -o <fmt>] [--verbose | -v]
DESCRIPTION
-----------
@@ -22,6 +22,10 @@ OPTIONS
Set the reporting format to 'normal' (default), 'column', or
'json'. Only one output format can be used at a time.
+-v::
+--verbose::
+ Display additional information of ONTAP devices on the host.
+
EXAMPLES
--------
* Display information, in a column-based format, for ONTAP devices.
--
2.43.5

View File

@ -1,52 +0,0 @@
From 24961e9d228531f1cb60739239d7591aa70bdd53 Mon Sep 17 00:00:00 2001
From: Martin George <marting@netapp.com>
Date: Fri, 29 Nov 2024 11:04:34 +0530
Subject: [PATCH] netapp-ontapdev: fix fw version handling
The string used to capture the fw version was not handled
properly. Fix the same.
Signed-off-by: Martin George <marting@netapp.com>
---
plugins/netapp/netapp-nvme.c | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/plugins/netapp/netapp-nvme.c b/plugins/netapp/netapp-nvme.c
index cebd019e..76e8ddf1 100644
--- a/plugins/netapp/netapp-nvme.c
+++ b/plugins/netapp/netapp-nvme.c
@@ -146,10 +146,11 @@ static void netapp_get_ns_attrs(char *size, char *used, char *blk_size,
sprintf(blk_size, "%u%sB", (unsigned int)addr, l_suffix);
- /* get the ontap version */
+ /* get the firmware version */
int i, max = sizeof(ctrl->fr);
- memcpy(version, ctrl->fr, sizeof(ctrl->fr));
+ memcpy(version, ctrl->fr, max);
+ version[max] = '\0';
/* strip trailing whitespaces */
for (i = max - 1; i >= 0 && version[i] == ' '; i--)
version[i] = '\0';
@@ -455,7 +456,7 @@ static void netapp_ontapdevices_print_verbose(struct ontapdevice_info *devices,
char nspath[ONTAP_NS_PATHLEN] = " ";
unsigned long long lba;
char size[128], used[128];
- char blk_size[128], version[8];
+ char blk_size[128], version[9];
char uuid_str[37] = " ";
int i;
@@ -571,7 +572,7 @@ static void netapp_ontapdevices_print_json(struct ontapdevice_info *devices,
char nspath[ONTAP_NS_PATHLEN] = " ";
unsigned long long lba;
char size[128], used[128];
- char blk_size[128], version[8];
+ char blk_size[128], version[9];
char uuid_str[37] = " ";
int i;
--
2.43.5

View File

@ -1,42 +0,0 @@
From b5208a987bf85ae3f4e264e6df55a7fb9acd9907 Mon Sep 17 00:00:00 2001
From: Martin George <marting@netapp.com>
Date: Fri, 29 Nov 2024 11:10:16 +0530
Subject: [PATCH] netapp-ontapdev: fix JSON output for nsze & nuse
The namespace size & utilization values printed in the JSON
output was incorrect. Fix the same.
Signed-off-by: Martin George <marting@netapp.com>
---
plugins/netapp/netapp-nvme.c | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/plugins/netapp/netapp-nvme.c b/plugins/netapp/netapp-nvme.c
index 76e8ddf1..6ff428d9 100644
--- a/plugins/netapp/netapp-nvme.c
+++ b/plugins/netapp/netapp-nvme.c
@@ -276,6 +276,8 @@ static void netapp_ontapdevice_json(struct json_object *devices, char *devname,
unsigned long long nsze, unsigned long long nuse)
{
struct json_object *device_attrs;
+ unsigned long long ns_size = nsze * lba;
+ unsigned long long used_size = nuse * lba;
device_attrs = json_create_object();
json_object_add_value_string(device_attrs, "Device", devname);
@@ -283,9 +285,9 @@ static void netapp_ontapdevice_json(struct json_object *devices, char *devname,
json_object_add_value_string(device_attrs, "Namespace_Path", nspath);
json_object_add_value_int(device_attrs, "NSID", nsid);
json_object_add_value_string(device_attrs, "UUID", uuid);
- json_object_add_value_uint64(device_attrs, "LBA_Data_Size", lba);
- json_object_add_value_uint64(device_attrs, "Namespace_Size", nsze);
- json_object_add_value_uint64(device_attrs, "UsedBytes", nuse);
+ json_object_add_value_uint64(device_attrs, "LBA_Size", lba);
+ json_object_add_value_uint64(device_attrs, "Namespace_Size", ns_size);
+ json_object_add_value_uint64(device_attrs, "UsedBytes", used_size);
json_object_add_value_string(device_attrs, "Version", version);
json_array_add_value_object(devices, device_attrs);
--
2.43.5

View File

@ -1,53 +0,0 @@
From 6f1f902af071fc46b78485ce851ffaaeb444c25f Mon Sep 17 00:00:00 2001
From: Martin George <marting@netapp.com>
Date: Fri, 29 Nov 2024 11:15:23 +0530
Subject: [PATCH] nvme-netapp: update err messages
Trivial fix to update a few error messages.
Signed-off-by: Martin George <marting@netapp.com>
---
plugins/netapp/netapp-nvme.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/plugins/netapp/netapp-nvme.c b/plugins/netapp/netapp-nvme.c
index 6ff428d9..aee65215 100644
--- a/plugins/netapp/netapp-nvme.c
+++ b/plugins/netapp/netapp-nvme.c
@@ -816,7 +816,7 @@ static int netapp_smdevices(int argc, char **argv, struct command *command,
num = scandir(dev_path, &devices, netapp_nvme_filter, alphasort);
if (num <= 0) {
- fprintf(stderr, "No NVMe devices detected.\n");
+ fprintf(stderr, "No NVMe devices detected\n");
return num;
}
@@ -834,7 +834,7 @@ static int netapp_smdevices(int argc, char **argv, struct command *command,
smdevices = calloc(num, sizeof(*smdevices));
if (!smdevices) {
- fprintf(stderr, "Unable to allocate memory for devices.\n");
+ fprintf(stderr, "Unable to allocate memory for devices\n");
return -ENOMEM;
}
@@ -921,13 +921,13 @@ static int netapp_ontapdevices(int argc, char **argv, struct command *command,
num = scandir(dev_path, &devices, netapp_nvme_filter, alphasort);
if (num <= 0) {
- fprintf(stderr, "No NVMe devices detected.\n");
+ fprintf(stderr, "No NVMe devices detected\n");
return num;
}
ontapdevices = calloc(num, sizeof(*ontapdevices));
if (!ontapdevices) {
- fprintf(stderr, "Unable to allocate memory for devices.\n");
+ fprintf(stderr, "Unable to allocate memory for devices\n");
return -ENOMEM;
}
--
2.43.5

View File

@ -1,106 +0,0 @@
From b8c9a3c1ee55c2477ce1ce0348014aa891dee58d Mon Sep 17 00:00:00 2001
From: Martin George <marting@netapp.com>
Date: Tue, 3 Dec 2024 13:16:17 +0530
Subject: [PATCH] netapp-smdev: remove redundant code
Remove redundant code in regular and JSON functions, which is
already invoked in a separate function.
Signed-off-by: Martin George <marting@netapp.com>
---
plugins/netapp/netapp-nvme.c | 44 +++++++-----------------------------
1 file changed, 8 insertions(+), 36 deletions(-)
diff --git a/plugins/netapp/netapp-nvme.c b/plugins/netapp/netapp-nvme.c
index aee65215..f839852d 100644
--- a/plugins/netapp/netapp-nvme.c
+++ b/plugins/netapp/netapp-nvme.c
@@ -300,7 +300,8 @@ static void netapp_smdevices_print_regular(struct smdevice_info *devices,
char array_label[ARRAY_LABEL_LEN / 2 + 1];
char volume_label[VOLUME_LABEL_LEN / 2 + 1];
char nguid_str[33];
- __u8 lba_index;
+ unsigned long long lba;
+ char size[128];
char *formatstr = NULL;
char basestr[] =
@@ -325,15 +326,7 @@ static void netapp_smdevices_print_regular(struct smdevice_info *devices,
for (i = 0; i < count; i++) {
if (devname && !strcmp(devname, basename(devices[i].dev))) {
/* found the device, fetch info for that alone */
- nvme_id_ns_flbas_to_lbaf_inuse(devices[i].ns.flbas,
- &lba_index);
- unsigned long long lba = 1ULL <<
- devices[i].ns.lbaf[lba_index].ds;
- double nsze = le64_to_cpu(devices[i].ns.nsze) * lba;
- const char *s_suffix = suffix_si_get(&nsze);
- char size[128];
-
- sprintf(size, "%.2f%sB", nsze, s_suffix);
+ netapp_get_ns_size(size, &lba, &devices[i].ns);
netapp_convert_string(array_label,
(char *)&devices[i].ctrl.vs[20],
ARRAY_LABEL_LEN / 2);
@@ -353,14 +346,7 @@ static void netapp_smdevices_print_regular(struct smdevice_info *devices,
for (i = 0; i < count; i++) {
/* fetch info for all devices */
- nvme_id_ns_flbas_to_lbaf_inuse(devices[i].ns.flbas, &lba_index);
- unsigned long long lba = 1ULL <<
- devices[i].ns.lbaf[lba_index].ds;
- double nsze = le64_to_cpu(devices[i].ns.nsze) * lba;
- const char *s_suffix = suffix_si_get(&nsze);
- char size[128];
-
- sprintf(size, "%.2f%sB", nsze, s_suffix);
+ netapp_get_ns_size(size, &lba, &devices[i].ns);
netapp_convert_string(array_label,
(char *)&devices[i].ctrl.vs[20],
ARRAY_LABEL_LEN / 2);
@@ -384,7 +370,8 @@ static void netapp_smdevices_print_json(struct smdevice_info *devices,
char array_label[ARRAY_LABEL_LEN / 2 + 1];
char volume_label[VOLUME_LABEL_LEN / 2 + 1];
char nguid_str[33];
- __u8 lba_index;
+ unsigned long long lba;
+ char size[128];
/* prepare for the json output */
root = json_create_object();
@@ -393,15 +380,7 @@ static void netapp_smdevices_print_json(struct smdevice_info *devices,
for (i = 0; i < count; i++) {
if (devname && !strcmp(devname, basename(devices[i].dev))) {
/* found the device, fetch info for that alone */
- nvme_id_ns_flbas_to_lbaf_inuse(devices[i].ns.flbas,
- &lba_index);
- unsigned long long lba = 1ULL <<
- devices[i].ns.lbaf[lba_index].ds;
- double nsze = le64_to_cpu(devices[i].ns.nsze) * lba;
- const char *s_suffix = suffix_si_get(&nsze);
- char size[128];
-
- sprintf(size, "%.2f%sB", nsze, s_suffix);
+ netapp_get_ns_size(size, &lba, &devices[i].ns);
netapp_convert_string(array_label,
(char *)&devices[i].ctrl.vs[20],
ARRAY_LABEL_LEN / 2);
@@ -421,14 +400,7 @@ static void netapp_smdevices_print_json(struct smdevice_info *devices,
for (i = 0; i < count; i++) {
/* fetch info for all devices */
- nvme_id_ns_flbas_to_lbaf_inuse(devices[i].ns.flbas, &lba_index);
- unsigned long long lba = 1ULL <<
- devices[i].ns.lbaf[lba_index].ds;
- double nsze = le64_to_cpu(devices[i].ns.nsze) * lba;
- const char *s_suffix = suffix_si_get(&nsze);
- char size[128];
-
- sprintf(size, "%.2f%sB", nsze, s_suffix);
+ netapp_get_ns_size(size, &lba, &devices[i].ns);
netapp_convert_string(array_label,
(char *)&devices[i].ctrl.vs[20],
ARRAY_LABEL_LEN / 2);
--
2.43.5

View File

@ -1,230 +0,0 @@
From 0943fc446609996dc6acf2fae7f31a6c20c28e06 Mon Sep 17 00:00:00 2001
From: Martin George <marting@netapp.com>
Date: Wed, 4 Dec 2024 00:24:48 +0530
Subject: [PATCH] netapp-smdev: add verbose output
Add a verbose option to display additional information of smdevices
on the host. And while at it, make a few corrections/modifications
to the JSON output as well.
Signed-off-by: Martin George <marting@netapp.com>
Tested-by: Clayton Skaggs <claytons@netapp.com>
---
plugins/netapp/netapp-nvme.c | 123 ++++++++++++++++++++++++++++++-----
1 file changed, 108 insertions(+), 15 deletions(-)
diff --git a/plugins/netapp/netapp-nvme.c b/plugins/netapp/netapp-nvme.c
index f839852d..d86e93e1 100644
--- a/plugins/netapp/netapp-nvme.c
+++ b/plugins/netapp/netapp-nvme.c
@@ -250,10 +250,11 @@ static void netapp_get_ontap_labels(char *vsname, char *nspath,
static void netapp_smdevice_json(struct json_object *devices, char *devname,
char *arrayname, char *volname, int nsid, char *nguid,
- char *ctrl, char *astate, char *size, long long lba,
- long long nsze)
+ char *ctrl, char *astate, char *version, unsigned long long lba,
+ unsigned long long nsze, unsigned long long nuse)
{
struct json_object *device_attrs;
+ unsigned long long ns_size = nsze * lba;
device_attrs = json_create_object();
json_object_add_value_string(device_attrs, "Device", devname);
@@ -263,9 +264,9 @@ static void netapp_smdevice_json(struct json_object *devices, char *devname,
json_object_add_value_string(device_attrs, "Volume_ID", nguid);
json_object_add_value_string(device_attrs, "Controller", ctrl);
json_object_add_value_string(device_attrs, "Access_State", astate);
- json_object_add_value_string(device_attrs, "Size", size);
- json_object_add_value_int(device_attrs, "LBA_Data_Size", lba);
- json_object_add_value_int(device_attrs, "Namespace_Size", nsze);
+ json_object_add_value_uint64(device_attrs, "LBA_Size", lba);
+ json_object_add_value_uint64(device_attrs, "Namespace_Size", ns_size);
+ json_object_add_value_string(device_attrs, "Version", version);
json_array_add_value_object(devices, device_attrs);
}
@@ -293,6 +294,84 @@ static void netapp_ontapdevice_json(struct json_object *devices, char *devname,
json_array_add_value_object(devices, device_attrs);
}
+static void netapp_smdevices_print_verbose(struct smdevice_info *devices,
+ int count, int format, const char *devname)
+{
+ int i, slta;
+ char array_label[ARRAY_LABEL_LEN / 2 + 1];
+ char volume_label[VOLUME_LABEL_LEN / 2 + 1];
+ char nguid_str[33];
+ unsigned long long lba;
+ char size[128], used[128];
+ char blk_size[128], version[9];
+
+ char *formatstr = NULL;
+ char basestr[] =
+ "%s, Array %s, Vol %s, NSID %d, ID %s, Ctrl %c, %s, %s, %s, %s\n";
+ char columnstr[] =
+ "%-16s %-30s %-30s %4d %32s %c %-12s %-9s %-9s %-9s\n";
+
+ if (format == NNORMAL)
+ formatstr = basestr;
+ else if (format == NCOLUMN) {
+ /* print column headers and change the output string */
+ printf("%-16s %-30s %-30s %-4s %-32s %-4s %-12s %-9s %-9s %-9s\n",
+ "Device", "Array Name", "Volume Name", "NSID",
+ "Volume ID", "Ctrl", "Access State", " Size",
+ "Format", "Version");
+ printf("%-16s %-30s %-30s %-4s %-32s %-4s %-12s %-9s %-9s %-9s\n",
+ "----------------", "------------------------------",
+ "------------------------------", "----",
+ "--------------------------------", "----",
+ "------------", "---------",
+ "---------", "---------");
+ formatstr = columnstr;
+ }
+
+ for (i = 0; i < count; i++) {
+ if (devname && !strcmp(devname, basename(devices[i].dev))) {
+ /* found the device, fetch info for that alone */
+ netapp_get_ns_attrs(size, used, blk_size, version,
+ &lba, &devices[i].ctrl, &devices[i].ns);
+ netapp_convert_string(array_label,
+ (char *)&devices[i].ctrl.vs[20],
+ ARRAY_LABEL_LEN / 2);
+ slta = devices[i].ctrl.vs[0] & 0x1;
+ netapp_convert_string(volume_label,
+ (char *)devices[i].ns.vs,
+ VOLUME_LABEL_LEN / 2);
+ netapp_nguid_to_str(nguid_str, devices[i].ns.nguid);
+
+ printf(formatstr, devices[i].dev, array_label,
+ volume_label, devices[i].nsid,
+ nguid_str,
+ slta ? 'A' : 'B', "unknown", size,
+ blk_size, version);
+ return;
+ }
+ }
+
+ for (i = 0; i < count; i++) {
+ /* fetch info and print for all devices */
+ netapp_get_ns_attrs(size, used, blk_size, version,
+ &lba, &devices[i].ctrl, &devices[i].ns);
+ netapp_convert_string(array_label,
+ (char *)&devices[i].ctrl.vs[20],
+ ARRAY_LABEL_LEN / 2);
+ slta = devices[i].ctrl.vs[0] & 0x1;
+ netapp_convert_string(volume_label,
+ (char *)devices[i].ns.vs,
+ VOLUME_LABEL_LEN / 2);
+ netapp_nguid_to_str(nguid_str, devices[i].ns.nguid);
+
+ printf(formatstr, devices[i].dev, array_label,
+ volume_label, devices[i].nsid,
+ nguid_str,
+ slta ? 'A' : 'B', "unknown", size,
+ blk_size, version);
+ }
+}
+
static void netapp_smdevices_print_regular(struct smdevice_info *devices,
int count, int format, const char *devname)
{
@@ -311,7 +390,7 @@ static void netapp_smdevices_print_regular(struct smdevice_info *devices,
if (format == NNORMAL)
formatstr = basestr;
else if (format == NCOLUMN) {
- /* change output string and print column headers */
+ /* print column headers and change the output string */
printf("%-16s %-30s %-30s %-4s %-32s %-4s %-12s %-9s\n",
"Device", "Array Name", "Volume Name", "NSID",
"Volume ID", "Ctrl", "Access State", " Size");
@@ -371,7 +450,8 @@ static void netapp_smdevices_print_json(struct smdevice_info *devices,
char volume_label[VOLUME_LABEL_LEN / 2 + 1];
char nguid_str[33];
unsigned long long lba;
- char size[128];
+ char size[128], used[128];
+ char blk_size[128], version[9];
/* prepare for the json output */
root = json_create_object();
@@ -380,7 +460,8 @@ static void netapp_smdevices_print_json(struct smdevice_info *devices,
for (i = 0; i < count; i++) {
if (devname && !strcmp(devname, basename(devices[i].dev))) {
/* found the device, fetch info for that alone */
- netapp_get_ns_size(size, &lba, &devices[i].ns);
+ netapp_get_ns_attrs(size, used, blk_size, version,
+ &lba, &devices[i].ctrl, &devices[i].ns);
netapp_convert_string(array_label,
(char *)&devices[i].ctrl.vs[20],
ARRAY_LABEL_LEN / 2);
@@ -392,15 +473,18 @@ static void netapp_smdevices_print_json(struct smdevice_info *devices,
netapp_smdevice_json(json_devices, devices[i].dev,
array_label, volume_label,
devices[i].nsid, nguid_str,
- slta ? "A" : "B", "unknown", size, lba,
- le64_to_cpu(devices[i].ns.nsze));
+ slta ? "A" : "B", "unknown",
+ version, lba,
+ le64_to_cpu(devices[i].ns.nsze),
+ le64_to_cpu(devices[i].ns.nuse));
goto out;
}
}
for (i = 0; i < count; i++) {
/* fetch info for all devices */
- netapp_get_ns_size(size, &lba, &devices[i].ns);
+ netapp_get_ns_attrs(size, used, blk_size, version,
+ &lba, &devices[i].ctrl, &devices[i].ns);
netapp_convert_string(array_label,
(char *)&devices[i].ctrl.vs[20],
ARRAY_LABEL_LEN / 2);
@@ -412,7 +496,9 @@ static void netapp_smdevices_print_json(struct smdevice_info *devices,
netapp_smdevice_json(json_devices, devices[i].dev,
array_label, volume_label, devices[i].nsid,
nguid_str, slta ? "A" : "B", "unknown",
- size, lba, le64_to_cpu(devices[i].ns.nsze));
+ version, lba,
+ le64_to_cpu(devices[i].ns.nsze),
+ le64_to_cpu(devices[i].ns.nuse));
}
out:
@@ -764,6 +850,7 @@ static int netapp_smdevices(int argc, char **argv, struct command *command,
int num_smdevices = 0;
struct config {
+ bool verbose;
char *output_format;
};
@@ -772,6 +859,7 @@ static int netapp_smdevices(int argc, char **argv, struct command *command,
};
OPT_ARGS(opts) = {
+ OPT_FLAG("verbose", 'v', &cfg.verbose, "Increase output verbosity"),
OPT_FMT("output-format", 'o', &cfg.output_format, "Output Format: normal|json|column"),
OPT_END()
};
@@ -826,9 +914,14 @@ static int netapp_smdevices(int argc, char **argv, struct command *command,
}
if (num_smdevices) {
- if (fmt == NNORMAL || fmt == NCOLUMN)
- netapp_smdevices_print_regular(smdevices,
- num_smdevices, fmt, devname);
+ if (fmt == NNORMAL || fmt == NCOLUMN) {
+ if (argconfig_parse_seen(opts, "verbose"))
+ netapp_smdevices_print_verbose(smdevices,
+ num_smdevices, fmt, devname);
+ else
+ netapp_smdevices_print_regular(smdevices,
+ num_smdevices, fmt, devname);
+ }
else if (fmt == NJSON)
netapp_smdevices_print_json(smdevices,
num_smdevices, devname);
--
2.43.5

View File

@ -1,40 +0,0 @@
From cd69ccb4d51b4c0b1f772f9fef42fbf441e4a7f2 Mon Sep 17 00:00:00 2001
From: Martin George <marting@netapp.com>
Date: Tue, 3 Dec 2024 13:26:56 +0530
Subject: [PATCH] netapp-smdev-doc: add verbose details
Add verbose option details to the smdevices documentation.
Signed-off-by: Martin George <marting@netapp.com>
Tested-by: Clayton Skaggs <claytons@netapp.com>
---
Documentation/nvme-netapp-smdevices.txt | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/Documentation/nvme-netapp-smdevices.txt b/Documentation/nvme-netapp-smdevices.txt
index cb68acf7..c135ff0c 100644
--- a/Documentation/nvme-netapp-smdevices.txt
+++ b/Documentation/nvme-netapp-smdevices.txt
@@ -8,7 +8,7 @@ nvme-netapp-smdevices - Display information for each NVMe path to an E-Series vo
SYNOPSIS
--------
[verse]
-'nvme netapp smdevices' [--output-format=<fmt> | -o <fmt>]
+'nvme netapp smdevices' [--output-format=<fmt> | -o <fmt>] [--verbose | -v]
DESCRIPTION
-----------
@@ -23,6 +23,10 @@ OPTIONS
Set the reporting format to 'normal' (default), 'column', or
'json'. Only one output format can be used at a time.
+-v::
+--verbose::
+ Display additional information of E-Series devices on the host.
+
EXAMPLES
--------
* Display information, in a column-based format, for each path to an E-Series
--
2.43.5

View File

@ -1,56 +0,0 @@
From 7057e6c50639fb05d0997eaa6fac48ece3cb38bc Mon Sep 17 00:00:00 2001
From: Bryan Gurney <bgurney@redhat.com>
Date: Tue, 21 Jan 2025 12:20:34 -0500
Subject: [PATCH] nvme: set eds to true if controller supports 128 bit hostid
A controller that uses a 128-bit Host Identifier may result in the
"nvme resv-report" command failing with a "Host Identifier Inconsistent
Format" error that suggests the "simultaneous use of 64-bit and
128-bit Host Identifier values on different controllers".
This error can be avoided if the "--eds" option is used, to request
the extended data structure. However, the controller's ctratt
value indicates whether the Host Identifier is 64 bits or 128 bits.
Therefore, check the ctratt flag, and set eds to true if the
controller indicates a 128-bit Host Identifier.
Signed-off-by: Bryan Gurney <bgurney@redhat.com>
---
nvme.c | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/nvme.c b/nvme.c
index a65873b2..2ed4ee92 100644
--- a/nvme.c
+++ b/nvme.c
@@ -7740,6 +7740,7 @@ static int resv_report(int argc, char **argv, struct command *cmd, struct plugin
const char *eds = "request extended data structure";
_cleanup_free_ struct nvme_resv_status *status = NULL;
+ _cleanup_free_ struct nvme_id_ctrl *ctrl = NULL;
_cleanup_nvme_dev_ struct nvme_dev *dev = NULL;
nvme_print_flags_t flags;
int err, size;
@@ -7792,6 +7793,19 @@ static int resv_report(int argc, char **argv, struct command *cmd, struct plugin
size = (cfg.numd + 1) << 2;
+ ctrl = nvme_alloc(sizeof(*ctrl));
+ if (!ctrl)
+ return -ENOMEM;
+
+ err = nvme_cli_identify_ctrl(dev, ctrl);
+ if (err) {
+ nvme_show_error("identify-ctrl: %s", nvme_strerror(errno));
+ return -errno;
+ }
+
+ if (ctrl->ctratt & NVME_CTRL_CTRATT_128_ID)
+ cfg.eds = true;
+
status = nvme_alloc(size);
if (!status)
return -ENOMEM;
--
2.43.5

View File

@ -1,28 +0,0 @@
From 48263a3e9e26f8cf1941d6cff7f6afa48952ebf2 Mon Sep 17 00:00:00 2001
From: Martin George <marting@netapp.com>
Date: Fri, 31 Jan 2025 22:00:29 +0530
Subject: [PATCH] udev-rules-ontap: switch to queue-depth iopolicy
The queue_depth based iopolicy suits ONTAP NVMe controllers better.
So switch to the same.
Signed-off-by: Martin George <marting@netapp.com>
---
nvmf-autoconnect/udev-rules/71-nvmf-netapp.rules.in | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/nvmf-autoconnect/udev-rules/71-nvmf-netapp.rules.in b/nvmf-autoconnect/udev-rules/71-nvmf-netapp.rules.in
index 99b6a8ba..c76a3c43 100644
--- a/nvmf-autoconnect/udev-rules/71-nvmf-netapp.rules.in
+++ b/nvmf-autoconnect/udev-rules/71-nvmf-netapp.rules.in
@@ -1,5 +1,5 @@
-# Enable round-robin for NetApp ONTAP and NetApp E-Series
-ACTION=="add", SUBSYSTEM=="nvme-subsystem", ATTR{subsystype}=="nvm", ATTR{model}=="NetApp ONTAP Controller", ATTR{iopolicy}="round-robin"
+# Set appropriate iopolicy for NetApp ONTAP and NetApp E-Series
+ACTION=="add", SUBSYSTEM=="nvme-subsystem", ATTR{subsystype}=="nvm", ATTR{model}=="NetApp ONTAP Controller", ATTR{iopolicy}="queue-depth"
ACTION=="add", SUBSYSTEM=="nvme-subsystem", ATTR{subsystype}=="nvm", ATTR{model}=="NetApp E-Series", ATTR{iopolicy}="round-robin"
# Set ctrl_loss_tmo to -1 for NetApp ONTAP NVMe/TCP
--
2.43.5

View File

@ -1,538 +0,0 @@
diff --git a/nvme-print-json.c b/nvme-print-json.c
index 412eb20..cadb67a 100644
--- a/nvme-print-json.c
+++ b/nvme-print-json.c
@@ -203,6 +203,11 @@ static void obj_print(struct json_object *o)
json_print(o);
}
+static bool human(void)
+{
+ return json_print_ops.flags & VERBOSE;
+}
+
static void json_id_iocs(struct nvme_id_iocs *iocs)
{
struct json_object *r = json_create_object();
@@ -664,17 +669,21 @@ static void json_smart_log(struct nvme_smart_log *smart, unsigned int nsid,
nvme_uint128_t media_errors = le128_to_cpu(smart->media_errors);
nvme_uint128_t num_err_log_entries = le128_to_cpu(smart->num_err_log_entries);
- struct json_object *crt = json_create_object();
+ if (human()) {
+ struct json_object *crt = json_create_object();
- obj_add_int(crt, "value", smart->critical_warning);
- obj_add_int(crt, "available_spare", smart->critical_warning & 1);
- obj_add_int(crt, "temp_threshold", (smart->critical_warning & 2) >> 1);
- obj_add_int(crt, "reliability_degraded", (smart->critical_warning & 4) >> 2);
- obj_add_int(crt, "ro", (smart->critical_warning & 8) >> 3);
- obj_add_int(crt, "vmbu_failed", (smart->critical_warning & 0x10) >> 4);
- obj_add_int(crt, "pmr_ro", (smart->critical_warning & 0x20) >> 5);
+ obj_add_int(crt, "value", smart->critical_warning);
+ obj_add_int(crt, "available_spare", smart->critical_warning & 1);
+ obj_add_int(crt, "temp_threshold", (smart->critical_warning & 2) >> 1);
+ obj_add_int(crt, "reliability_degraded", (smart->critical_warning & 4) >> 2);
+ obj_add_int(crt, "ro", (smart->critical_warning & 8) >> 3);
+ obj_add_int(crt, "vmbu_failed", (smart->critical_warning & 0x10) >> 4);
+ obj_add_int(crt, "pmr_ro", (smart->critical_warning & 0x20) >> 5);
- obj_add_obj(r, "critical_warning", crt);
+ obj_add_obj(r, "critical_warning", crt);
+ } else {
+ obj_add_int(r, "critical_warning", smart->critical_warning);
+ }
obj_add_int(r, "temperature", temperature);
obj_add_int(r, "avail_spare", smart->avail_spare);
@@ -1313,8 +1322,24 @@ static void json_single_property_human(int offset, uint64_t value64, struct json
static void json_single_property(int offset, uint64_t value64)
{
struct json_object *r = json_create_object();
+ char json_str[STR_LEN];
+ uint32_t value32 = (uint32_t)value64;
+
+ if (human()) {
+ json_single_property_human(offset, value64, r);
+ } else {
+ sprintf(json_str, "0x%02x", offset);
+ obj_add_str(r, "property", json_str);
- json_single_property_human(offset, value64, r);
+ obj_add_str(r, "name", nvme_register_to_string(offset));
+
+ if (nvme_is_64bit_reg(offset))
+ sprintf(json_str, "%"PRIx64"", value64);
+ else
+ sprintf(json_str, "%x", value32);
+
+ obj_add_str(r, "value", json_str);
+ }
json_print(r);
}
@@ -2466,10 +2491,12 @@ static void json_print_nvme_subsystem_list(nvme_root_t r, bool show_ana)
obj_add_str(subsystem_attrs, "Name", nvme_subsystem_get_name(s));
obj_add_str(subsystem_attrs, "NQN", nvme_subsystem_get_nqn(s));
- obj_add_str(subsystem_attrs, "IOPolicy",
- nvme_subsystem_get_iopolicy(s));
- obj_add_str(subsystem_attrs, "Type",
- nvme_subsystem_get_type(s));
+ if (json_print_ops.flags & VERBOSE) {
+ obj_add_str(subsystem_attrs, "IOPolicy",
+ nvme_subsystem_get_iopolicy(s));
+ obj_add_str(subsystem_attrs, "Type",
+ nvme_subsystem_get_type(s));
+ }
array_add_obj(subsystems, subsystem_attrs);
paths = json_create_array();
@@ -2490,84 +2517,120 @@ static void json_ctrl_registers_cap(void *bar, struct json_object *r)
{
uint64_t cap = mmio_read64(bar + NVME_REG_CAP);
- json_registers_cap((struct nvme_bar_cap *)&cap, obj_create_array_obj(r, "cap"));
+ if (human())
+ json_registers_cap((struct nvme_bar_cap *)&cap, obj_create_array_obj(r, "cap"));
+ else
+ obj_add_uint64(r, "cap", cap);
}
static void json_ctrl_registers_vs(void *bar, struct json_object *r)
{
uint32_t vs = mmio_read32(bar + NVME_REG_VS);
- json_registers_version(vs, obj_create_array_obj(r, "vs"));
+ if (human())
+ json_registers_version(vs, obj_create_array_obj(r, "vs"));
+ else
+ obj_add_int(r, "vs", vs);
}
static void json_ctrl_registers_intms(void *bar, struct json_object *r)
{
uint32_t intms = mmio_read32(bar + NVME_REG_INTMS);
- json_registers_intms(intms, obj_create_array_obj(r, "intms"));
+ if (human())
+ json_registers_intms(intms, obj_create_array_obj(r, "intms"));
+ else
+ obj_add_int(r, "intms", intms);
}
static void json_ctrl_registers_intmc(void *bar, struct json_object *r)
{
uint32_t intmc = mmio_read32(bar + NVME_REG_INTMC);
- json_registers_intmc(intmc, obj_create_array_obj(r, "intmc"));
+ if (human())
+ json_registers_intmc(intmc, obj_create_array_obj(r, "intmc"));
+ else
+ obj_add_int(r, "intmc", intmc);
}
static void json_ctrl_registers_cc(void *bar, struct json_object *r)
{
uint32_t cc = mmio_read32(bar + NVME_REG_CC);
- json_registers_cc(cc, obj_create_array_obj(r, "cc"));
+ if (human())
+ json_registers_cc(cc, obj_create_array_obj(r, "cc"));
+ else
+ obj_add_int(r, "cc", cc);
}
static void json_ctrl_registers_csts(void *bar, struct json_object *r)
{
uint32_t csts = mmio_read32(bar + NVME_REG_CSTS);
- json_registers_csts(csts, obj_create_array_obj(r, "csts"));
+ if (human())
+ json_registers_csts(csts, obj_create_array_obj(r, "csts"));
+ else
+ obj_add_int(r, "csts", csts);
}
static void json_ctrl_registers_nssr(void *bar, struct json_object *r)
{
uint32_t nssr = mmio_read32(bar + NVME_REG_NSSR);
- json_registers_nssr(nssr, obj_create_array_obj(r, "nssr"));
+ if (human())
+ json_registers_nssr(nssr, obj_create_array_obj(r, "nssr"));
+ else
+ obj_add_int(r, "nssr", nssr);
}
static void json_ctrl_registers_nssd(void *bar, struct json_object *r)
{
uint32_t nssd = mmio_read32(bar + NVME_REG_NSSD);
- json_registers_nssd(nssd, obj_create_array_obj(r, "nssd"));
+ if (human())
+ json_registers_nssd(nssd, obj_create_array_obj(r, "nssd"));
+ else
+ obj_add_int(r, "nssd", nssd);
}
static void json_ctrl_registers_crto(void *bar, struct json_object *r)
{
uint32_t crto = mmio_read32(bar + NVME_REG_CRTO);
- json_registers_crto(crto, obj_create_array_obj(r, "crto"));
+ if (human())
+ json_registers_crto(crto, obj_create_array_obj(r, "crto"));
+ else
+ obj_add_int(r, "crto", crto);
}
static void json_ctrl_registers_aqa(void *bar, struct json_object *r)
{
uint32_t aqa = mmio_read32(bar + NVME_REG_AQA);
- json_registers_aqa(aqa, obj_create_array_obj(r, "aqa"));
+ if (human())
+ json_registers_aqa(aqa, obj_create_array_obj(r, "aqa"));
+ else
+ obj_add_int(r, "aqa", aqa);
}
static void json_ctrl_registers_asq(void *bar, struct json_object *r)
{
uint64_t asq = mmio_read64(bar + NVME_REG_ASQ);
- json_registers_asq(asq, obj_create_array_obj(r, "asq"));
+ if (human())
+ json_registers_asq(asq, obj_create_array_obj(r, "asq"));
+ else
+ obj_add_uint64(r, "asq", asq);
}
static void json_ctrl_registers_acq(void *bar, struct json_object *r)
{
uint64_t acq = mmio_read64(bar + NVME_REG_ACQ);
- json_registers_acq(acq, obj_create_array_obj(r, "acq"));
+ if (human())
+ json_registers_acq(acq, obj_create_array_obj(r, "acq"));
+ else
+ obj_add_uint64(r, "acq", acq);
}
static void json_ctrl_registers_cmbloc(void *bar, struct json_object *r)
@@ -2576,79 +2639,113 @@ static void json_ctrl_registers_cmbloc(void *bar, struct json_object *r)
uint32_t cmbsz;
bool support;
- cmbsz = mmio_read32(bar + NVME_REG_CMBSZ);
- support = nvme_registers_cmbloc_support(cmbsz);
- json_registers_cmbloc(cmbloc, support, obj_create_array_obj(r, "cmbloc"));
+ if (human()) {
+ cmbsz = mmio_read32(bar + NVME_REG_CMBSZ);
+ support = nvme_registers_cmbloc_support(cmbsz);
+ json_registers_cmbloc(cmbloc, support, obj_create_array_obj(r, "cmbloc"));
+ } else {
+ obj_add_int(r, "cmbloc", cmbloc);
+ }
}
static void json_ctrl_registers_cmbsz(void *bar, struct json_object *r)
{
uint32_t cmbsz = mmio_read32(bar + NVME_REG_CMBSZ);
- json_registers_cmbsz(cmbsz, obj_create_array_obj(r, "cmbsz"));
+ if (human())
+ json_registers_cmbsz(cmbsz, obj_create_array_obj(r, "cmbsz"));
+ else
+ obj_add_int(r, "cmbsz", cmbsz);
}
static void json_ctrl_registers_bpinfo(void *bar, struct json_object *r)
{
uint32_t bpinfo = mmio_read32(bar + NVME_REG_BPINFO);
- json_registers_bpinfo(bpinfo, obj_create_array_obj(r, "bpinfo"));
+ if (human())
+ json_registers_bpinfo(bpinfo, obj_create_array_obj(r, "bpinfo"));
+ else
+ obj_add_int(r, "bpinfo", bpinfo);
}
static void json_ctrl_registers_bprsel(void *bar, struct json_object *r)
{
uint32_t bprsel = mmio_read32(bar + NVME_REG_BPRSEL);
- json_registers_bprsel(bprsel, obj_create_array_obj(r, "bprsel"));
+ if (human())
+ json_registers_bprsel(bprsel, obj_create_array_obj(r, "bprsel"));
+ else
+ obj_add_int(r, "bprsel", bprsel);
}
static void json_ctrl_registers_bpmbl(void *bar, struct json_object *r)
{
uint64_t bpmbl = mmio_read64(bar + NVME_REG_BPMBL);
- json_registers_bpmbl(bpmbl, obj_create_array_obj(r, "bpmbl"));
+ if (human())
+ json_registers_bpmbl(bpmbl, obj_create_array_obj(r, "bpmbl"));
+ else
+ obj_add_uint64(r, "bpmbl", bpmbl);
}
static void json_ctrl_registers_cmbmsc(void *bar, struct json_object *r)
{
uint64_t cmbmsc = mmio_read64(bar + NVME_REG_CMBMSC);
- json_registers_cmbmsc(cmbmsc, obj_create_array_obj(r, "cmbmsc"));
+ if (human())
+ json_registers_cmbmsc(cmbmsc, obj_create_array_obj(r, "cmbmsc"));
+ else
+ obj_add_uint64(r, "cmbmsc", cmbmsc);
}
static void json_ctrl_registers_cmbsts(void *bar, struct json_object *r)
{
uint32_t cmbsts = mmio_read32(bar + NVME_REG_CMBSTS);
- json_registers_cmbsts(cmbsts, obj_create_array_obj(r, "cmbsts"));
+ if (human())
+ json_registers_cmbsts(cmbsts, obj_create_array_obj(r, "cmbsts"));
+ else
+ obj_add_int(r, "cmbsts", cmbsts);
}
static void json_ctrl_registers_cmbebs(void *bar, struct json_object *r)
{
uint32_t cmbebs = mmio_read32(bar + NVME_REG_CMBEBS);
- json_registers_cmbebs(cmbebs, obj_create_array_obj(r, "cmbebs"));
+ if (human())
+ json_registers_cmbebs(cmbebs, obj_create_array_obj(r, "cmbebs"));
+ else
+ obj_add_int(r, "cmbebs", cmbebs);
}
static void json_ctrl_registers_cmbswtp(void *bar, struct json_object *r)
{
uint32_t cmbswtp = mmio_read32(bar + NVME_REG_CMBSWTP);
- json_registers_cmbswtp(cmbswtp, obj_create_array_obj(r, "cmbswtp"));
+ if (human())
+ json_registers_cmbswtp(cmbswtp, obj_create_array_obj(r, "cmbswtp"));
+ else
+ obj_add_int(r, "cmbswtp", cmbswtp);
}
static void json_ctrl_registers_pmrcap(void *bar, struct json_object *r)
{
uint32_t pmrcap = mmio_read32(bar + NVME_REG_PMRCAP);
- json_registers_pmrcap(pmrcap, obj_create_array_obj(r, "pmrcap"));
+ if (human())
+ json_registers_pmrcap(pmrcap, obj_create_array_obj(r, "pmrcap"));
+ else
+ obj_add_int(r, "pmrcap", pmrcap);
}
static void json_ctrl_registers_pmrctl(void *bar, struct json_object *r)
{
uint32_t pmrctl = mmio_read32(bar + NVME_REG_PMRCTL);
- json_registers_pmrctl(pmrctl, obj_create_array_obj(r, "pmrctl"));
+ if (human())
+ json_registers_pmrctl(pmrctl, obj_create_array_obj(r, "pmrctl"));
+ else
+ obj_add_int(r, "pmrctl", pmrctl);
}
static void json_ctrl_registers_pmrsts(void *bar, struct json_object *r)
@@ -2657,37 +2754,53 @@ static void json_ctrl_registers_pmrsts(void *bar, struct json_object *r)
uint32_t pmrctl;
bool ready;
- pmrctl = mmio_read32(bar + NVME_REG_PMRCTL);
- ready = nvme_registers_pmrctl_ready(pmrctl);
- json_registers_pmrsts(pmrsts, ready, obj_create_array_obj(r, "pmrsts"));
+ if (human()) {
+ pmrctl = mmio_read32(bar + NVME_REG_PMRCTL);
+ ready = nvme_registers_pmrctl_ready(pmrctl);
+ json_registers_pmrsts(pmrsts, ready, obj_create_array_obj(r, "pmrsts"));
+ } else {
+ obj_add_int(r, "pmrsts", pmrsts);
+ }
}
static void json_ctrl_registers_pmrebs(void *bar, struct json_object *r)
{
uint32_t pmrebs = mmio_read32(bar + NVME_REG_PMREBS);
- json_registers_pmrebs(pmrebs, obj_create_array_obj(r, "pmrebs"));
+ if (human())
+ json_registers_pmrebs(pmrebs, obj_create_array_obj(r, "pmrebs"));
+ else
+ obj_add_int(r, "pmrebs", pmrebs);
}
static void json_ctrl_registers_pmrswtp(void *bar, struct json_object *r)
{
uint32_t pmrswtp = mmio_read32(bar + NVME_REG_PMRSWTP);
- json_registers_pmrswtp(pmrswtp, obj_create_array_obj(r, "pmrswtp"));
+ if (human())
+ json_registers_pmrswtp(pmrswtp, obj_create_array_obj(r, "pmrswtp"));
+ else
+ obj_add_int(r, "pmrswtp", pmrswtp);
}
static void json_ctrl_registers_pmrmscl(void *bar, struct json_object *r)
{
uint32_t pmrmscl = mmio_read32(bar + NVME_REG_PMRMSCL);
- json_registers_pmrmscl(pmrmscl, obj_create_array_obj(r, "pmrmscl"));
+ if (human())
+ json_registers_pmrmscl(pmrmscl, obj_create_array_obj(r, "pmrmscl"));
+ else
+ obj_add_uint(r, "pmrmscl", pmrmscl);
}
static void json_ctrl_registers_pmrmscu(void *bar, struct json_object *r)
{
uint32_t pmrmscu = mmio_read32(bar + NVME_REG_PMRMSCU);
- json_registers_pmrmscu(pmrmscu, obj_create_array_obj(r, "pmrmscu"));
+ if (human())
+ json_registers_pmrmscu(pmrmscu, obj_create_array_obj(r, "pmrmscu"));
+ else
+ obj_add_uint(r, "pmrmscu", pmrmscu);
}
static void json_ctrl_registers(void *bar, bool fabrics)
@@ -2829,14 +2942,20 @@ static void json_ctrl_register_human(int offset, uint64_t value, struct json_obj
static void json_ctrl_register(int offset, uint64_t value)
{
+ bool human = json_print_ops.flags & VERBOSE;
struct json_object *r;
char json_str[STR_LEN];
sprintf(json_str, "register: %#04x", offset);
r = obj_create(json_str);
- obj_add_uint64(r, nvme_register_to_string(offset), value);
- json_ctrl_register_human(offset, value, r);
+ if (human) {
+ obj_add_uint64(r, nvme_register_to_string(offset), value);
+ json_ctrl_register_human(offset, value, r);
+ } else {
+ obj_add_str(r, "name", nvme_register_symbol_to_string(offset));
+ obj_add_uint64(r, "value", value);
+ }
}
static void json_nvme_cmd_set_independent_id_ns(struct nvme_id_independent_id_ns *ns,
@@ -2956,9 +3075,14 @@ static void json_nvme_id_ctrl_nvm(struct nvme_id_ctrl_nvm *ctrl_nvm)
__u16 rsvd = (ctrl_nvm->aocs & 0xfffe) >> 1;
__u8 ralbas = ctrl_nvm->aocs & 0x1;
- if (rsvd)
- obj_add_uint(r, "[15:1]: Reserved", rsvd);
- obj_add_uint(r, "[0:0]: Reporting Allocated LBA Supported", ralbas);
+ if (json_print_ops.flags & VERBOSE) {
+ __u16 rsvd = (ctrl_nvm->aocs & 0xfffe) >> 1;
+ __u8 ralbas = ctrl_nvm->aocs & 0x1;
+
+ if (rsvd)
+ obj_add_uint(r, "[15:1]: Reserved", rsvd);
+ obj_add_uint(r, "[0:0]: Reporting Allocated LBA Supported", ralbas);
+ }
json_print(r);
}
@@ -4150,6 +4274,33 @@ static struct json_object *json_list_item_obj(nvme_ns_t n)
return r;
}
+static void json_simple_list(nvme_root_t t)
+{
+ struct json_object *r = json_create_object();
+ struct json_object *jdevices = json_create_array();
+
+ nvme_host_t h;
+ nvme_subsystem_t s;
+ nvme_ctrl_t c;
+ nvme_ns_t n;
+
+ nvme_for_each_host(t, h) {
+ nvme_for_each_subsystem(h, s) {
+ nvme_subsystem_for_each_ns(s, n)
+ array_add_obj(jdevices, json_list_item_obj(n));
+
+ nvme_subsystem_for_each_ctrl(s, c) {
+ nvme_ctrl_for_each_ns(c, n)
+ array_add_obj(jdevices, json_list_item_obj(n));
+ }
+ }
+ }
+
+ obj_add_array(r, "Devices", jdevices);
+
+ json_print(r);
+}
+
static void json_list_item(nvme_ns_t n)
{
struct json_object *r = json_list_item_obj(n);
@@ -4159,7 +4310,10 @@ static void json_list_item(nvme_ns_t n)
static void json_print_list_items(nvme_root_t t)
{
- json_detail_list(t);
+ if (json_print_ops.flags & VERBOSE)
+ json_detail_list(t);
+ else
+ json_simple_list(t);
}
static unsigned int json_subsystem_topology_multipath(nvme_subsystem_t s,
@@ -4253,10 +4407,12 @@ static void json_simple_topology(nvme_root_t r)
obj_add_str(subsystem_attrs, "Name", nvme_subsystem_get_name(s));
obj_add_str(subsystem_attrs, "NQN", nvme_subsystem_get_nqn(s));
- obj_add_str(subsystem_attrs, "IOPolicy",
- nvme_subsystem_get_iopolicy(s));
- obj_add_str(subsystem_attrs, "Type",
- nvme_subsystem_get_type(s));
+ if (json_print_ops.flags & VERBOSE) {
+ obj_add_str(subsystem_attrs, "IOPolicy",
+ nvme_subsystem_get_iopolicy(s));
+ obj_add_str(subsystem_attrs, "Type",
+ nvme_subsystem_get_type(s));
+ }
array_add_obj(subsystems, subsystem_attrs);
namespaces = json_create_array();
@@ -4371,6 +4527,7 @@ static void json_directive_show(__u8 type, __u8 oper, __u16 spec, __u32 nsid, __
void *buf, __u32 len)
{
struct json_object *r = json_create_object();
+ struct json_object *data;
char json_str[STR_LEN];
sprintf(json_str, "%#x", type);
@@ -4384,7 +4541,13 @@ static void json_directive_show(__u8 type, __u8 oper, __u16 spec, __u32 nsid, __
sprintf(json_str, "%#x", result);
obj_add_result(r, json_str);
- json_directive_show_fields(type, oper, result, buf, r);
+ if (json_print_ops.flags & VERBOSE) {
+ json_directive_show_fields(type, oper, result, buf, r);
+ } else if (buf) {
+ data = json_create_array();
+ d_json((unsigned char *)buf, len, 16, 1, data);
+ obj_add_array(r, "data", data);
+ }
json_print(r);
}

View File

@ -4,8 +4,8 @@
%global nmlibdir %{_prefix}/lib/NetworkManager
Name: nvme-cli
Version: 2.11
Release: 7%{?dist}
Version: 2.13
Release: 1%{?dist}
Summary: NVMe management command line interface
License: GPL-2.0-only
@ -13,25 +13,14 @@ URL: https://github.com/linux-nvme/nvme-cli
Source0: %{url}/archive/v%{version}/%{name}-%{version}.tar.gz
Source1: 99-nvme-nbft-connect.sh
Source2: 99-nvme-nbft-no-ignore-carrier.conf
Patch0: 0001-netapp-ontapdev-add-verbose-output.patch
Patch1: 0002-netapp-ontapdev-doc-add-verbose-details.patch
Patch2: 0003-netapp-ontapdev-fix-fw-version-handling.patch
Patch3: 0004-netapp-ontapdev-fix-JSON-output-for-nsze-nuse.patch
Patch4: 0005-nvme-netapp-update-err-messages.patch
Patch5: 0006-netapp-smdev-remove-redundant-code.patch
Patch6: 0007-netapp-smdev-add-verbose-output.patch
Patch7: 0008-netapp-smdev-doc-add-verbose-details.patch
Patch8: 0009-nvme-set-eds-to-true-if-controller-supports-128-bit-.patch
Patch9: 0010-udev-rules-ontap-switch-to-queue-depth-iopolicy.patch
Patch10: 0011-Revert-nvme-print-json-display-only-verbose-output.patch
BuildRequires: meson >= 0.50.0
BuildRequires: meson >= 0.53
BuildRequires: gcc gcc-c++
BuildRequires: libuuid-devel
BuildRequires: systemd-devel
BuildRequires: systemd-rpm-macros
BuildRequires: zlib-devel
BuildRequires: libnvme-devel >= 1.11-1
BuildRequires: libnvme-devel >= 1.13-1
BuildRequires: json-c-devel >= 0.14
BuildRequires: asciidoc
BuildRequires: xmlto
@ -108,11 +97,8 @@ if [ $1 -eq 1 ] || [ $1 -eq 2 ]; then
fi
%changelog
* Tue Oct 14 2025 Maurizio Lombardi <mlombard@redhat.com> - 2.11-7
- Fix for RHEL-121216
* Wed Jun 04 2025 Maurizio Lombardi <mlombard@redhat.com> - 2.11-6
- Fix for RHEL-95009
* Wed Apr 30 2025 Maurizio Lombardi <mlombard@redhat.com> - 2.13-1
- Update to version 2.13
* Thu Feb 13 2025 Maurizio Lombardi <mlombard@redhat.com> - 2.11-5
- Fix for RHEL-10433