python-blivet/0005-consolidated-s390-device-configuration.patch
Vojtech Trefny a866f6aa6d Consolidated Device Configuration for RHEL 10
Resolves: RHEL-39381
2024-07-16 10:42:26 +02:00

743 lines
28 KiB
Diff

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