diff --git a/0017-nvme-additional-rpms-for-dracut.patch b/0017-nvme-additional-rpms-for-dracut.patch new file mode 100644 index 0000000..ace8d84 --- /dev/null +++ b/0017-nvme-additional-rpms-for-dracut.patch @@ -0,0 +1,26 @@ +From 9dcd32dd85f7f45c3fe6c8d7b1de3b4c322c6807 Mon Sep 17 00:00:00 2001 +From: Tomas Bzatek +Date: Mon, 11 Sep 2023 13:50:24 +0200 +Subject: [PATCH] nvme: Require additional rpms for dracut + +The '95nvmf' dracut module needs a couple more packages +for the NBFT (NVMe over TCP) to work - such as networking. +Local PCIe NVMe devices have no special needs. +--- + blivet/devices/disk.py | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/blivet/devices/disk.py b/blivet/devices/disk.py +index 2b49ef685..5053f7bb8 100644 +--- a/blivet/devices/disk.py ++++ b/blivet/devices/disk.py +@@ -725,7 +725,8 @@ class NVMeFabricsNamespaceDevice(NVMeNamespaceDevice, NetworkStorageDevice): + + """ NVMe fabrics namespace """ + _type = "nvme-fabrics" +- _packages = ["nvme-cli"] ++ # dracut '95nvmf' module dependencies ++ _packages = ["nvme-cli", "dracut-network"] + + def __init__(self, device, **kwargs): + """ diff --git a/0018-nvme-TP4126-fixes-1.patch b/0018-nvme-TP4126-fixes-1.patch new file mode 100644 index 0000000..1614696 --- /dev/null +++ b/0018-nvme-TP4126-fixes-1.patch @@ -0,0 +1,107 @@ +From 06597099906be55b106c234b3bf0c87ec7d90a07 Mon Sep 17 00:00:00 2001 +From: Tomas Bzatek +Date: Thu, 17 Aug 2023 14:45:18 +0200 +Subject: [PATCH] nvme: Align HostNQN and HostID format to TP4126 + +Also don't overwrite existing files during startup() since they +might have been supplied by early boot stages. +--- + blivet/nvme.py | 62 +++++++++++++++++++++++++++++++------------------- + 1 file changed, 39 insertions(+), 23 deletions(-) + +diff --git a/blivet/nvme.py b/blivet/nvme.py +index 17bead15e..5ac41cffa 100644 +--- a/blivet/nvme.py ++++ b/blivet/nvme.py +@@ -18,16 +18,20 @@ + # + + import os +-import shutil + + from . import errors +-from . import util ++ ++import gi ++gi.require_version("BlockDev", "3.0") ++ ++from gi.repository import BlockDev as blockdev + + import logging + log = logging.getLogger("blivet") + +-HOSTNQN_FILE = "/etc/nvme/hostnqn" +-HOSTID_FILE = "/etc/nvme/hostid" ++ETC_NVME_PATH = "/etc/nvme/" ++HOSTNQN_FILE = ETC_NVME_PATH + "hostnqn" ++HOSTID_FILE = ETC_NVME_PATH + "hostid" + + + class NVMe(object): +@@ -40,6 +44,8 @@ class NVMe(object): + + def __init__(self): + self.started = False ++ self._hostnqn = None ++ self._hostid = None + + # So that users can write nvme() to get the singleton instance + def __call__(self): +@@ -52,28 +58,38 @@ def startup(self): + if self.started: + return + +- rc, nqn = util.run_program_and_capture_output(["nvme", "gen-hostnqn"]) +- if rc != 0: +- raise errors.NVMeError("Failed to generate hostnqn") +- +- with open(HOSTNQN_FILE, "w") as f: +- f.write(nqn) +- +- rc, hid = util.run_program_and_capture_output(["dmidecode", "-s", "system-uuid"]) +- if rc != 0: +- raise errors.NVMeError("Failed to generate host ID") +- +- with open(HOSTID_FILE, "w") as f: +- f.write(hid) ++ self._hostnqn = blockdev.nvme_get_host_nqn() ++ self._hostid = blockdev.nvme_get_host_id() ++ if not self._hostnqn: ++ self._hostnqn = blockdev.nvme_generate_host_nqn() ++ if not self._hostnqn: ++ raise errors.NVMeError("Failed to generate HostNQN") ++ if not self._hostid: ++ if 'uuid:' not in self._hostnqn: ++ raise errors.NVMeError("Missing UUID part in the HostNQN string '%s'" % self._hostnqn) ++ # derive HostID from HostNQN's UUID part ++ self._hostid = self._hostnqn.split('uuid:')[1] ++ ++ # do not overwrite existing files, taken e.g. from initramfs ++ self.write("/", overwrite=False) + + self.started = True + +- def write(self, root): # pylint: disable=unused-argument +- # copy the hostnqn and hostid files +- if not os.path.isdir(root + "/etc/nvme"): +- os.makedirs(root + "/etc/nvme", 0o755) +- shutil.copyfile(HOSTNQN_FILE, root + HOSTNQN_FILE) +- shutil.copyfile(HOSTID_FILE, root + HOSTID_FILE) ++ def write(self, root, overwrite=True): # pylint: disable=unused-argument ++ # write down the hostnqn and hostid files ++ p = root + ETC_NVME_PATH ++ if not os.path.isdir(p): ++ os.makedirs(p, 0o755) ++ p = root + HOSTNQN_FILE ++ if overwrite or not os.path.isfile(p): ++ with open(p, "w") as f: ++ f.write(self._hostnqn) ++ f.write("\n") ++ p = root + HOSTID_FILE ++ if overwrite or not os.path.isfile(p): ++ with open(p, "w") as f: ++ f.write(self._hostid) ++ f.write("\n") + + + # Create nvme singleton diff --git a/python-blivet.spec b/python-blivet.spec index edceacd..93dbee0 100644 --- a/python-blivet.spec +++ b/python-blivet.spec @@ -23,7 +23,7 @@ Version: 3.6.0 #%%global prerelease .b2 # prerelease, if defined, should be something like .a1, .b1, .b2.dev1, or .c2 -Release: 9%{?prerelease}%{?dist} +Release: 10%{?prerelease}%{?dist} Epoch: 1 License: LGPLv2+ %global realname blivet @@ -46,6 +46,8 @@ Patch12: 0013-Fix-setting-kickstart-data.patch Patch13: 0014-Do-not-set-memory-limit-for-LUKS2-when-running-in-FI.patch Patch14: 0015-Add-support-for-filesystem-online-resize.patch Patch15: 0016-Backport-iSCSI-initiator-name-related-fixes.patch +Patch16: 0017-nvme-additional-rpms-for-dracut.patch +Patch17: 0018-nvme-TP4126-fixes-1.patch # Versions of required components (done so we make sure the buildrequires # match the requires versions of things). @@ -210,6 +212,12 @@ configuration. %changelog +* Tue Sep 26 2023 Tomas Bzatek - 3.6.0-10 +- nvme: Require additional rpms for dracut + Resolves: RHEL-2855 +- nvme: Align HostNQN and HostID format to TP-4126 + Resolves: RHEL-1254 + * Mon Jul 24 2023 Jan Pokorny - 3.6.0-9 Backport iSCSI initiator name related fixes: - Allow changing iSCSI initiator name after setting it