From 78306bffd9bcbfb925cfcab2551d3f8bc52296d6 Mon Sep 17 00:00:00 2001 From: eabdullin Date: Thu, 4 Dec 2025 12:39:15 +0000 Subject: [PATCH] Import from AlmaLinux stable repository --- .gitignore | 2 +- .nvme-cli.metadata | 2 +- ...1-netapp-ontapdev-add-verbose-output.patch | 239 -------- ...app-ontapdev-doc-add-verbose-details.patch | 39 -- ...app-ontapdev-fix-fw-version-handling.patch | 52 -- ...tapdev-fix-JSON-output-for-nsze-nuse.patch | 42 -- ...0005-nvme-netapp-update-err-messages.patch | 53 -- ...6-netapp-smdev-remove-redundant-code.patch | 106 ---- ...0007-netapp-smdev-add-verbose-output.patch | 230 -------- ...netapp-smdev-doc-add-verbose-details.patch | 40 -- ...true-if-controller-supports-128-bit-.patch | 56 -- ...ontap-switch-to-queue-depth-iopolicy.patch | 28 - ...int-json-display-only-verbose-output.patch | 538 ------------------ SPECS/nvme-cli.spec | 26 +- 14 files changed, 8 insertions(+), 1445 deletions(-) delete mode 100644 SOURCES/0001-netapp-ontapdev-add-verbose-output.patch delete mode 100644 SOURCES/0002-netapp-ontapdev-doc-add-verbose-details.patch delete mode 100644 SOURCES/0003-netapp-ontapdev-fix-fw-version-handling.patch delete mode 100644 SOURCES/0004-netapp-ontapdev-fix-JSON-output-for-nsze-nuse.patch delete mode 100644 SOURCES/0005-nvme-netapp-update-err-messages.patch delete mode 100644 SOURCES/0006-netapp-smdev-remove-redundant-code.patch delete mode 100644 SOURCES/0007-netapp-smdev-add-verbose-output.patch delete mode 100644 SOURCES/0008-netapp-smdev-doc-add-verbose-details.patch delete mode 100644 SOURCES/0009-nvme-set-eds-to-true-if-controller-supports-128-bit-.patch delete mode 100644 SOURCES/0010-udev-rules-ontap-switch-to-queue-depth-iopolicy.patch delete mode 100644 SOURCES/0011-Revert-nvme-print-json-display-only-verbose-output.patch diff --git a/.gitignore b/.gitignore index c27ea17..300b261 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -SOURCES/nvme-cli-2.11.tar.gz +SOURCES/nvme-cli-2.13.tar.gz diff --git a/.nvme-cli.metadata b/.nvme-cli.metadata index b02127d..65bccfc 100644 --- a/.nvme-cli.metadata +++ b/.nvme-cli.metadata @@ -1 +1 @@ -e3a599bd67057c5bb9a8e7e621d439b9fbcaf7b6 SOURCES/nvme-cli-2.11.tar.gz +b5bb4ff66afbd7e51eadf7ceb99a088c8189c597 SOURCES/nvme-cli-2.13.tar.gz diff --git a/SOURCES/0001-netapp-ontapdev-add-verbose-output.patch b/SOURCES/0001-netapp-ontapdev-add-verbose-output.patch deleted file mode 100644 index 57236de..0000000 --- a/SOURCES/0001-netapp-ontapdev-add-verbose-output.patch +++ /dev/null @@ -1,239 +0,0 @@ -From ab841e9a58688e64c5ce50e6159f34fc1a414c48 Mon Sep 17 00:00:00 2001 -From: Martin George -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 ---- - 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 - diff --git a/SOURCES/0002-netapp-ontapdev-doc-add-verbose-details.patch b/SOURCES/0002-netapp-ontapdev-doc-add-verbose-details.patch deleted file mode 100644 index ff243e0..0000000 --- a/SOURCES/0002-netapp-ontapdev-doc-add-verbose-details.patch +++ /dev/null @@ -1,39 +0,0 @@ -From a8d1efcaba26dd992d89da2e60999642d7ae8eca Mon Sep 17 00:00:00 2001 -From: Martin George -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 ---- - 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= | -o ] -+'nvme netapp ontapdevices' [--output-format= | -o ] [--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 - diff --git a/SOURCES/0003-netapp-ontapdev-fix-fw-version-handling.patch b/SOURCES/0003-netapp-ontapdev-fix-fw-version-handling.patch deleted file mode 100644 index 0e9f3b5..0000000 --- a/SOURCES/0003-netapp-ontapdev-fix-fw-version-handling.patch +++ /dev/null @@ -1,52 +0,0 @@ -From 24961e9d228531f1cb60739239d7591aa70bdd53 Mon Sep 17 00:00:00 2001 -From: Martin George -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 ---- - 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 - diff --git a/SOURCES/0004-netapp-ontapdev-fix-JSON-output-for-nsze-nuse.patch b/SOURCES/0004-netapp-ontapdev-fix-JSON-output-for-nsze-nuse.patch deleted file mode 100644 index f120801..0000000 --- a/SOURCES/0004-netapp-ontapdev-fix-JSON-output-for-nsze-nuse.patch +++ /dev/null @@ -1,42 +0,0 @@ -From b5208a987bf85ae3f4e264e6df55a7fb9acd9907 Mon Sep 17 00:00:00 2001 -From: Martin George -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 ---- - 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 - diff --git a/SOURCES/0005-nvme-netapp-update-err-messages.patch b/SOURCES/0005-nvme-netapp-update-err-messages.patch deleted file mode 100644 index b227166..0000000 --- a/SOURCES/0005-nvme-netapp-update-err-messages.patch +++ /dev/null @@ -1,53 +0,0 @@ -From 6f1f902af071fc46b78485ce851ffaaeb444c25f Mon Sep 17 00:00:00 2001 -From: Martin George -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 ---- - 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 - diff --git a/SOURCES/0006-netapp-smdev-remove-redundant-code.patch b/SOURCES/0006-netapp-smdev-remove-redundant-code.patch deleted file mode 100644 index d0643b7..0000000 --- a/SOURCES/0006-netapp-smdev-remove-redundant-code.patch +++ /dev/null @@ -1,106 +0,0 @@ -From b8c9a3c1ee55c2477ce1ce0348014aa891dee58d Mon Sep 17 00:00:00 2001 -From: Martin George -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 ---- - 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 - diff --git a/SOURCES/0007-netapp-smdev-add-verbose-output.patch b/SOURCES/0007-netapp-smdev-add-verbose-output.patch deleted file mode 100644 index 5a7a5de..0000000 --- a/SOURCES/0007-netapp-smdev-add-verbose-output.patch +++ /dev/null @@ -1,230 +0,0 @@ -From 0943fc446609996dc6acf2fae7f31a6c20c28e06 Mon Sep 17 00:00:00 2001 -From: Martin George -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 -Tested-by: Clayton Skaggs ---- - 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 - diff --git a/SOURCES/0008-netapp-smdev-doc-add-verbose-details.patch b/SOURCES/0008-netapp-smdev-doc-add-verbose-details.patch deleted file mode 100644 index 650ab42..0000000 --- a/SOURCES/0008-netapp-smdev-doc-add-verbose-details.patch +++ /dev/null @@ -1,40 +0,0 @@ -From cd69ccb4d51b4c0b1f772f9fef42fbf441e4a7f2 Mon Sep 17 00:00:00 2001 -From: Martin George -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 -Tested-by: Clayton Skaggs ---- - 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= | -o ] -+'nvme netapp smdevices' [--output-format= | -o ] [--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 - diff --git a/SOURCES/0009-nvme-set-eds-to-true-if-controller-supports-128-bit-.patch b/SOURCES/0009-nvme-set-eds-to-true-if-controller-supports-128-bit-.patch deleted file mode 100644 index 940a675..0000000 --- a/SOURCES/0009-nvme-set-eds-to-true-if-controller-supports-128-bit-.patch +++ /dev/null @@ -1,56 +0,0 @@ -From 7057e6c50639fb05d0997eaa6fac48ece3cb38bc Mon Sep 17 00:00:00 2001 -From: Bryan Gurney -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 ---- - 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 - diff --git a/SOURCES/0010-udev-rules-ontap-switch-to-queue-depth-iopolicy.patch b/SOURCES/0010-udev-rules-ontap-switch-to-queue-depth-iopolicy.patch deleted file mode 100644 index 29d83e5..0000000 --- a/SOURCES/0010-udev-rules-ontap-switch-to-queue-depth-iopolicy.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 48263a3e9e26f8cf1941d6cff7f6afa48952ebf2 Mon Sep 17 00:00:00 2001 -From: Martin George -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 ---- - 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 - diff --git a/SOURCES/0011-Revert-nvme-print-json-display-only-verbose-output.patch b/SOURCES/0011-Revert-nvme-print-json-display-only-verbose-output.patch deleted file mode 100644 index f846d2c..0000000 --- a/SOURCES/0011-Revert-nvme-print-json-display-only-verbose-output.patch +++ /dev/null @@ -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); - } diff --git a/SPECS/nvme-cli.spec b/SPECS/nvme-cli.spec index e8358d7..0dfe419 100644 --- a/SPECS/nvme-cli.spec +++ b/SPECS/nvme-cli.spec @@ -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 - 2.11-7 -- Fix for RHEL-121216 - -* Wed Jun 04 2025 Maurizio Lombardi - 2.11-6 -- Fix for RHEL-95009 +* Wed Apr 30 2025 Maurizio Lombardi - 2.13-1 +- Update to version 2.13 * Thu Feb 13 2025 Maurizio Lombardi - 2.11-5 - Fix for RHEL-10433