commit
b42b571ed5
@ -0,0 +1 @@
|
|||||||
|
SOURCES/nvme-cli-2.9.1.tar.gz
|
@ -0,0 +1 @@
|
|||||||
|
33eaae0a2334451553952ac701f8568a52fd2a98 SOURCES/nvme-cli-2.9.1.tar.gz
|
@ -0,0 +1,19 @@
|
|||||||
|
diff -up nvme-cli-2.9.1/fabrics.c.bak nvme-cli-2.9.1/fabrics.c
|
||||||
|
--- nvme-cli-2.9.1/fabrics.c.bak 2024-05-03 16:03:42.000000000 +0200
|
||||||
|
+++ nvme-cli-2.9.1/fabrics.c 2024-05-03 18:26:34.915157152 +0200
|
||||||
|
@@ -643,6 +643,7 @@ char *nvmf_hostid_from_hostnqn(const cha
|
||||||
|
|
||||||
|
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
|
||||||
|
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)
|
@ -0,0 +1,5 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [[ "$1" == nbft* ]] && [[ "$2" == "up" ]]; then
|
||||||
|
systemctl start nvmf-connect-nbft.service
|
||||||
|
fi
|
@ -0,0 +1,15 @@
|
|||||||
|
# Boot from NVMe over TCP (NBFT)
|
||||||
|
#
|
||||||
|
# For NVMe/TCP connections that provide namespaces containing rootfs
|
||||||
|
# it is crucial to react on carrier events and reconnect any missing
|
||||||
|
# NVMe/TCP connections as defined in the ACPI NBFT table. A custom
|
||||||
|
# /usr/lib/NetworkManager/dispatcher.d/99-nvme-nbft-connect.sh hook
|
||||||
|
# will respawn nvmf-connect-nbft.service on such occasion.
|
||||||
|
|
||||||
|
[device-nbft-no-ignore-carrier]
|
||||||
|
|
||||||
|
# only affects nbft0, nbft1, ... interfaces
|
||||||
|
match-device=interface-name:nbft*
|
||||||
|
|
||||||
|
# react on link up/down events
|
||||||
|
ignore-carrier=no
|
@ -0,0 +1,13 @@
|
|||||||
|
diff --git a/util/cleanup.h b/util/cleanup.h
|
||||||
|
index fbc661f..30ceddd 100644
|
||||||
|
--- a/util/cleanup.h
|
||||||
|
+++ b/util/cleanup.h
|
||||||
|
@@ -5,6 +5,8 @@
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
+#include <libnvme.h>
|
||||||
|
+
|
||||||
|
#include "util/mem.h"
|
||||||
|
|
||||||
|
#define __cleanup__(fn) __attribute__((cleanup(fn)))
|
@ -0,0 +1,596 @@
|
|||||||
|
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;
|
@ -0,0 +1,302 @@
|
|||||||
|
# RHEL 8 compatibility
|
||||||
|
%{!?version_no_tilde: %define version_no_tilde %{shrink:%(echo '%{version}' | tr '~' '-')}}
|
||||||
|
|
||||||
|
%global nmlibdir %{_prefix}/lib/NetworkManager
|
||||||
|
|
||||||
|
Name: nvme-cli
|
||||||
|
Version: 2.9.1
|
||||||
|
Release: 4%{?dist}
|
||||||
|
Summary: NVMe management command line interface
|
||||||
|
|
||||||
|
License: GPL-2.0-only
|
||||||
|
URL: https://github.com/linux-nvme/nvme-cli
|
||||||
|
Source0: %{url}/archive/v%{version_no_tilde}/%{name}-%{version_no_tilde}.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: nvme-cli-2.10-nbft-discovery.patch
|
||||||
|
Patch2: add-missing-include.patch
|
||||||
|
|
||||||
|
BuildRequires: meson >= 0.50.0
|
||||||
|
BuildRequires: gcc gcc-c++
|
||||||
|
BuildRequires: systemd-devel
|
||||||
|
BuildRequires: systemd-rpm-macros
|
||||||
|
BuildRequires: zlib-devel
|
||||||
|
BuildRequires: openssl-devel
|
||||||
|
%if (0%{?rhel} == 0) || (0%{?rhel} > 9)
|
||||||
|
BuildRequires: kernel-headers
|
||||||
|
%endif
|
||||||
|
|
||||||
|
BuildRequires: libnvme-devel >= 1.9-4
|
||||||
|
BuildRequires: json-c-devel >= 0.13
|
||||||
|
|
||||||
|
BuildRequires: asciidoc
|
||||||
|
BuildRequires: xmlto
|
||||||
|
|
||||||
|
Requires: util-linux
|
||||||
|
|
||||||
|
|
||||||
|
%description
|
||||||
|
nvme-cli provides NVM-Express user space tooling for Linux.
|
||||||
|
|
||||||
|
%prep
|
||||||
|
%autosetup -p1 -n %{name}-%{version_no_tilde}
|
||||||
|
|
||||||
|
|
||||||
|
%build
|
||||||
|
%meson -Dudevrulesdir=%{_udevrulesdir} -Dsystemddir=%{_unitdir} -Dpdc-enabled=true -Ddocs=all -Ddocs-build=true -Dhtmldir=%{_pkgdocdir}
|
||||||
|
%meson_build
|
||||||
|
|
||||||
|
|
||||||
|
%install
|
||||||
|
%meson_install
|
||||||
|
%{__install} -pm 644 README.md %{buildroot}%{_pkgdocdir}
|
||||||
|
mkdir -p $RPM_BUILD_ROOT%{nmlibdir}/dispatcher.d
|
||||||
|
mkdir -p $RPM_BUILD_ROOT%{nmlibdir}/conf.d
|
||||||
|
%{__install} -pm 755 %{SOURCE1} $RPM_BUILD_ROOT%{nmlibdir}/dispatcher.d/
|
||||||
|
%{__install} -pm 644 %{SOURCE2} $RPM_BUILD_ROOT%{nmlibdir}/conf.d/
|
||||||
|
|
||||||
|
# Do not install the dracut rule yet. See rhbz 1742764
|
||||||
|
rm -f %{buildroot}/usr/lib/dracut/dracut.conf.d/70-nvmf-autoconnect.conf
|
||||||
|
|
||||||
|
# Move html docs into the right place
|
||||||
|
mv %{buildroot}%{_pkgdocdir}/nvme %{buildroot}%{_pkgdocdir}/html
|
||||||
|
rm -rf %{buildroot}%{_pkgdocdir}/nvme
|
||||||
|
|
||||||
|
|
||||||
|
%files
|
||||||
|
%license LICENSE
|
||||||
|
%doc %{_pkgdocdir}
|
||||||
|
%{_sbindir}/nvme
|
||||||
|
%{_mandir}/man1/nvme*.gz
|
||||||
|
%{_datadir}/bash-completion/completions/nvme
|
||||||
|
%{_datadir}/zsh/site-functions/_nvme
|
||||||
|
%dir %{_sysconfdir}/nvme
|
||||||
|
%config(noreplace) %{_sysconfdir}/nvme/discovery.conf
|
||||||
|
%{_unitdir}/nvmefc-boot-connections.service
|
||||||
|
%{_unitdir}/nvmf-autoconnect.service
|
||||||
|
%{_unitdir}/nvmf-connect.target
|
||||||
|
%{_unitdir}/nvmf-connect@.service
|
||||||
|
%{_unitdir}/nvmf-connect-nbft.service
|
||||||
|
%{_udevrulesdir}/65-persistent-net-nbft.rules
|
||||||
|
%{_udevrulesdir}/70-nvmf-autoconnect.rules
|
||||||
|
%{_udevrulesdir}/71-nvmf-netapp.rules
|
||||||
|
# Do not install the dracut rule yet. See rhbz 1742764
|
||||||
|
# /usr/lib/dracut/dracut.conf.d/70-nvmf-autoconnect.conf
|
||||||
|
%{nmlibdir}/dispatcher.d/99-nvme-nbft-connect.sh
|
||||||
|
%{nmlibdir}/conf.d/99-nvme-nbft-no-ignore-carrier.conf
|
||||||
|
|
||||||
|
%post
|
||||||
|
if [ $1 -eq 1 ] || [ $1 -eq 2 ]; then
|
||||||
|
if [ ! -s %{_sysconfdir}/nvme/hostnqn ]; then
|
||||||
|
echo $(nvme gen-hostnqn) > %{_sysconfdir}/nvme/hostnqn
|
||||||
|
fi
|
||||||
|
if [ ! -s %{_sysconfdir}/nvme/hostid ]; then
|
||||||
|
echo $(nvme show-hostnqn | sed 's/^.*uuid://') > %{_sysconfdir}/nvme/hostid
|
||||||
|
fi
|
||||||
|
|
||||||
|
# apply udev and systemd changes that we did
|
||||||
|
if [ $1 -eq 1 ]; then
|
||||||
|
systemctl enable nvmefc-boot-connections
|
||||||
|
fi
|
||||||
|
systemctl daemon-reload
|
||||||
|
udevadm control --reload-rules && udevadm trigger
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
%changelog
|
||||||
|
* Tue Nov 26 2024 MSVSphere Packaging Team <packager@msvsphere-os.ru> - 2.9.1-4
|
||||||
|
- Rebuilt for MSVSphere 10
|
||||||
|
|
||||||
|
* Thu Aug 22 2024 Tomas Bzatek <tbzatek@redhat.com> - 2.9.1-4
|
||||||
|
- Install NetworkManager override for nbft interfaces
|
||||||
|
- Rename reconnect NetworkManager hook to 99-nvme-nbft-connect.sh
|
||||||
|
|
||||||
|
* Fri Jul 26 2024 Maurizio Lombardi <mlombard@redhat.com> - 2.9.1-3
|
||||||
|
- Fix RHEL-37603 (NBFT discovery support)
|
||||||
|
|
||||||
|
* Mon Jun 24 2024 Troy Dawson <tdawson@redhat.com> - 2.9.1-2
|
||||||
|
- Bump release for June 2024 mass rebuild
|
||||||
|
|
||||||
|
* Fri May 03 2024 Tomas Bzatek <tbzatek@redhat.com> - 2.9.1-1
|
||||||
|
- Update to 2.9.1
|
||||||
|
- Install custom nvmf-connect-nbft.sh NetworkManager hook
|
||||||
|
|
||||||
|
* Tue Apr 23 2024 Tomas Bzatek <tbzatek@redhat.com> - 2.8-2
|
||||||
|
- Harden the systemd units
|
||||||
|
|
||||||
|
* Wed Feb 14 2024 Tomas Bzatek <tbzatek@redhat.com> - 2.8-1
|
||||||
|
- Update to 2.8
|
||||||
|
|
||||||
|
* Fri Feb 09 2024 Tomas Bzatek <tbzatek@redhat.com> - 2.7.1-4
|
||||||
|
- Lower the verbosity of TP4126 hostnqn-hostid consistency checks
|
||||||
|
|
||||||
|
* Thu Jan 25 2024 Fedora Release Engineering <releng@fedoraproject.org> - 2.7.1-3
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
|
||||||
|
|
||||||
|
* Sun Jan 21 2024 Fedora Release Engineering <releng@fedoraproject.org> - 2.7.1-2
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
|
||||||
|
|
||||||
|
* Thu Dec 28 2023 Tomas Bzatek <tbzatek@redhat.com> - 2.7.1-1
|
||||||
|
- Update to 2.7.1
|
||||||
|
|
||||||
|
* Fri Sep 29 2023 Tomas Bzatek <tbzatek@redhat.com> - 2.6-1
|
||||||
|
- Update to 2.6
|
||||||
|
|
||||||
|
* Thu Aug 17 2023 Tomas Bzatek <tbzatek@redhat.com> - 2.5-4
|
||||||
|
- Mark /etc/nvme/discovery.conf as (noreplace)
|
||||||
|
|
||||||
|
* Mon Aug 14 2023 Tomas Bzatek <tbzatek@redhat.com> - 2.5-3
|
||||||
|
- Backport 'fabrics: Use corresponding hostid when hostnqn is generated'
|
||||||
|
|
||||||
|
* Thu Jul 20 2023 Fedora Release Engineering <releng@fedoraproject.org> - 2.5-2
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild
|
||||||
|
|
||||||
|
* Tue Jul 04 2023 Tomas Bzatek <tbzatek@redhat.com> - 2.5-1
|
||||||
|
- Update to 2.5
|
||||||
|
|
||||||
|
* Thu Apr 20 2023 Tomas Bzatek <tbzatek@redhat.com> - 2.4-2
|
||||||
|
- Backport the NBFT support from git master
|
||||||
|
|
||||||
|
* Mon Apr 03 2023 Tomas Bzatek <tbzatek@redhat.com> - 2.4-1
|
||||||
|
- Update to 2.4
|
||||||
|
|
||||||
|
* Wed Feb 01 2023 Tomas Bzatek <tbzatek@redhat.com> - 2.3-1
|
||||||
|
- Update to 2.3
|
||||||
|
|
||||||
|
* Thu Jan 19 2023 Fedora Release Engineering <releng@fedoraproject.org> - 2.2.1-2
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild
|
||||||
|
|
||||||
|
* Fri Nov 04 2022 Tomas Bzatek <tbzatek@redhat.com> - 2.2.1-1
|
||||||
|
- Update to 2.2.1
|
||||||
|
|
||||||
|
* Tue Nov 01 2022 Tomas Bzatek <tbzatek@redhat.com> - 2.2-1
|
||||||
|
- Update to 2.2
|
||||||
|
|
||||||
|
* Fri Aug 19 2022 Tomas Bzatek <tbzatek@redhat.com> - 2.1.2-1
|
||||||
|
- Update to 2.1.2
|
||||||
|
|
||||||
|
* Fri Aug 05 2022 Tomas Bzatek <tbzatek@redhat.com> - 2.1.1-1
|
||||||
|
- Update to 2.1.1
|
||||||
|
|
||||||
|
* Fri Jul 22 2022 Fedora Release Engineering <releng@fedoraproject.org> - 2.1~rc0-2
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild
|
||||||
|
|
||||||
|
* Fri Jul 15 2022 Tomas Bzatek <tbzatek@redhat.com> - 2.1~rc0-1
|
||||||
|
- Update to 2.1-rc0
|
||||||
|
- Drop the hostnqn generate scriptlet (#2065886)
|
||||||
|
|
||||||
|
* Mon Apr 11 2022 Tomas Bzatek <tbzatek@redhat.com> - 2.0-1
|
||||||
|
- Update to 2.0
|
||||||
|
|
||||||
|
* Mon Apr 04 2022 Tomas Bzatek <tbzatek@redhat.com> - 2.0~rc8-1
|
||||||
|
- Update to 2.0-rc8
|
||||||
|
- Added scriptlet to generate /etc/nvme/hostnqn and hostid files (#2065886)
|
||||||
|
|
||||||
|
* Tue Mar 15 2022 Tomas Bzatek <tbzatek@redhat.com> - 2.0~rc6-1
|
||||||
|
- Update to 2.0-rc6
|
||||||
|
|
||||||
|
* Fri Mar 04 2022 Tomas Bzatek <tbzatek@redhat.com> - 2.0~rc5-1
|
||||||
|
- Update to 2.0-rc5
|
||||||
|
|
||||||
|
* Thu Jan 20 2022 Fedora Release Engineering <releng@fedoraproject.org> - 1.11.1-5
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild
|
||||||
|
|
||||||
|
* Thu Jul 22 2021 Fedora Release Engineering <releng@fedoraproject.org> - 1.11.1-4
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild
|
||||||
|
|
||||||
|
* Tue Jan 26 2021 Fedora Release Engineering <releng@fedoraproject.org> - 1.11.1-3
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild
|
||||||
|
|
||||||
|
* Tue Jul 28 2020 Fedora Release Engineering <releng@fedoraproject.org> - 1.11.1-2
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
|
||||||
|
|
||||||
|
* Sat Apr 25 2020 luto@kernel.org - 1.11.1-1
|
||||||
|
- Update to 1.11
|
||||||
|
|
||||||
|
* Thu Mar 19 2020 luto@kernel.org - 1.10.1-1
|
||||||
|
- Update to 1.10.1
|
||||||
|
|
||||||
|
* Wed Jan 29 2020 Fedora Release Engineering <releng@fedoraproject.org> - 1.9-2
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild
|
||||||
|
|
||||||
|
* Wed Oct 02 2019 luto@kernel.org - 1.9-1
|
||||||
|
- Update to 1.9
|
||||||
|
- Certain fabric functionality may not work yet due to missing dracut
|
||||||
|
support and missing hostid and hostnqn configuration.
|
||||||
|
|
||||||
|
* Thu Jul 25 2019 Fedora Release Engineering <releng@fedoraproject.org> - 1.8.1-2
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
|
||||||
|
|
||||||
|
* Mon Apr 15 2019 luto@kernel.org - 1.8.1-1
|
||||||
|
- Update to 1.8.1-1.
|
||||||
|
- Remove a build hack.
|
||||||
|
|
||||||
|
* Sun Feb 24 2019 luto@kernel.org - 1.7-2
|
||||||
|
- Create /etc/nvme
|
||||||
|
|
||||||
|
* Sun Feb 24 2019 luto@kernel.org - 1.7-1
|
||||||
|
- Bump to 1.7
|
||||||
|
- Clean up some trivial rpmlint complaints
|
||||||
|
|
||||||
|
* Fri Feb 01 2019 Fedora Release Engineering <releng@fedoraproject.org> - 1.6-2
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild
|
||||||
|
|
||||||
|
* Tue Jul 24 2018 luto@kernel.org - 1.6-1
|
||||||
|
- Update to 1.6
|
||||||
|
|
||||||
|
* Fri Jul 13 2018 Fedora Release Engineering <releng@fedoraproject.org> - 1.4-5
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild
|
||||||
|
|
||||||
|
* Thu Feb 08 2018 Fedora Release Engineering <releng@fedoraproject.org> - 1.4-4
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild
|
||||||
|
|
||||||
|
* Wed Nov 22 2017 luto@kernel.org - 1.4-1
|
||||||
|
- Update to 1.4
|
||||||
|
|
||||||
|
* Thu Aug 03 2017 Fedora Release Engineering <releng@fedoraproject.org> - 1.3-3
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild
|
||||||
|
|
||||||
|
* Thu Jul 27 2017 Fedora Release Engineering <releng@fedoraproject.org> - 1.3-2
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild
|
||||||
|
|
||||||
|
* Mon May 22 2017 luto@kernel.org - 1.3-1
|
||||||
|
- Update to 1.3
|
||||||
|
|
||||||
|
* Wed Apr 19 2017 luto@kernel.org - 1.2-2
|
||||||
|
- Update to 1.2
|
||||||
|
- 1.2-1 never existed
|
||||||
|
|
||||||
|
* Sat Feb 11 2017 Fedora Release Engineering <releng@fedoraproject.org> - 1.1-2
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild
|
||||||
|
|
||||||
|
* Wed Feb 01 2017 luto@kernel.org - 1.1-1
|
||||||
|
- Update to 1.1
|
||||||
|
|
||||||
|
* Sun Nov 20 2016 luto@kernel.org - 1.0-1
|
||||||
|
- Update to 1.0
|
||||||
|
|
||||||
|
* Mon Oct 31 2016 luto@kernel.org - 0.9-1
|
||||||
|
- Update to 0.9
|
||||||
|
|
||||||
|
* Thu Jun 30 2016 luto@kernel.org - 0.8-1
|
||||||
|
- Update to 0.8
|
||||||
|
|
||||||
|
* Tue May 31 2016 luto@kernel.org - 0.7-1
|
||||||
|
- Update to 0.7
|
||||||
|
|
||||||
|
* Fri Mar 18 2016 luto@kernel.org - 0.5-1
|
||||||
|
- Update to 0.5
|
||||||
|
|
||||||
|
* Sun Mar 06 2016 luto@kernel.org - 0.4-1
|
||||||
|
- Update to 0.4
|
||||||
|
|
||||||
|
* Thu Feb 04 2016 Fedora Release Engineering <releng@fedoraproject.org> - 0.2-3.20160112gitbdbb4da
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild
|
||||||
|
|
||||||
|
* Wed Jan 20 2016 luto@kernel.org - 0.2-2.20160112gitbdbb4da
|
||||||
|
- Update to new upstream commit, fixing #49. "nvme list" now works.
|
||||||
|
|
||||||
|
* Wed Jan 13 2016 luto@kernel.org - 0.2-1.20160112gitde3e0f1
|
||||||
|
- Initial import.
|
Loading…
Reference in new issue