From a866f6aa6d65757f7ffdc00614a0808c1de7d1f7 Mon Sep 17 00:00:00 2001 From: Vojtech Trefny Date: Tue, 16 Jul 2024 10:39:09 +0200 Subject: [PATCH] Consolidated Device Configuration for RHEL 10 Resolves: RHEL-39381 --- ...nsolidated-s390-device-configuration.patch | 742 ++++++++++++++++++ python-blivet.spec | 7 +- 2 files changed, 748 insertions(+), 1 deletion(-) create mode 100644 0005-consolidated-s390-device-configuration.patch diff --git a/0005-consolidated-s390-device-configuration.patch b/0005-consolidated-s390-device-configuration.patch new file mode 100644 index 0000000..4ad6bb8 --- /dev/null +++ b/0005-consolidated-s390-device-configuration.patch @@ -0,0 +1,742 @@ +From 492122f34fe0ee5d0c7bce7f3dd2ce0ca6e3e9f2 Mon Sep 17 00:00:00 2001 +From: Steffen Maier +Date: Fri, 27 Jan 2023 22:01:23 +0100 +Subject: [PATCH 1/7] blivet/zfcp: drop modprobe alias, which is superfluous + since udev in RHEL6 + +Signed-off-by: Steffen Maier +--- + blivet/zfcp.py | 3 --- + 1 file changed, 3 deletions(-) + +diff --git a/blivet/zfcp.py b/blivet/zfcp.py +index a2b7facb..cd765d82 100644 +--- a/blivet/zfcp.py ++++ b/blivet/zfcp.py +@@ -555,9 +555,6 @@ class zFCP: + f.write("%s\n" % (d,)) + f.close() + +- f = open(root + "/etc/modprobe.conf", "a") +- f.write("alias scsi_hostadapter zfcp\n") +- f.close() + + + # Create ZFCP singleton +-- +2.45.2 + + +From a49fdf291acad957675472f5c27be9e5269c199a Mon Sep 17 00:00:00 2001 +From: Steffen Maier +Date: Tue, 28 Feb 2023 17:23:32 +0100 +Subject: [PATCH 2/7] blivet/zfcp: remove code broken since zfcp automatic LUN + scan + +The old existing test preceding the removed code was only designed for the +old zfcp before it got automatic LUN scan. Hence, the test is incomplete. +With zfcp auto LUN scan, zfcp can just have SCSI devices without any +zfcp unit representation in sysfs. +Do not bother cleaning up an unused FCP device and just remove the code. + +Note: Do not confuse zfcp auto port scan with zfcp auto LUN scan. + +Signed-off-by: Steffen Maier +--- + blivet/zfcp.py | 3 --- + 1 file changed, 3 deletions(-) + +diff --git a/blivet/zfcp.py b/blivet/zfcp.py +index cd765d82..e2c0dc2d 100644 +--- a/blivet/zfcp.py ++++ b/blivet/zfcp.py +@@ -384,9 +384,6 @@ class ZFCPDeviceFullPath(ZFCPDeviceBase): + self.devnum, luns[0]) + return True + +- # no other WWPNs/LUNs exists for this device number, it's safe to bring it offline +- self._set_zfcp_device_offline() +- + return True + + +-- +2.45.2 + + +From 19285bb785ccbfcd72fd1f3242c56e9d06ba74d8 Mon Sep 17 00:00:00 2001 +From: Steffen Maier +Date: Fri, 27 Jan 2023 22:17:45 +0100 +Subject: [PATCH 3/7] blivet/zfcp: drop old zfcp port handling gone from the + kernel long ago + +Gone since 2008 Linux kernel v2.6.27 commit 235f7f25f492 ("[SCSI] zfcp: +Remove sysfs attribute port_add"). + +Signed-off-by: Steffen Maier +--- + blivet/zfcp.py | 65 -------------------------------------------------- + 1 file changed, 65 deletions(-) + +diff --git a/blivet/zfcp.py b/blivet/zfcp.py +index e2c0dc2d..82751382 100644 +--- a/blivet/zfcp.py ++++ b/blivet/zfcp.py +@@ -240,7 +240,6 @@ class ZFCPDeviceFullPath(ZFCPDeviceBase): + + super().online_device() + +- portadd = "%s/%s/port_add" % (zfcpsysfs, self.devnum) + portdir = "%s/%s/%s" % (zfcpsysfs, self.devnum, self.wwpn) + unitadd = "%s/unit_add" % (portdir) + unitdir = "%s/%s" % (portdir, self.fcplun) +@@ -253,31 +252,6 @@ class ZFCPDeviceFullPath(ZFCPDeviceBase): + log.warning("zFCP device %s in NPIV mode brought online. All LUNs will be activated " + "automatically although WWPN and LUN have been provided.", self.devnum) + +- # create the sysfs directory for the WWPN/port +- if not os.path.exists(portdir): +- if os.path.exists(portadd): +- # older zfcp sysfs interface +- try: +- logged_write_line_to_file(portadd, self.wwpn) +- udev.settle() +- except OSError as e: +- raise ValueError(_("Could not add WWPN %(wwpn)s to zFCP " +- "device %(devnum)s (%(e)s).") +- % {'wwpn': self.wwpn, +- 'devnum': self.devnum, +- 'e': e}) +- else: +- # newer zfcp sysfs interface with auto port scan +- raise ValueError(_("WWPN %(wwpn)s not found at zFCP device " +- "%(devnum)s.") % {'wwpn': self.wwpn, +- 'devnum': self.devnum}) +- else: +- if os.path.exists(portadd): +- # older zfcp sysfs interface +- log.info("WWPN %(wwpn)s at zFCP device %(devnum)s already " +- "there.", {'wwpn': self.wwpn, +- 'devnum': self.devnum}) +- + # create the sysfs directory for the LUN/unit + if not os.path.exists(unitdir): + try: +@@ -323,10 +297,7 @@ class ZFCPDeviceFullPath(ZFCPDeviceBase): + def offline_device(self): + """Remove the zFCP device from the system.""" + +- portadd = "%s/%s/port_add" % (zfcpsysfs, self.devnum) +- portremove = "%s/%s/port_remove" % (zfcpsysfs, self.devnum) + unitremove = "%s/%s/%s/unit_remove" % (zfcpsysfs, self.devnum, self.wwpn) +- portdir = "%s/%s/%s" % (zfcpsysfs, self.devnum, self.wwpn) + devdir = "%s/%s" % (zfcpsysfs, self.devnum) + + try: +@@ -348,42 +319,6 @@ class ZFCPDeviceFullPath(ZFCPDeviceBase): + % {'fcplun': self.fcplun, 'wwpn': self.wwpn, + 'devnum': self.devnum, 'e': e}) + +- # remove the WWPN only if there are no other LUNs attached +- if os.path.exists(portadd): +- # only try to remove ports with older zfcp sysfs interface +- for lun in os.listdir(portdir): +- if lun.startswith("0x") and \ +- os.path.isdir(os.path.join(portdir, lun)): +- log.info("Not removing WWPN %s at zFCP device %s since port still has other LUNs, e.g. %s.", +- self.wwpn, self.devnum, lun) +- return True +- +- try: +- logged_write_line_to_file(portremove, self.wwpn) +- except OSError as e: +- raise ValueError(_("Could not remove WWPN %(wwpn)s on zFCP " +- "device %(devnum)s (%(e)s).") +- % {'wwpn': self.wwpn, +- 'devnum': self.devnum, 'e': e}) +- +- # check if there are other WWPNs existing for the zFCP device number +- if os.path.exists(portadd): +- # older zfcp sysfs interface +- for port in os.listdir(devdir): +- if port.startswith("0x") and \ +- os.path.isdir(os.path.join(devdir, port)): +- log.info("Not setting zFCP device %s offline since it still has other ports, e.g. %s.", +- self.devnum, port) +- return True +- else: +- # newer zfcp sysfs interface with auto port scan +- luns = glob.glob("%s/0x????????????????/0x????????????????" +- % (devdir,)) +- if len(luns) != 0: +- log.info("Not setting zFCP device %s offline since it still has other LUNs, e.g. %s.", +- self.devnum, luns[0]) +- return True +- + return True + + +-- +2.45.2 + + +From cc67470805d871ff6ec09d554fb4b65a375e5b59 Mon Sep 17 00:00:00 2001 +From: Steffen Maier +Date: Tue, 16 Jul 2024 10:21:00 +0200 +Subject: [PATCH 4/7] blivet/zfcp: change to consolidated persistent device + config by zdev (#1802482,#1937049) + +Implements the zfcp part of referenced bugs. + +https://github.com/ibm-s390-linux/s390-tools/tree/master/zdev/ +handles everything as of +ibm-s390-linux/s390-tools@06a30ae +("zdev/dracut: add rd.zfcp cmdline option handling"). + +It is no longer necessary to perform individual pre-req steps, such as +setting an FCP device online, when we want to attach a LUN. Just call +chzdev to configure zfcp LUNs and let it do what is necessary, including +cio_ignore handling and udev settle. + +The spec file update reflects the new dependency on `chzdev` from the +s390 architecture specific sub-package s390utils-core. Actually, this +commit here only depends on `chzdev` in older versions already packaged +and shipped, so no version comparison necessary here. + +Since chzdev now implicitly sets the FCP device online +and there is no more preceding explicit FCP device online, +move the path over-specification warning after the call to chzdev. +Otherwise, the FCP device could still be offline and its +port_type unknown, so has_auto_lun_scan() would get wrong information +regarding the port_type being NPIV. + +Anaconda handles the persistent config of all s390 device types as of +commit ("write persistent config of any (dasd,zfcp,znet) s390 devices to +sysroot"), so drop the special handling in zfcp.write(). + +Signed-off-by: Steffen Maier +--- + blivet/zfcp.py | 99 +++++++++------------------------------------- + python-blivet.spec | 1 + + 2 files changed, 20 insertions(+), 80 deletions(-) + +diff --git a/blivet/zfcp.py b/blivet/zfcp.py +index 82751382..38ab5668 100644 +--- a/blivet/zfcp.py ++++ b/blivet/zfcp.py +@@ -104,8 +104,6 @@ class ZFCPDeviceBase(ABC): + if not self.devnum: + raise ValueError(_("You have not specified a device number or the number is invalid")) + +- self._device_online_path = os.path.join(zfcpsysfs, self.devnum, "online") +- + # Force str and unicode types in case any of the properties are unicode + def _to_string(self): + return str(self.devnum) +@@ -113,20 +111,6 @@ class ZFCPDeviceBase(ABC): + def __str__(self): + return self._to_string() + +- def _free_device(self): +- """Remove the device from the I/O ignore list to make it visible to the system. +- +- :raises: ValueError if the device cannot be removed from the I/O ignore list +- """ +- +- if not os.path.exists(self._device_online_path): +- log.info("Freeing zFCP device %s", self.devnum) +- util.run_program(["zfcp_cio_free", "-d", self.devnum]) +- +- if not os.path.exists(self._device_online_path): +- raise ValueError(_("zFCP device %s not found, not even in device ignore list.") % +- (self.devnum,)) +- + def _set_zfcp_device_online(self): + """Set the zFCP device online. + +@@ -134,10 +118,8 @@ class ZFCPDeviceBase(ABC): + """ + + try: +- with open(self._device_online_path) as f: +- devonline = f.readline().strip() +- if devonline != "1": +- logged_write_line_to_file(self._device_online_path, "1") ++ util.run_program(["chzdev", "--enable", "zfcp-host", self.devnum, ++ "--yes", "--no-root-update", "--force"]) + except OSError as e: + raise ValueError(_("Could not set zFCP device %(devnum)s " + "online (%(e)s).") +@@ -150,7 +132,8 @@ class ZFCPDeviceBase(ABC): + """ + + try: +- logged_write_line_to_file(self._device_online_path, "0") ++ util.run_program(["chzdev", "--disable", "zfcp-host", self.devnum, ++ "--yes", "--no-root-update", "--force"]) + except OSError as e: + raise ValueError(_("Could not set zFCP device %(devnum)s " + "offline (%(e)s).") +@@ -163,6 +146,7 @@ class ZFCPDeviceBase(ABC): + :returns: True or False + """ + ++ @abstractmethod + def online_device(self): + """Initialize the device and make its storage block device(s) ready to use. + +@@ -170,10 +154,6 @@ class ZFCPDeviceBase(ABC): + :raises: ValueError if the device cannot be initialized + """ + +- self._free_device() +- self._set_zfcp_device_online() +- return True +- + def offline_scsi_device(self): + """Find SCSI devices associated to the zFCP device and remove them from the system.""" + +@@ -238,25 +218,15 @@ class ZFCPDeviceFullPath(ZFCPDeviceBase): + :raises: ValueError if the device cannot be initialized + """ + +- super().online_device() +- + portdir = "%s/%s/%s" % (zfcpsysfs, self.devnum, self.wwpn) +- unitadd = "%s/unit_add" % (portdir) + unitdir = "%s/%s" % (portdir, self.fcplun) +- failed = "%s/failed" % (unitdir) +- +- # Activating using devnum, WWPN, and LUN despite available zFCP auto LUN scan should still +- # be possible as this method was used as a workaround until the support for zFCP auto LUN +- # scan devices has been implemented. Just log a warning message and continue. +- if has_auto_lun_scan(self.devnum): +- log.warning("zFCP device %s in NPIV mode brought online. All LUNs will be activated " +- "automatically although WWPN and LUN have been provided.", self.devnum) + + # create the sysfs directory for the LUN/unit + if not os.path.exists(unitdir): + try: +- logged_write_line_to_file(unitadd, self.fcplun) +- udev.settle() ++ util.run_program(["chzdev", "--enable", "zfcp-lun", ++ "%s:%s:%s" % (self.devnum, self.wwpn, self.fcplun), ++ "--yes", "--no-root-update", "--force"]) + except OSError as e: + raise ValueError(_("Could not add LUN %(fcplun)s to WWPN " + "%(wwpn)s on zFCP device %(devnum)s " +@@ -270,48 +240,23 @@ class ZFCPDeviceFullPath(ZFCPDeviceBase): + 'wwpn': self.wwpn, + 'devnum': self.devnum}) + +- # check the state of the LUN +- fail = "0" +- try: +- f = open(failed, "r") +- fail = f.readline().strip() +- f.close() +- except OSError as e: +- raise ValueError(_("Could not read failed attribute of LUN " +- "%(fcplun)s at WWPN %(wwpn)s on zFCP device " +- "%(devnum)s (%(e)s).") +- % {'fcplun': self.fcplun, +- 'wwpn': self.wwpn, +- 'devnum': self.devnum, +- 'e': e}) +- if fail != "0": +- self.offline_device() +- raise ValueError(_("Failed LUN %(fcplun)s at WWPN %(wwpn)s on " +- "zFCP device %(devnum)s removed again.") +- % {'fcplun': self.fcplun, +- 'wwpn': self.wwpn, +- 'devnum': self.devnum}) ++ # Activating using devnum, WWPN, and LUN despite available zFCP auto LUN scan should still ++ # be possible as this method was used as a workaround until the support for zFCP auto LUN ++ # scan devices has been implemented. Just log a warning message and continue. ++ if has_auto_lun_scan(self.devnum): ++ log.warning("zFCP device %s in NPIV mode brought online. All LUNs will be activated " ++ "automatically although WWPN and LUN have been provided.", self.devnum) + + return True + + def offline_device(self): + """Remove the zFCP device from the system.""" + +- unitremove = "%s/%s/%s/unit_remove" % (zfcpsysfs, self.devnum, self.wwpn) +- devdir = "%s/%s" % (zfcpsysfs, self.devnum) +- +- try: +- self.offline_scsi_device() +- except OSError as e: +- raise ValueError(_("Could not correctly delete SCSI device of " +- "zFCP %(devnum)s %(wwpn)s %(fcplun)s " +- "(%(e)s).") +- % {'devnum': self.devnum, 'wwpn': self.wwpn, +- 'fcplun': self.fcplun, 'e': e}) +- + # remove the LUN + try: +- logged_write_line_to_file(unitremove, self.fcplun) ++ util.run_program(["chzdev", "--disable", "zfcp-lun", ++ "%s:%s:%s" % (self.devnum, self.wwpn, self.fcplun), ++ "--yes", "--no-root-update", "--force"]) + except OSError as e: + raise ValueError(_("Could not remove LUN %(fcplun)s at WWPN " + "%(wwpn)s on zFCP device %(devnum)s " +@@ -340,7 +285,7 @@ class ZFCPDeviceAutoLunScan(ZFCPDeviceBase): + :raises: ValueError if the device cannot be initialized + """ + +- super().online_device() ++ self._set_zfcp_device_online() + + if not has_auto_lun_scan(self.devnum): + raise ValueError(_("zFCP device %s cannot use auto LUN scan.") % self) +@@ -480,13 +425,7 @@ class zFCP: + log.warning("%s", str(e)) + + def write(self, root): +- if len(self.fcpdevs) == 0: +- return +- f = open(root + zfcpconf, "w") +- for d in self.fcpdevs: +- f.write("%s\n" % (d,)) +- f.close() +- ++ pass + + + # Create ZFCP singleton +diff --git a/python-blivet.spec b/python-blivet.spec +index 38a389ae..ac8d2841 100644 +--- a/python-blivet.spec ++++ b/python-blivet.spec +@@ -70,6 +70,7 @@ Recommends: libblockdev-swap >= %{libblockdevver} + + %ifarch s390 s390x + Recommends: libblockdev-s390 >= %{libblockdevver} ++Requires: s390utils-core + %endif + + Requires: python3-bytesize >= %{libbytesizever} +-- +2.45.2 + + +From 6c4e57d78562962f014970c32381891c71f05e3b Mon Sep 17 00:00:00 2001 +From: Steffen Maier +Date: Tue, 31 Jan 2023 12:01:31 +0100 +Subject: [PATCH 5/7] blivet/zfcp: remove no longer used read_config + functionality (#1802482,#1937049) + +Implements the zfcp part of referenced bugs. + +Since +https://github.com/rhinstaller/anaconda/commit/87ab1ab2a3aa8b95cd75b2f37e0881e5f57656a5 +("Support cio_ignore functionality for zFCP devices (#533492)"), +/etc/zfcp.conf replaced /tmp/fcpconfig. + +Since +https://github.com/rhinstaller/anaconda/commit/011ea0a1779459ed20990ddf52166aa75a9c1382 +("Remove linuxrc.s390"), /etc/zfcp.conf only exists if the user specified +dracut cmdline parameter rd.zfcp=. + +https://github.com/ibm-s390-linux/s390-tools/tree/master/zdev/ +handles parsing of rd.zfcp= without /etc/zfcp.conf as of +https://github.com/ibm-s390-linux/s390-tools/commit/06a30ae529a5d6ad2369ed81da056bf3a6147bb6 +("zdev/dracut: add rd.zfcp cmdline option handling"). + +https://src.fedoraproject.org/rpms/s390utils.git +no longer writes /etc/zfcp.conf during deprecated parsing of rd.zfcp= +as of commit +("zfcp: migrate to consolidated persistent device config with zdev") + +Hence, nothing populates /etc/zfcp.conf during installer boot anymore. + +Anaconda imports configuration for all s390 device types as of +commit ("write persistent config of any (dasd,zfcp,znet) s390 devices to +sysroot"). The only remaining import source is from dracut boot parameters. + +Signed-off-by: Steffen Maier +--- + blivet/zfcp.py | 60 ++++++++------------------------------------------ + 1 file changed, 9 insertions(+), 51 deletions(-) + +diff --git a/blivet/zfcp.py b/blivet/zfcp.py +index 38ab5668..a33eb48b 100644 +--- a/blivet/zfcp.py ++++ b/blivet/zfcp.py +@@ -45,7 +45,6 @@ def logged_write_line_to_file(fn, value): + + zfcpsysfs = "/sys/bus/ccw/drivers/zfcp" + scsidevsysfs = "/sys/bus/scsi/devices" +-zfcpconf = "/etc/zfcp.conf" + + + def _is_lun_scan_allowed(): +@@ -323,18 +322,22 @@ class zFCP: + + """ ZFCP utility class. + +- This class will automatically online to ZFCP drives configured in +- /tmp/fcpconfig when the startup() method gets called. It can also be +- used to manually configure ZFCP devices through the add_fcp() method. ++ This class is used to manually configure ZFCP devices through the ++ add_fcp() method, which is used by the anaconda GUI or by kickstart. + +- As this class needs to make sure that /tmp/fcpconfig configured ++ As this class needs to make sure that configured + drives are only onlined once and as it keeps a global list of all ZFCP + devices it is implemented as a Singleton. ++ ++ In particular, this class does not create objects for any other method ++ that enables ZFCP devices such as rd.zfcp= or any device auto ++ configuration. These methods make zfcp-attached SCSI disk block devices ++ available, which ZFCPDiskDevice [devices/disk.py] can directly ++ discover. + """ + + def __init__(self): + self.fcpdevs = set() +- self.has_read_config = False + self.down = True + + # So that users can write zfcp() to get the singleton instance +@@ -345,46 +348,6 @@ class zFCP: + # pylint: disable=unused-argument + return self + +- def read_config(self): +- try: +- f = open(zfcpconf, "r") +- except OSError: +- log.info("no %s; not configuring zfcp", zfcpconf) +- return +- +- lines = [x.strip().lower() for x in f.readlines()] +- f.close() +- +- for line in lines: +- if line.startswith("#") or line == '': +- continue +- +- fields = line.split() +- +- # zFCP auto LUN scan available +- if len(fields) == 1: +- devnum = fields[0] +- wwpn = None +- fcplun = None +- elif len(fields) == 3: +- devnum = fields[0] +- wwpn = fields[1] +- fcplun = fields[2] +- elif len(fields) == 5: +- # support old syntax of: +- # devno scsiid wwpn scsilun fcplun +- devnum = fields[0] +- wwpn = fields[2] +- fcplun = fields[4] +- else: +- log.warning("Invalid line found in %s: %s", zfcpconf, line) +- continue +- +- try: +- self.add_fcp(devnum, wwpn, fcplun) +- except ValueError as e: +- log.warning("%s", str(e)) +- + def add_fcp(self, devnum, wwpn=None, fcplun=None): + if wwpn and fcplun: + d = ZFCPDeviceFullPath(devnum, wwpn, fcplun) +@@ -410,11 +373,6 @@ class zFCP: + if not self.down: + return + self.down = False +- if not self.has_read_config: +- self.read_config() +- self.has_read_config = True +- # read_config calls add_fcp which calls online_device already +- return + + if len(self.fcpdevs) == 0: + return +-- +2.45.2 + + +From e119e1e48a8a8bc83ec42d3c6ab31fac7c4a98eb Mon Sep 17 00:00:00 2001 +From: Steffen Maier +Date: Tue, 28 Feb 2023 17:48:04 +0100 +Subject: [PATCH 6/7] respect explicit user choice for full path in zfcp + dracut_setup_args + +Complements RHBZ#1937030. + +Signed-off-by: Steffen Maier +--- + blivet/devices/disk.py | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +diff --git a/blivet/devices/disk.py b/blivet/devices/disk.py +index 4ae4a845..edbf41c4 100644 +--- a/blivet/devices/disk.py ++++ b/blivet/devices/disk.py +@@ -498,7 +498,12 @@ class ZFCPDiskDevice(DiskDevice): + from ..zfcp import has_auto_lun_scan + + # zFCP auto LUN scan needs only the device ID +- if has_auto_lun_scan(self.hba_id): ++ # If the user explicitly over-specified with a full path configuration ++ # respect this choice and emit a full path specification nonetheless. ++ errorlevel = util.run_program(["lszdev", "zfcp-lun", "--configured", ++ "%s:%s:%s" % (self.hba_id, self.wwpn, ++ self.fcp_lun)]) ++ if has_auto_lun_scan(self.hba_id) and errorlevel != 0: + dracut_args = set(["rd.zfcp=%s" % self.hba_id]) + else: + dracut_args = set(["rd.zfcp=%s,%s,%s" % (self.hba_id, self.wwpn, self.fcp_lun,)]) +-- +2.45.2 + + +From 4c2d39c4fcea9361b60d99327a9eb8b9d89078fb Mon Sep 17 00:00:00 2001 +From: Steffen Maier +Date: Tue, 16 Jul 2024 10:22:55 +0200 +Subject: [PATCH 7/7] DASDDevice: dracut_setup_args() without deprecated + dasd.conf (#1802482,#1937049) + +Implements the dasd part of referenced bugs. + +Depends on +ibm-s390-linux/s390-tools@689b894 +("zdev: add helper to convert from zdev config to dasd_mod.dasd"). +The spec file update reflects the new dependency on `zdev-to-dasd_mod.dasd` +in the new v2.31.0 of the s390 architecture specific sub-package +s390utils-core. + +Delegate the generation of rd.dasd statements to a helper tool from +s390-tools, which gets its low-level config information from the +consolidated persistent configuration mechanism using chzdev. + +Signed-off-by: Steffen Maier +--- + blivet/devices/disk.py | 56 +++----------------------------- + blivet/populator/helpers/disk.py | 3 -- + python-blivet.spec | 3 +- + 3 files changed, 6 insertions(+), 56 deletions(-) + +diff --git a/blivet/devices/disk.py b/blivet/devices/disk.py +index edbf41c4..a849e7ac 100644 +--- a/blivet/devices/disk.py ++++ b/blivet/devices/disk.py +@@ -530,67 +530,19 @@ class DASDDevice(DiskDevice): + :type format: :class:`~.formats.DeviceFormat` or a subclass of it + :keyword str wwn: the disk's WWN + :keyword busid: bus ID +- :keyword opts: options +- :type opts: dict with option name keys and option value values + """ + self.busid = kwargs.pop('busid') +- self.opts = kwargs.pop('opts') + DiskDevice.__init__(self, device, **kwargs) + + @property + def description(self): + return "DASD device %s" % self.busid + +- def get_opts(self): +- return ["%s=%s" % (k, v) for k, v in self.opts.items() if v == '1'] +- + def dracut_setup_args(self): +- conf = "/etc/dasd.conf" +- line = None +- if os.path.isfile(conf): +- f = open(conf) +- # grab the first line that starts with our bus_id +- for l in f.readlines(): +- if l.startswith(self.busid): +- line = l.rstrip() +- break +- +- f.close() +- +- # See if we got a line. If not, grab our get_opts +- if not line: +- line = self.busid +- for devopt in self.get_opts(): +- line += " %s" % devopt +- +- # Create a translation mapping from dasd.conf format to module format +- translate = {'use_diag': 'diag', +- 'readonly': 'ro', +- 'erplog': 'erplog', +- 'failfast': 'failfast'} +- +- # this is a really awkward way of determining if the +- # feature found is actually desired (1, not 0), plus +- # translating that feature into the actual kernel module +- # value +- opts = [] +- parts = line.split() +- for chunk in parts[1:]: +- try: +- feat, val = chunk.split('=') +- if int(val): +- opts.append(translate[feat]) +- except (ValueError, KeyError): +- # If we don't know what the feature is (feat not in translate +- # or if we get a val that doesn't cleanly convert to an int +- # we can't do anything with it. +- log.warning("failed to parse dasd feature %s", chunk) +- +- if opts: +- return set(["rd.dasd=%s(%s)" % (self.busid, +- ":".join(opts))]) +- else: +- return set(["rd.dasd=%s" % self.busid]) ++ devspec = util.capture_output(["/lib/s390-tools/zdev-to-dasd_mod.dasd", ++ "persistent", self.busid]).strip() ++ # strip to remove trailing newline, which must not appear in zipl BLS ++ return set(["rd.dasd=%s" % devspec]) + + + NVMeController = namedtuple("NVMeController", ["name", "serial", "nvme_ver", "id", "subsysnqn", +diff --git a/blivet/populator/helpers/disk.py b/blivet/populator/helpers/disk.py +index 3ac3f408..fc47f62a 100644 +--- a/blivet/populator/helpers/disk.py ++++ b/blivet/populator/helpers/disk.py +@@ -204,9 +204,6 @@ class DASDDevicePopulator(DiskDevicePopulator): + def _get_kwargs(self): + kwargs = super(DASDDevicePopulator, self)._get_kwargs() + kwargs["busid"] = udev.device_get_dasd_bus_id(self.data) +- kwargs["opts"] = {} +- for attr in ['readonly', 'use_diag', 'erplog', 'failfast']: +- kwargs["opts"][attr] = udev.device_get_dasd_flag(self.data, attr) + + log.info("%s is a dasd device", udev.device_get_name(self.data)) + return kwargs +diff --git a/python-blivet.spec b/python-blivet.spec +index ac8d2841..81177020 100644 +--- a/python-blivet.spec ++++ b/python-blivet.spec +@@ -21,6 +21,7 @@ Source1: http://github.com/storaged-project/blivet/archive/%{realname}-%{realver + %global libblockdevver 3.0 + %global libbytesizever 0.3 + %global pyudevver 0.18 ++%global s390utilscorever 2.31.0 + + BuildArch: noarch + +@@ -70,7 +71,7 @@ Recommends: libblockdev-swap >= %{libblockdevver} + + %ifarch s390 s390x + Recommends: libblockdev-s390 >= %{libblockdevver} +-Requires: s390utils-core ++Requires: s390utils-core >= %{s390utilscorever} + %endif + + Requires: python3-bytesize >= %{libbytesizever} +-- +2.45.2 + diff --git a/python-blivet.spec b/python-blivet.spec index 26bb7d5..15f5292 100644 --- a/python-blivet.spec +++ b/python-blivet.spec @@ -5,7 +5,7 @@ Version: 3.10.0 #%%global prerelease .b2 # prerelease, if defined, should be something like .a1, .b1, .b2.dev1, or .c2 -Release: 4%{?prerelease}%{?dist} +Release: 5%{?prerelease}%{?dist} Epoch: 1 License: LGPL-2.1-or-later %global realname blivet @@ -20,6 +20,7 @@ Patch0: 0001-remove-btrfs-plugin.patch Patch1: 0002-Fix-skipping-btrfs-calls-when-libblockdev-btrfs-plugin-is-missing.patch Patch2: 0003-XFS-resize-test-fix.patch Patch3: 0004-Run-mkfs-xfs-with-force-option-by-default.patch +Patch4: 0005-consolidated-s390-device-configuration.patch # Versions of required components (done so we make sure the buildrequires # match the requires versions of things). @@ -117,6 +118,10 @@ make DESTDIR=%{buildroot} install %{python3_sitelib}/* %changelog +* Tue Jul 16 2024 Vojtech Trefny - 3.10.0-5 +- Consolidated Device Configuration for RHEL 10 + Resolves: RHEL-39381 + * Thu Jun 27 2024 Vojtech Trefny - 3.10.0-4 - tests: Try waiting after partition creation for XFS resize test Resolves: RHEL-45177