Consolidated Device Configuration for RHEL 10
Resolves: RHEL-39381
This commit is contained in:
		
							parent
							
								
									f209b60b06
								
							
						
					
					
						commit
						a866f6aa6d
					
				
							
								
								
									
										742
									
								
								0005-consolidated-s390-device-configuration.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										742
									
								
								0005-consolidated-s390-device-configuration.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,742 @@ | |||||||
|  | From 492122f34fe0ee5d0c7bce7f3dd2ce0ca6e3e9f2 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Steffen Maier <maier@linux.ibm.com> | ||||||
|  | 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 <maier@linux.ibm.com> | ||||||
|  | ---
 | ||||||
|  |  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 <maier@linux.ibm.com> | ||||||
|  | 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 <maier@linux.ibm.com> | ||||||
|  | ---
 | ||||||
|  |  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 <maier@linux.ibm.com> | ||||||
|  | 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 <maier@linux.ibm.com> | ||||||
|  | ---
 | ||||||
|  |  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 <maier@linux.ibm.com> | ||||||
|  | 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 <maier@linux.ibm.com> | ||||||
|  | ---
 | ||||||
|  |  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 <maier@linux.ibm.com> | ||||||
|  | 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 <maier@linux.ibm.com> | ||||||
|  | ---
 | ||||||
|  |  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 <maier@linux.ibm.com> | ||||||
|  | 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 <maier@linux.ibm.com> | ||||||
|  | ---
 | ||||||
|  |  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 <maier@linux.ibm.com> | ||||||
|  | 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 <maier@linux.ibm.com> | ||||||
|  | ---
 | ||||||
|  |  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 | ||||||
|  | 
 | ||||||
| @ -5,7 +5,7 @@ Version: 3.10.0 | |||||||
| 
 | 
 | ||||||
| #%%global prerelease .b2 | #%%global prerelease .b2 | ||||||
| # prerelease, if defined, should be something like .a1, .b1, .b2.dev1, or .c2 | # prerelease, if defined, should be something like .a1, .b1, .b2.dev1, or .c2 | ||||||
| Release: 4%{?prerelease}%{?dist} | Release: 5%{?prerelease}%{?dist} | ||||||
| Epoch: 1 | Epoch: 1 | ||||||
| License: LGPL-2.1-or-later | License: LGPL-2.1-or-later | ||||||
| %global realname blivet | %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 | Patch1: 0002-Fix-skipping-btrfs-calls-when-libblockdev-btrfs-plugin-is-missing.patch | ||||||
| Patch2: 0003-XFS-resize-test-fix.patch | Patch2: 0003-XFS-resize-test-fix.patch | ||||||
| Patch3: 0004-Run-mkfs-xfs-with-force-option-by-default.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 | # Versions of required components (done so we make sure the buildrequires | ||||||
| # match the requires versions of things). | # match the requires versions of things). | ||||||
| @ -117,6 +118,10 @@ make DESTDIR=%{buildroot} install | |||||||
| %{python3_sitelib}/* | %{python3_sitelib}/* | ||||||
| 
 | 
 | ||||||
| %changelog | %changelog | ||||||
|  | * Tue Jul 16 2024 Vojtech Trefny <vtrefny@redhat.com> - 3.10.0-5 | ||||||
|  | - Consolidated Device Configuration for RHEL 10 | ||||||
|  |   Resolves: RHEL-39381 | ||||||
|  | 
 | ||||||
| * Thu Jun 27 2024 Vojtech Trefny <vtrefny@redhat.com> - 3.10.0-4 | * Thu Jun 27 2024 Vojtech Trefny <vtrefny@redhat.com> - 3.10.0-4 | ||||||
| - tests: Try waiting after partition creation for XFS resize test | - tests: Try waiting after partition creation for XFS resize test | ||||||
|   Resolves: RHEL-45177 |   Resolves: RHEL-45177 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user