Update to version v2.10.2

Resolves: RHEL-60536

Signed-off-by: Maurizio Lombardi <mlombard@redhat.com>
This commit is contained in:
Maurizio Lombardi 2024-10-07 18:42:46 +02:00
parent 7f9b53d524
commit 9aeed80d94
7 changed files with 8 additions and 765 deletions

1
.gitignore vendored
View File

@ -27,3 +27,4 @@
/nvme-cli-2.6.tar.gz
/nvme-cli-2.8.tar.gz
/nvme-cli-2.9.1.tar.gz
/nvme-cli-2.10.2.tar.gz

View File

@ -1,20 +0,0 @@
diff --git a/fabrics.c b/fabrics.c
index 871c20ede093..90c3e5d6c602 100644
--- a/fabrics.c
+++ b/fabrics.c
@@ -643,6 +643,7 @@ char *nvmf_hostid_from_hostnqn(const char *hostnqn)
void nvmf_check_hostid_and_hostnqn(const char *hostid, const char *hostnqn, unsigned int verbose)
{
+#if 0
_cleanup_free_ char *hostid_from_file = NULL;
_cleanup_free_ char *hostid_from_hostnqn = NULL;
@@ -665,6 +666,7 @@ void nvmf_check_hostid_and_hostnqn(const char *hostid, const char *hostnqn, unsi
fprintf(stderr,
"warning: use hostid which does not match uuid in hostnqn\n");
}
+#endif
}
int nvmf_discover(const char *desc, int argc, char **argv, bool connect)

View File

@ -1,76 +0,0 @@
From 42f788edccb954fe8b54c43809523e603c99f63c Mon Sep 17 00:00:00 2001
From: Maurizio Lombardi <mlombard@redhat.com>
Date: Wed, 22 May 2024 15:06:18 +0200
Subject: [PATCH] nvme: telemetry: report the correct error if the ioctl()
fails.
It's wrong to assume that if the ioctl() returns a non-zero number
then the errno variable is set.
The ioctl() might return an NVMe Status error to inform the caller
that the requested log page is not supported, in that case errno is left
untouched.
The original code didn't handle this case and returned "-errno" even when
the latter was zero. The caller interpreted this as a successful operation
and this might lead to improperly dereferencing the log page pointer.
$ nvme telemetry-log /dev/nvme0 --output-file=telemetry_log.bin
ERROR: get_telemetry_log: : write failed with error : Bad address
Fix this bug by returning the NVMe status if errno is zero:
$ nvme telemetry-log /dev/nvme0 --output-file=telemetry_log.bin
NVMe status: Invalid Log Page: The log page indicated is invalid(0x109)
Failed to acquire telemetry log 265!
Signed-off-by: Maurizio Lombardi <mlombard@redhat.com>
---
nvme.c | 18 ++++++++++++++----
1 file changed, 14 insertions(+), 4 deletions(-)
diff --git a/nvme.c b/nvme.c
index d722b91e5ed8..226413bc0eda 100644
--- a/nvme.c
+++ b/nvme.c
@@ -717,7 +717,10 @@ static int get_log_telemetry_ctrl(struct nvme_dev *dev, bool rae, size_t size,
err = nvme_cli_get_log_telemetry_ctrl(dev, rae, 0, size, log);
if (err) {
free(log);
- return -errno;
+ if (errno)
+ return -errno;
+ else
+ return err;
}
*buf = log;
@@ -737,7 +740,10 @@ static int get_log_telemetry_host(struct nvme_dev *dev, size_t size,
err = nvme_cli_get_log_telemetry_host(dev, 0, size, log);
if (err) {
free(log);
- return -errno;
+ if (errno)
+ return -errno;
+ else
+ return err;
}
*buf = log;
@@ -757,8 +763,12 @@ static int __create_telemetry_log_host(struct nvme_dev *dev,
return -ENOMEM;
err = nvme_cli_get_log_create_telemetry_host(dev, log);
- if (err)
- return -errno;
+ if (err) {
+ if (errno)
+ return -errno;
+ else
+ return err;
+ }
err = parse_telemetry_da(dev, da, log, size);
if (err)
--
2.43.0

View File

@ -1,63 +0,0 @@
From fac45ce03315479b0d30e71316e669d9d4ffb31c Mon Sep 17 00:00:00 2001
From: Greg Joyce <gjoyce@linux.ibm.com>
Date: Fri, 10 May 2024 14:23:11 -0500
Subject: [PATCH] sed: only re-read partition table after unlock.
The partition table was being re-read after both lock and
unlock operations. The re-read would fail with an error
message after a lock since the partition was no longer readable.
Signed-off-by: Greg Joyce <gjoyce@linux.ibm.com>
---
plugins/sed/sedopal_cmd.c | 27 ++++++++++++++-------------
1 file changed, 14 insertions(+), 13 deletions(-)
diff --git a/plugins/sed/sedopal_cmd.c b/plugins/sed/sedopal_cmd.c
index 21ebd360c219..221f62b15186 100644
--- a/plugins/sed/sedopal_cmd.c
+++ b/plugins/sed/sedopal_cmd.c
@@ -251,8 +251,21 @@ int sedopal_cmd_lock(int fd)
*/
int sedopal_cmd_unlock(int fd)
{
+ int rc;
+
+ rc = sedopal_lock_unlock(fd, OPAL_RW);
+
+ /*
+ * If the unlock was successful, force a re-read of the
+ * partition table. Return rc of unlock operation.
+ */
+ if (rc == 0) {
+ if (ioctl(fd, BLKRRPART, 0) != 0)
+ fprintf(stderr,
+ "Warning: failed re-reading partition\n");
+ }
- return sedopal_lock_unlock(fd, OPAL_RW);
+ return rc;
}
/*
@@ -275,18 +288,6 @@ int sedopal_lock_unlock(int fd, int lock_state)
if (rc != 0)
fprintf(stderr,
"Error: failed locking or unlocking - %d\n", rc);
-
- /*
- * If the unlock was successful, force a re-read of the
- * partition table.
- */
- if (rc == 0) {
- rc = ioctl(fd, BLKRRPART, 0);
- if (rc != 0)
- fprintf(stderr,
- "Error: failed re-reading partition\n");
- }
-
return rc;
}
--
2.43.0

View File

@ -1,596 +0,0 @@
From ca58ecc64852fc413a04f41d953914720d05459f Mon Sep 17 00:00:00 2001
From: Tomas Bzatek <tbzatek@redhat.com>
Date: Wed, 24 Apr 2024 17:46:19 +0200
Subject: [PATCH 1/5] fabrics: Make some symbols public
Needed for nbft, useful to have public.
Signed-off-by: Tomas Bzatek <tbzatek@redhat.com>
---
fabrics.c | 24 ++++++++++++------------
fabrics.h | 6 ++++++
2 files changed, 18 insertions(+), 12 deletions(-)
diff --git a/fabrics.c b/fabrics.c
index 0b70d290a9..a82a56c7b0 100644
--- a/fabrics.c
+++ b/fabrics.c
@@ -195,9 +195,9 @@ static nvme_ctrl_t __create_discover_ctrl(nvme_root_t r, nvme_host_t h,
return c;
}
-static nvme_ctrl_t create_discover_ctrl(nvme_root_t r, nvme_host_t h,
- struct nvme_fabrics_config *cfg,
- struct tr_config *trcfg)
+nvme_ctrl_t nvmf_create_discover_ctrl(nvme_root_t r, nvme_host_t h,
+ struct nvme_fabrics_config *cfg,
+ struct tr_config *trcfg)
{
_cleanup_free_ struct nvme_id_ctrl *id = NULL;
nvme_ctrl_t c;
@@ -378,8 +378,7 @@ static int __discover(nvme_ctrl_t c, struct nvme_fabrics_config *defcfg,
return 0;
}
-static char *get_default_trsvcid(const char *transport,
- bool discovery_ctrl)
+char *nvmf_get_default_trsvcid(const char *transport, bool discovery_ctrl)
{
if (!transport)
return NULL;
@@ -465,7 +464,7 @@ static int discover_from_conf_file(nvme_root_t r, nvme_host_t h,
goto next;
if (!trsvcid)
- trsvcid = get_default_trsvcid(transport, true);
+ trsvcid = nvmf_get_default_trsvcid(transport, true);
struct tr_config trcfg = {
.subsysnqn = subsysnqn,
@@ -485,7 +484,7 @@ static int discover_from_conf_file(nvme_root_t r, nvme_host_t h,
}
}
- c = create_discover_ctrl(r, h, &cfg, &trcfg);
+ c = nvmf_create_discover_ctrl(r, h, &cfg, &trcfg);
if (!c)
goto next;
@@ -549,7 +548,8 @@ static int discover_from_json_config_file(nvme_root_t r, nvme_host_t h,
trsvcid = nvme_ctrl_get_trsvcid(c);
if (!trsvcid || !strcmp(trsvcid, ""))
- trsvcid = get_default_trsvcid(transport, true);
+ trsvcid = nvmf_get_default_trsvcid(transport,
+ true);
if (force)
subsysnqn = nvme_ctrl_get_subsysnqn(c);
@@ -579,7 +579,7 @@ static int discover_from_json_config_file(nvme_root_t r, nvme_host_t h,
}
}
- cn = create_discover_ctrl(r, h, &cfg, &trcfg);
+ cn = nvmf_create_discover_ctrl(r, h, &cfg, &trcfg);
if (!cn)
continue;
@@ -806,7 +806,7 @@ int nvmf_discover(const char *desc, int argc, char **argv, bool connect)
}
if (!trsvcid)
- trsvcid = get_default_trsvcid(transport, true);
+ trsvcid = nvmf_get_default_trsvcid(transport, true);
struct tr_config trcfg = {
.subsysnqn = subsysnqn,
@@ -876,7 +876,7 @@ int nvmf_discover(const char *desc, int argc, char **argv, bool connect)
}
if (!c) {
/* No device or non-matching device, create a new controller */
- c = create_discover_ctrl(r, h, &cfg, &trcfg);
+ c = nvmf_create_discover_ctrl(r, h, &cfg, &trcfg);
if (!c) {
if (errno != ENVME_CONNECT_IGNORED)
fprintf(stderr,
@@ -1005,7 +1005,7 @@ int nvmf_connect(const char *desc, int argc, char **argv)
if (hostkey)
nvme_host_set_dhchap_key(h, hostkey);
if (!trsvcid)
- trsvcid = get_default_trsvcid(transport, false);
+ trsvcid = nvmf_get_default_trsvcid(transport, false);
struct tr_config trcfg = {
.subsysnqn = subsysnqn,
diff --git a/fabrics.h b/fabrics.h
index c16df60472..aec305dc31 100644
--- a/fabrics.h
+++ b/fabrics.h
@@ -18,5 +18,11 @@ extern int nvmf_disconnect(const char *desc, int argc, char **argv);
extern int nvmf_disconnect_all(const char *desc, int argc, char **argv);
extern int nvmf_config(const char *desc, int argc, char **argv);
extern int nvmf_dim(const char *desc, int argc, char **argv);
+extern nvme_ctrl_t nvmf_create_discover_ctrl(nvme_root_t r, nvme_host_t h,
+ struct nvme_fabrics_config *cfg,
+ struct tr_config *trcfg);
+extern char *nvmf_get_default_trsvcid(const char *transport,
+ bool discovery_ctrl);
+
#endif
From 996fd5554157949ed77154eecd0f8236590cc716 Mon Sep 17 00:00:00 2001
From: Tomas Bzatek <tbzatek@redhat.com>
Date: Wed, 24 Apr 2024 17:47:02 +0200
Subject: [PATCH 2/5] util/cleanup: Add cleanup for struct nvme_fabrics_uri
libnvme cleanup definitions are not part of public API.
Signed-off-by: Tomas Bzatek <tbzatek@redhat.com>
---
util/cleanup.h | 8 ++++++++
1 file changed, 8 insertions(+)
diff -up nvme-cli-2.9.1/util/cleanup.h.bak nvme-cli-2.9.1/util/cleanup.h
--- nvme-cli-2.9.1/util/cleanup.h.bak 2024-06-21 15:53:35.839852234 +0200
+++ nvme-cli-2.9.1/util/cleanup.h 2024-05-03 16:03:42.000000000 +0200
@@ -34,4 +34,12 @@ static inline void close_file(int *f)
}
#define _cleanup_file_ __cleanup__(close_file)
+static inline void free_uri(struct nvme_fabrics_uri **uri)
+{
+ if (*uri)
+ nvme_free_uri(*uri);
+}
+
+#define _cleanup_uri_ __cleanup__(free_uri)
+
#endif
From 2f79015b83faff4947d29fb172d6f92d81f078e2 Mon Sep 17 00:00:00 2001
From: Tomas Bzatek <tbzatek@redhat.com>
Date: Wed, 24 Apr 2024 17:52:46 +0200
Subject: [PATCH 3/5] nbft: Perform actual discovery
This adds actual discovery support for Discovery Descriptor records.
SSNS records are connected first. Discovery Descriptor records
are checked for any existing (back-)reference from SSNS records
and are skipped if so. It is assumed in such case that the pre-OS
driver has succeeded in discovery and filled SSNS records
accordingly.
In case no SSNS record references the particular Discovery
record, an actual discovery is performed.
Signed-off-by: Tomas Bzatek <tbzatek@redhat.com>
---
nbft.c | 232 ++++++++++++++++++++++++++++++++++++++++++++++++++++++---
nbft.h | 2 +-
2 files changed, 223 insertions(+), 11 deletions(-)
diff --git a/nbft.c b/nbft.c
index 7ff8765a80..995b31ca54 100644
--- a/nbft.c
+++ b/nbft.c
@@ -7,6 +7,7 @@
#include <libnvme.h>
+#include "common.h"
#include "nvme.h"
#include "nbft.h"
#include "fabrics.h"
@@ -77,12 +78,38 @@ void free_nbfts(struct list_head *nbft_list)
}
}
+static bool validate_uri(struct nbft_info_discovery *dd,
+ struct nvme_fabrics_uri *uri)
+{
+ if (!uri) {
+ fprintf(stderr,
+ "Discovery Descriptor %d: failed to parse URI %s\n",
+ dd->index, dd->uri);
+ return false;
+ }
+ if (strcmp(uri->scheme, "nvme") != 0) {
+ fprintf(stderr,
+ "Discovery Descriptor %d: unsupported scheme '%s'\n",
+ dd->index, uri->scheme);
+ return false;
+ }
+ if (!uri->protocol || strcmp(uri->protocol, "tcp") != 0) {
+ fprintf(stderr,
+ "Discovery Descriptor %d: unsupported transport '%s'\n",
+ dd->index, uri->protocol);
+ return false;
+ }
+
+ return true;
+}
+
/* returns 0 for success or negative errno otherwise */
static int do_connect(nvme_root_t r,
nvme_host_t h,
+ struct nvmf_disc_log_entry *e,
struct nbft_info_subsystem_ns *ss,
struct tr_config *trcfg,
- const struct nvme_fabrics_config *cfg,
+ struct nvme_fabrics_config *cfg,
enum nvme_print_flags flags,
unsigned int verbose)
{
@@ -111,6 +138,12 @@ static int do_connect(nvme_root_t r,
nvme_init_logging(r, -1, false, false);
}
+ if (e) {
+ if (e->trtype == NVMF_TRTYPE_TCP &&
+ e->tsas.tcp.sectype != NVMF_TCP_SECTYPE_NONE)
+ cfg->tls = true;
+ }
+
errno = 0;
ret = nvmf_add_ctrl(h, c, cfg);
@@ -145,10 +178,114 @@ static int do_connect(nvme_root_t r,
return 0;
}
+static int do_discover(struct nbft_info_discovery *dd,
+ nvme_root_t r,
+ nvme_host_t h,
+ nvme_ctrl_t c,
+ struct nvme_fabrics_config *defcfg,
+ struct tr_config *deftrcfg,
+ enum nvme_print_flags flags,
+ unsigned int verbose)
+{
+ struct nvmf_discovery_log *log = NULL;
+ int i;
+ int ret;
+
+ struct nvme_get_discovery_args args = {
+ .c = c,
+ .args_size = sizeof(args),
+ .max_retries = 10 /* MAX_DISC_RETRIES */,
+ .result = 0,
+ .timeout = NVME_DEFAULT_IOCTL_TIMEOUT,
+ .lsp = 0,
+ };
+
+ log = nvmf_get_discovery_wargs(&args);
+ if (!log) {
+ fprintf(stderr,
+ "Discovery Descriptor %d: failed to get discovery log: %s\n",
+ dd->index, nvme_strerror(errno));
+ return -errno;
+ }
+
+ for (i = 0; i < le64_to_cpu(log->numrec); i++) {
+ struct nvmf_disc_log_entry *e = &log->entries[i];
+ nvme_ctrl_t cl;
+ int tmo = defcfg->keep_alive_tmo;
+
+ struct tr_config trcfg = {
+ .subsysnqn = e->subnqn,
+ .transport = nvmf_trtype_str(e->trtype),
+ .traddr = e->traddr,
+ .host_traddr = deftrcfg->host_traddr,
+ .host_iface = deftrcfg->host_iface,
+ .trsvcid = e->trsvcid,
+ };
+
+ if (e->subtype == NVME_NQN_CURR)
+ continue;
+
+ /* Already connected ? */
+ cl = lookup_ctrl(h, &trcfg);
+ if (cl && nvme_ctrl_get_name(cl))
+ continue;
+
+ /* Skip connect if the transport types don't match */
+ if (strcmp(nvme_ctrl_get_transport(c),
+ nvmf_trtype_str(e->trtype)))
+ continue;
+
+ if (e->subtype == NVME_NQN_DISC) {
+ nvme_ctrl_t child;
+
+ child = nvmf_connect_disc_entry(h, e, defcfg, NULL);
+ do_discover(dd, r, h, child, defcfg, &trcfg,
+ flags, verbose);
+ nvme_disconnect_ctrl(child);
+ nvme_free_ctrl(child);
+ } else {
+ ret = do_connect(r, h, e, NULL, &trcfg,
+ defcfg, flags, verbose);
+
+ /*
+ * With TCP/DHCP, it can happen that the OS
+ * obtains a different local IP address than the
+ * firmware had. Retry without host_traddr.
+ */
+ if (ret == -ENVME_CONNECT_ADDRNOTAVAIL &&
+ !strcmp(trcfg.transport, "tcp") &&
+ strlen(dd->hfi->tcp_info.dhcp_server_ipaddr) > 0) {
+ const char *htradr = trcfg.host_traddr;
+
+ trcfg.host_traddr = NULL;
+ ret = do_connect(r, h, e, NULL, &trcfg,
+ defcfg, flags, verbose);
+
+ if (ret == 0 && verbose >= 1)
+ fprintf(stderr,
+ "Discovery Descriptor %d: connect with host_traddr=\"%s\" failed, success after omitting host_traddr\n",
+ dd->index,
+ htradr);
+ }
+
+ if (ret)
+ fprintf(stderr, "Discovery Descriptor %d: no controller found\n",
+ dd->index);
+ if (ret == -ENOMEM)
+ break;
+ }
+
+ defcfg->keep_alive_tmo = tmo;
+ }
+
+ free(log);
+ return 0;
+}
+
int discover_from_nbft(nvme_root_t r, char *hostnqn_arg, char *hostid_arg,
char *hostnqn_sys, char *hostid_sys,
const char *desc, bool connect,
- const struct nvme_fabrics_config *cfg, char *nbft_path,
+ struct nvme_fabrics_config *cfg, char *nbft_path,
enum nvme_print_flags flags, unsigned int verbose)
{
char *hostnqn = NULL, *hostid = NULL, *host_traddr = NULL;
@@ -158,6 +295,7 @@ int discover_from_nbft(nvme_root_t r, char *hostnqn_arg, char *hostid_arg,
struct nbft_file_entry *entry = NULL;
struct nbft_info_subsystem_ns **ss;
struct nbft_info_hfi *hfi;
+ struct nbft_info_discovery **dd;
if (!connect)
/* to do: print discovery-type info from NBFT tables */
@@ -192,15 +330,15 @@ int discover_from_nbft(nvme_root_t r, char *hostnqn_arg, char *hostid_arg,
if (!h)
goto out_free;
+ /* Subsystem Namespace Descriptor List */
for (ss = entry->nbft->subsystem_ns_list; ss && *ss; ss++)
for (i = 0; i < (*ss)->num_hfis; i++) {
hfi = (*ss)->hfis[i];
- if (!cfg->host_traddr) {
- host_traddr = NULL;
- if (!strncmp((*ss)->transport, "tcp", 3))
- host_traddr = hfi->tcp_info.ipaddr;
- }
+ host_traddr = NULL;
+ if (!cfg->host_traddr &&
+ !strncmp((*ss)->transport, "tcp", 3))
+ host_traddr = hfi->tcp_info.ipaddr;
struct tr_config trcfg = {
.subsysnqn = (*ss)->subsys_nqn,
@@ -211,7 +349,7 @@ int discover_from_nbft(nvme_root_t r, char *hostnqn_arg, char *hostid_arg,
.trsvcid = (*ss)->trsvcid,
};
- ret = do_connect(r, h, *ss, &trcfg,
+ ret = do_connect(r, h, NULL, *ss, &trcfg,
cfg, flags, verbose);
/*
@@ -220,11 +358,11 @@ int discover_from_nbft(nvme_root_t r, char *hostnqn_arg, char *hostid_arg,
* firmware had. Retry without host_traddr.
*/
if (ret == -ENVME_CONNECT_ADDRNOTAVAIL &&
- !strcmp((*ss)->transport, "tcp") &&
+ !strcmp(trcfg.transport, "tcp") &&
strlen(hfi->tcp_info.dhcp_server_ipaddr) > 0) {
trcfg.host_traddr = NULL;
- ret = do_connect(r, h, *ss, &trcfg,
+ ret = do_connect(r, h, NULL, *ss, &trcfg,
cfg, flags, verbose);
if (ret == 0 && verbose >= 1)
@@ -241,6 +379,80 @@ int discover_from_nbft(nvme_root_t r, char *hostnqn_arg, char *hostid_arg,
if (ret == -ENOMEM)
goto out_free;
}
+
+ /* Discovery Descriptor List */
+ for (dd = entry->nbft->discovery_list; dd && *dd; dd++) {
+ nvme_ctrl_t c;
+ bool linked = false;
+ _cleanup_uri_ struct nvme_fabrics_uri *uri = NULL;
+ _cleanup_free_ char *trsvcid = NULL;
+
+ /* only perform discovery when no SSNS record references it */
+ for (ss = entry->nbft->subsystem_ns_list; ss && *ss; ss++)
+ if ((*ss)->discovery &&
+ (*ss)->discovery->index == (*dd)->index &&
+ /* unavailable boot attempts are not discovered
+ * and may get transferred along with a well-known
+ * discovery NQN into an SSNS record.
+ */
+ strcmp((*ss)->subsys_nqn, NVME_DISC_SUBSYS_NAME) != 0) {
+ linked = true;
+ break;
+ }
+ if (linked)
+ continue;
+
+ hfi = (*dd)->hfi;
+ uri = nvme_parse_uri((*dd)->uri);
+ if (!validate_uri(*dd, uri))
+ continue;
+
+ host_traddr = NULL;
+ if (!cfg->host_traddr &&
+ !strncmp(uri->protocol, "tcp", 3))
+ host_traddr = hfi->tcp_info.ipaddr;
+ if (uri->port > 0) {
+ if (asprintf(&trsvcid, "%d", uri->port) < 0) {
+ errno = ENOMEM;
+ goto out_free;
+ }
+ } else
+ trsvcid = strdup(nvmf_get_default_trsvcid(uri->protocol, true));
+
+ struct tr_config trcfg = {
+ .subsysnqn = NVME_DISC_SUBSYS_NAME,
+ .transport = uri->protocol,
+ .traddr = uri->host,
+ .host_traddr = host_traddr,
+ .host_iface = NULL,
+ .trsvcid = trsvcid,
+ };
+
+ c = nvmf_create_discover_ctrl(r, h, cfg, &trcfg);
+ if (!c && errno == ENVME_CONNECT_ADDRNOTAVAIL &&
+ !strcmp(trcfg.transport, "tcp") &&
+ strlen(hfi->tcp_info.dhcp_server_ipaddr) > 0) {
+ trcfg.host_traddr = NULL;
+ c = nvmf_create_discover_ctrl(r, h, cfg, &trcfg);
+ }
+
+ if (!c) {
+ fprintf(stderr,
+ "Discovery Descriptor %d: failed to add discovery controller: %s\n",
+ (*dd)->index,
+ nvme_strerror(errno));
+ if (errno == ENOMEM)
+ goto out_free;
+ continue;
+ }
+
+ ret = do_discover(*dd, r, h, c, cfg, &trcfg,
+ flags, verbose);
+ nvme_disconnect_ctrl(c);
+ nvme_free_ctrl(c);
+ if (ret == -ENOMEM)
+ goto out_free;
+ }
}
out_free:
free_nbfts(&nbft_list);
diff --git a/nbft.h b/nbft.h
index 0f7e33cee5..5dfb8704fd 100644
--- a/nbft.h
+++ b/nbft.h
@@ -15,5 +15,5 @@ void free_nbfts(struct list_head *nbft_list);
extern int discover_from_nbft(nvme_root_t r, char *hostnqn_arg, char *hostid_arg,
char *hostnqn_sys, char *hostid_sys,
const char *desc, bool connect,
- const struct nvme_fabrics_config *cfg, char *nbft_path,
+ struct nvme_fabrics_config *cfg, char *nbft_path,
enum nvme_print_flags flags, unsigned int verbose);
From 1074da1dbbbef229bf7e42a3cb644ab5b9745267 Mon Sep 17 00:00:00 2001
From: Tomas Bzatek <tbzatek@redhat.com>
Date: Thu, 25 Apr 2024 15:54:53 +0200
Subject: [PATCH 4/5] nbft: Skip SSNS records pointing to well-known discovery
NQN
Depending on a pre-OS implementation, boot attempts pointing
to the well-known discovery NQN may get transformed in
an SSNS record (and marked as 'unavailable') in case
the discovery cannot be performed. Otherwise the NBFT
table should be populated by discovered records instead.
Signed-off-by: Tomas Bzatek <tbzatek@redhat.com>
---
nbft.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/nbft.c b/nbft.c
index 995b31ca54..9d1834d0db 100644
--- a/nbft.c
+++ b/nbft.c
@@ -335,6 +335,15 @@ int discover_from_nbft(nvme_root_t r, char *hostnqn_arg, char *hostid_arg,
for (i = 0; i < (*ss)->num_hfis; i++) {
hfi = (*ss)->hfis[i];
+ /* Skip discovery NQN records */
+ if (strcmp((*ss)->subsys_nqn, NVME_DISC_SUBSYS_NAME) == 0) {
+ if (verbose >= 1)
+ fprintf(stderr,
+ "SSNS %d points to well-known discovery NQN, skipping\n",
+ (*ss)->index);
+ continue;
+ }
+
host_traddr = NULL;
if (!cfg->host_traddr &&
!strncmp((*ss)->transport, "tcp", 3))
From 8b4c30014ed17fa226a34a3dd92167f122ccec42 Mon Sep 17 00:00:00 2001
From: Tomas Bzatek <tbzatek@redhat.com>
Date: Mon, 20 May 2024 17:43:01 +0200
Subject: [PATCH 5/5] nbft: Reuse existing discovery controller
Attempt to look up and use existing (persistent) discovery
controller.
Signed-off-by: Tomas Bzatek <tbzatek@redhat.com>
---
nbft.c | 21 +++++++++++++++------
1 file changed, 15 insertions(+), 6 deletions(-)
diff --git a/nbft.c b/nbft.c
index 9d1834d0db..8c03a1f53b 100644
--- a/nbft.c
+++ b/nbft.c
@@ -393,6 +393,7 @@ int discover_from_nbft(nvme_root_t r, char *hostnqn_arg, char *hostid_arg,
for (dd = entry->nbft->discovery_list; dd && *dd; dd++) {
nvme_ctrl_t c;
bool linked = false;
+ bool persistent = false;
_cleanup_uri_ struct nvme_fabrics_uri *uri = NULL;
_cleanup_free_ char *trsvcid = NULL;
@@ -437,12 +438,19 @@ int discover_from_nbft(nvme_root_t r, char *hostnqn_arg, char *hostid_arg,
.trsvcid = trsvcid,
};
- c = nvmf_create_discover_ctrl(r, h, cfg, &trcfg);
- if (!c && errno == ENVME_CONNECT_ADDRNOTAVAIL &&
- !strcmp(trcfg.transport, "tcp") &&
- strlen(hfi->tcp_info.dhcp_server_ipaddr) > 0) {
- trcfg.host_traddr = NULL;
+ /* Lookup existing discovery controller */
+ c = lookup_ctrl(h, &trcfg);
+ if (c && nvme_ctrl_get_name(c))
+ persistent = true;
+
+ if (!c) {
c = nvmf_create_discover_ctrl(r, h, cfg, &trcfg);
+ if (!c && errno == ENVME_CONNECT_ADDRNOTAVAIL &&
+ !strcmp(trcfg.transport, "tcp") &&
+ strlen(hfi->tcp_info.dhcp_server_ipaddr) > 0) {
+ trcfg.host_traddr = NULL;
+ c = nvmf_create_discover_ctrl(r, h, cfg, &trcfg);
+ }
}
if (!c) {
@@ -457,7 +465,8 @@ int discover_from_nbft(nvme_root_t r, char *hostnqn_arg, char *hostid_arg,
ret = do_discover(*dd, r, h, c, cfg, &trcfg,
flags, verbose);
- nvme_disconnect_ctrl(c);
+ if (!persistent)
+ nvme_disconnect_ctrl(c);
nvme_free_ctrl(c);
if (ret == -ENOMEM)
goto out_free;

View File

@ -4,8 +4,8 @@
%global nmlibdir %{_prefix}/lib/NetworkManager
Name: nvme-cli
Version: 2.9.1
Release: 6%{?dist}
Version: 2.10.2
Release: 1%{?dist}
Summary: NVMe management command line interface
License: GPL-2.0-only
@ -14,19 +14,13 @@ 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-Revert-fabrics-Use-corresponding-hostid-when-hostnqn.patch
Patch1: 0002-nvme-telemetry-report-the-correct-error-if-the-ioctl.patch
# https://issues.redhat.com/browse/RHEL-37601
Patch2: nvme-cli-2.10-nbft-discovery.patch
Patch3: 0003-sed-only-re-read-partition-table-after-unlock.patch
BuildRequires: meson >= 0.50.0
BuildRequires: gcc gcc-c++
BuildRequires: libuuid-devel
BuildRequires: systemd-devel
BuildRequires: systemd-rpm-macros
BuildRequires: zlib-devel
BuildRequires: libnvme-devel >= 1.9-2
BuildRequires: libnvme-devel >= 1.10-1
BuildRequires: json-c-devel >= 0.14
BuildRequires: asciidoc
BuildRequires: xmlto
@ -101,6 +95,9 @@ if [ $1 -eq 1 ] || [ $1 -eq 2 ]; then
fi
%changelog
* Mon Oct 07 2024 Maurizio Lombardi <mlombard@redhat.com> - 2.10.2-1
- Update to version 2.10.2 RHEL-60536
* Thu Aug 22 2024 Tomas Bzatek <tbzatek@redhat.com> - 2.9.1-6
- Install NetworkManager override for nbft interfaces
- Rename reconnect NetworkManager hook to 99-nvme-nbft-connect.sh

View File

@ -1 +1 @@
SHA512 (nvme-cli-2.9.1.tar.gz) = c9c86e7567c2d4c59aff1eb9d18f4775923db3c81a89c628b819121c32150d4bc2d65d0dacac764c64594369890b380d0fd06bc7c1f83f4a7f3e71a51a6fee24
SHA512 (nvme-cli-2.10.2.tar.gz) = 98ecb2488cdf21c83004204f4cb7e7d9327fef5a33e5a37d977c659d76be3cef861473676fa7fbd1d40f38742b365b98431e17d9b0318ddb4cc407953acdde87