From 63da3cb8a40500c889c8faa4326f81d16997a3c8 Mon Sep 17 00:00:00 2001 From: Tomas Bzatek Date: Mon, 27 Nov 2023 18:55:55 +0100 Subject: [PATCH] nvme: Retrieve HostNQN from a first active fabrics connection When no /etc/hostnqn exists, look for any active NVMe over Fabrics connections and take the values from a first one, rather than generating new ones. --- blivet/nvme.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/blivet/nvme.py b/blivet/nvme.py index 5ac41cffa..2e4686e68 100644 --- a/blivet/nvme.py +++ b/blivet/nvme.py @@ -18,6 +18,7 @@ # import os +import glob from . import errors @@ -54,6 +55,22 @@ def __call__(self): def __deepcopy__(self, memo_dict): # pylint: disable=unused-argument return self + def _retrieve_fabrics_hostnqn(self): + for d in glob.glob('/sys/class/nvme-fabrics/ctl/nvme*/'): + try: + # invalidate old values + self._hostnqn = None + self._hostid = None + # read from sysfs + with open(os.path.join(d, 'hostnqn')) as f: + self._hostnqn = f.readline().strip() + with open(os.path.join(d, 'hostid')) as f: + self._hostid = f.readline().strip() + if self._hostnqn: + break + except Exception: # pylint: disable=broad-except + pass + def startup(self): if self.started: return @@ -61,6 +78,10 @@ def startup(self): self._hostnqn = blockdev.nvme_get_host_nqn() self._hostid = blockdev.nvme_get_host_id() if not self._hostnqn: + # see if there are any active fabrics connections and take their values over + self._retrieve_fabrics_hostnqn() + if not self._hostnqn: + # generate new values self._hostnqn = blockdev.nvme_generate_host_nqn() if not self._hostnqn: raise errors.NVMeError("Failed to generate HostNQN")