diff --git a/.gitignore b/.gitignore index a37b47e..c9cbb79 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ -SOURCES/blivet-3.6.0-tests.tar.gz -SOURCES/blivet-3.6.0.tar.gz +blivet-3.10.0-tests.tar.gz +blivet-3.10.0.tar.gz diff --git a/0001-remove-btrfs-plugin.patch b/0001-remove-btrfs-plugin.patch new file mode 100644 index 0000000..601517f --- /dev/null +++ b/0001-remove-btrfs-plugin.patch @@ -0,0 +1,28 @@ +From 8b527ee85b6594d506d445ff4c30579cccef8ae6 Mon Sep 17 00:00:00 2001 +From: Vojtech Trefny +Date: Wed, 11 Nov 2020 13:24:55 +0100 +Subject: [PATCH] Remove btrfs from requested libblockdev plugins + +--- + blivet/__init__.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/blivet/__init__.py b/blivet/__init__.py +index 14bd5c61..1410d78e 100644 +--- a/blivet/__init__.py ++++ b/blivet/__init__.py +@@ -63,9 +63,9 @@ gi.require_version("BlockDev", "3.0") + from gi.repository import GLib + from gi.repository import BlockDev as blockdev + if arch.is_s390(): +- _REQUESTED_PLUGIN_NAMES = set(("lvm", "btrfs", "swap", "crypto", "loop", "mdraid", "mpath", "dm", "s390", "nvme", "fs")) ++ _REQUESTED_PLUGIN_NAMES = set(("lvm", "swap", "crypto", "loop", "mdraid", "mpath", "dm", "s390", "nvme", "fs")) + else: +- _REQUESTED_PLUGIN_NAMES = set(("lvm", "btrfs", "swap", "crypto", "loop", "mdraid", "mpath", "dm", "nvme", "fs")) ++ _REQUESTED_PLUGIN_NAMES = set(("lvm", "swap", "crypto", "loop", "mdraid", "mpath", "dm", "nvme", "fs")) + + _requested_plugins = blockdev.plugin_specs_from_names(_REQUESTED_PLUGIN_NAMES) + try: +-- +2.26.2 + diff --git a/0002-Fix-skipping-btrfs-calls-when-libblockdev-btrfs-plugin-is-missing.patch b/0002-Fix-skipping-btrfs-calls-when-libblockdev-btrfs-plugin-is-missing.patch new file mode 100644 index 0000000..cd9bf02 --- /dev/null +++ b/0002-Fix-skipping-btrfs-calls-when-libblockdev-btrfs-plugin-is-missing.patch @@ -0,0 +1,49 @@ +From 95f565d56d21dd7e0d9033236a20be735665e0af Mon Sep 17 00:00:00 2001 +From: Vojtech Trefny +Date: Tue, 14 May 2024 12:35:12 +0200 +Subject: [PATCH] Fix skipping btrfs calls when libblockdev btrfs plugin is + missing + +We need to check for the btrfs plugin in the set of available +plugins, not in the missing plugins, because on RHEL the plugin is +not missing, it's not even requested. +--- + blivet/devices/btrfs.py | 4 ++-- + tests/unit_tests/devices_test/btrfs_test.py | 2 +- + 2 files changed, 3 insertions(+), 3 deletions(-) + +diff --git a/blivet/devices/btrfs.py b/blivet/devices/btrfs.py +index c446e7e59..0cbaa44d9 100644 +--- a/blivet/devices/btrfs.py ++++ b/blivet/devices/btrfs.py +@@ -40,7 +40,7 @@ + from ..formats import get_format, DeviceFormat + from ..size import Size + from ..mounts import mounts_cache +-from .. import missing_plugs ++from .. import avail_plugs + + import logging + log = logging.getLogger("blivet") +@@ -382,7 +382,7 @@ def _list_subvolumes(self, mountpoint, snapshots_only=False): + def list_subvolumes(self, snapshots_only=False): + subvols = [] + +- if "btrfs" in missing_plugs: ++ if "btrfs" not in avail_plugs: + log.debug("not listing btrfs subvolumes, libblockdev btrfs plugin is missing") + return subvols + +diff --git a/tests/unit_tests/devices_test/btrfs_test.py b/tests/unit_tests/devices_test/btrfs_test.py +index 785afd209..41731e91e 100644 +--- a/tests/unit_tests/devices_test/btrfs_test.py ++++ b/tests/unit_tests/devices_test/btrfs_test.py +@@ -83,7 +83,7 @@ def test_btrfs_list_subvolumes(self): + + # mounted but libblockdev btrfs plugin not available + blockdev.reset_mock() +- with patch("blivet.devices.btrfs.missing_plugs", new={"btrfs"}): ++ with patch("blivet.devices.btrfs.avail_plugs", new={"lvm"}): + vol.list_subvolumes() + blockdev.list_subvolumes.assert_not_called() + blockdev.get_default_subvolume_id.assert_not_called() diff --git a/0003-XFS-resize-test-fix.patch b/0003-XFS-resize-test-fix.patch new file mode 100644 index 0000000..b36d8c6 --- /dev/null +++ b/0003-XFS-resize-test-fix.patch @@ -0,0 +1,32 @@ +From b7940496b4f8efdccb9b4097b496b0d9b2af1eea Mon Sep 17 00:00:00 2001 +From: Vojtech Trefny +Date: Tue, 18 Jun 2024 14:47:39 +0200 +Subject: [PATCH] tests: Try waiting after partition creation for XFS resize + test + +The test randomly fails to find the newly created partition so +lets try waiting a bit with udev settle. +--- + tests/storage_tests/formats_test/fs_test.py | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/tests/storage_tests/formats_test/fs_test.py b/tests/storage_tests/formats_test/fs_test.py +index f3c9fef5a..5da4a9339 100644 +--- a/tests/storage_tests/formats_test/fs_test.py ++++ b/tests/storage_tests/formats_test/fs_test.py +@@ -11,6 +11,7 @@ + from blivet.devices import PartitionDevice, DiskDevice + from blivet.flags import flags + from blivet.util import capture_output ++from blivet import udev + + from .loopbackedtestcase import LoopBackedTestCase + +@@ -149,6 +150,7 @@ def _create_partition(self, disk, size): + pend = pstart + int(Size(size) / disk.format.parted_device.sectorSize) + disk.format.add_partition(pstart, pend, parted.PARTITION_NORMAL) + disk.format.parted_disk.commit() ++ udev.settle() + part = disk.format.parted_disk.getPartitionBySector(pstart) + + device = PartitionDevice(os.path.basename(part.path)) diff --git a/0004-Run-mkfs-xfs-with-force-option-by-default.patch b/0004-Run-mkfs-xfs-with-force-option-by-default.patch new file mode 100644 index 0000000..5473e05 --- /dev/null +++ b/0004-Run-mkfs-xfs-with-force-option-by-default.patch @@ -0,0 +1,43 @@ +From 52c9699ecad592e35e0cd3841744f8cb8e2b2364 Mon Sep 17 00:00:00 2001 +From: Vojtech Trefny +Date: Wed, 12 Jun 2024 16:51:43 +0200 +Subject: [PATCH] Run mkfs.xfs with the force (-f) option by default + +We stopped adding the force option when switching to libblockdev +in fa3add214ba8edf1965bc851b85f2f2a6a3ea107. This was not +intentional and the missing force option is already causing issues +when running mkfs.xfs on misaligned devices. +--- + blivet/tasks/fsmkfs.py | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/blivet/tasks/fsmkfs.py b/blivet/tasks/fsmkfs.py +index 096b02295..45314ea89 100644 +--- a/blivet/tasks/fsmkfs.py ++++ b/blivet/tasks/fsmkfs.py +@@ -241,6 +241,7 @@ class FSBlockDevMkfs(task.BasicApplication, FSMkfsTask, metaclass=abc.ABCMeta): + can_set_uuid = False + can_label = False + fstype = None ++ force = False + + def do_task(self, options=None, label=False, set_uuid=False, nodiscard=False): + """Create the format on the device and label if possible and desired. +@@ -277,7 +278,8 @@ def do_task(self, options=None, label=False, set_uuid=False, nodiscard=False): + try: + bd_options = BlockDev.FSMkfsOptions(label=self.fs.label if label else None, + uuid=self.fs.uuid if set_uuid else None, +- no_discard=self.fs._mkfs_nodiscard if nodiscard else False) ++ no_discard=self.fs._mkfs_nodiscard if nodiscard else False, ++ force=self.force) + BlockDev.fs.mkfs(self.fs.device, self.fstype, bd_options, extra={k: '' for k in create_options}) + except BlockDev.FSError as e: + raise FSError(str(e)) +@@ -331,6 +333,7 @@ class XFSMkfs(FSBlockDevMkfs): + can_nodiscard = True + can_set_uuid = True + can_label = True ++ force = True + + + class F2FSMkfs(FSBlockDevMkfs): 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/SOURCES/0001-force-lvm-cli.plugin b/SOURCES/0001-force-lvm-cli.plugin deleted file mode 100644 index 3af1d94..0000000 --- a/SOURCES/0001-force-lvm-cli.plugin +++ /dev/null @@ -1,35 +0,0 @@ -From 83ccc9f9f14845fcce7a5ba5fa21fbb97b1dbbb7 Mon Sep 17 00:00:00 2001 -From: Vojtech Trefny -Date: Wed, 11 Jul 2018 15:36:24 +0200 -Subject: [PATCH] Force command line based libblockdev LVM plugin - ---- - blivet/__init__.py | 9 +++++++-- - 1 file changed, 7 insertions(+), 2 deletions(-) - -diff --git a/blivet/__init__.py b/blivet/__init__.py -index dd8d0f54..62cc539a 100644 ---- a/blivet/__init__.py -+++ b/blivet/__init__.py -@@ -63,11 +63,16 @@ gi.require_version("BlockDev", "2.0") - from gi.repository import GLib - from gi.repository import BlockDev as blockdev - if arch.is_s390(): -- _REQUESTED_PLUGIN_NAMES = set(("lvm", "btrfs", "swap", "crypto", "loop", "mdraid", "mpath", "dm", "s390", "nvdimm")) -+ _REQUESTED_PLUGIN_NAMES = set(("btrfs", "swap", "crypto", "loop", "mdraid", "mpath", "dm", "s390", "nvdimm")) - else: -- _REQUESTED_PLUGIN_NAMES = set(("lvm", "btrfs", "swap", "crypto", "loop", "mdraid", "mpath", "dm", "nvdimm")) -+ _REQUESTED_PLUGIN_NAMES = set(("btrfs", "swap", "crypto", "loop", "mdraid", "mpath", "dm", "nvdimm")) - - _requested_plugins = blockdev.plugin_specs_from_names(_REQUESTED_PLUGIN_NAMES) -+# XXX force non-dbus LVM plugin -+lvm_plugin = blockdev.PluginSpec() -+lvm_plugin.name = blockdev.Plugin.LVM -+lvm_plugin.so_name = "libbd_lvm.so.2" -+_requested_plugins.append(lvm_plugin) - try: - # do not check for dependencies during libblockdev initializtion, do runtime - # checks instead --- -2.38.1 - diff --git a/SOURCES/0002-remove-btrfs-plugin.patch b/SOURCES/0002-remove-btrfs-plugin.patch deleted file mode 100644 index 26182ae..0000000 --- a/SOURCES/0002-remove-btrfs-plugin.patch +++ /dev/null @@ -1,28 +0,0 @@ -From c098d4112635b3ea55d5bd7e1817edbd519735fc Mon Sep 17 00:00:00 2001 -From: Vojtech Trefny -Date: Mon, 16 Jul 2018 14:26:11 +0200 -Subject: [PATCH] Remove btrfs from requested libblockdev plugins - ---- - blivet/__init__.py | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/blivet/__init__.py b/blivet/__init__.py -index 62cc539a..bbc7ea3a 100644 ---- a/blivet/__init__.py -+++ b/blivet/__init__.py -@@ -63,9 +63,9 @@ gi.require_version("BlockDev", "2.0") - from gi.repository import GLib - from gi.repository import BlockDev as blockdev - if arch.is_s390(): -- _REQUESTED_PLUGIN_NAMES = set(("btrfs", "swap", "crypto", "loop", "mdraid", "mpath", "dm", "s390", "nvdimm")) -+ _REQUESTED_PLUGIN_NAMES = set(("swap", "crypto", "loop", "mdraid", "mpath", "dm", "s390", "nvdimm")) - else: -- _REQUESTED_PLUGIN_NAMES = set(("btrfs", "swap", "crypto", "loop", "mdraid", "mpath", "dm", "nvdimm")) -+ _REQUESTED_PLUGIN_NAMES = set(("swap", "crypto", "loop", "mdraid", "mpath", "dm", "nvdimm")) - - _requested_plugins = blockdev.plugin_specs_from_names(_REQUESTED_PLUGIN_NAMES) - # XXX force non-dbus LVM plugin --- -2.38.1 - diff --git a/SOURCES/0003-Revert-More-consistent-lvm-errors.patch b/SOURCES/0003-Revert-More-consistent-lvm-errors.patch deleted file mode 100644 index f6dd209..0000000 --- a/SOURCES/0003-Revert-More-consistent-lvm-errors.patch +++ /dev/null @@ -1,330 +0,0 @@ -From f6f90805020d7c6ac46f17a13a00f319fc4351f6 Mon Sep 17 00:00:00 2001 -From: Vojtech Trefny -Date: Wed, 26 May 2021 12:15:54 +0200 -Subject: [PATCH] Revert "More consistent lvm errors (API break)" - -This reverts commit 49ec071c6d0673224a0774d613904387c52c7381. ---- - blivet/devices/lvm.py | 72 +++++++++++------------ - tests/unit_tests/devices_test/lvm_test.py | 14 ++--- - 2 files changed, 43 insertions(+), 43 deletions(-) - -diff --git a/blivet/devices/lvm.py b/blivet/devices/lvm.py -index 38e49e18..b8595d63 100644 ---- a/blivet/devices/lvm.py -+++ b/blivet/devices/lvm.py -@@ -304,7 +304,7 @@ class LVMVolumeGroupDevice(ContainerDevice): - def _add_log_vol(self, lv): - """ Add an LV to this VG. """ - if lv in self._lvs: -- raise errors.DeviceError("lv is already part of this vg") -+ raise ValueError("lv is already part of this vg") - - # verify we have the space, then add it - # do not verify for growing vg (because of ks) -@@ -337,7 +337,7 @@ class LVMVolumeGroupDevice(ContainerDevice): - def _remove_log_vol(self, lv): - """ Remove an LV from this VG. """ - if lv not in self.lvs: -- raise errors.DeviceError("specified lv is not part of this vg") -+ raise ValueError("specified lv is not part of this vg") - - self._lvs.remove(lv) - -@@ -430,7 +430,7 @@ class LVMVolumeGroupDevice(ContainerDevice): - @thpool_reserve.setter - def thpool_reserve(self, value): - if value is not None and not isinstance(value, ThPoolReserveSpec): -- raise AttributeError("Invalid thpool_reserve given, must be of type ThPoolReserveSpec") -+ raise ValueError("Invalid thpool_reserve given, must be of type ThPoolReserveSpec") - self._thpool_reserve = value - - @property -@@ -665,14 +665,14 @@ class LVMLogicalVolumeBase(DMDevice, RaidDevice): - if seg_type not in [None, "linear", "thin", "thin-pool", "cache", "vdo-pool", "vdo", "cache-pool"] + lvm.raid_seg_types: - raise ValueError("Invalid or unsupported segment type: %s" % seg_type) - if seg_type and seg_type in lvm.raid_seg_types and not pvs: -- raise errors.DeviceError("List of PVs has to be given for every non-linear LV") -+ raise ValueError("List of PVs has to be given for every non-linear LV") - elif (not seg_type or seg_type == "linear") and pvs: - if not all(isinstance(pv, LVPVSpec) for pv in pvs): -- raise errors.DeviceError("Invalid specification of PVs for a linear LV: either no or complete " -- "specification (with all space split into PVs has to be given") -+ raise ValueError("Invalid specification of PVs for a linear LV: either no or complete " -+ "specification (with all space split into PVs has to be given") - elif sum(spec.size for spec in pvs) != size: -- raise errors.DeviceError("Invalid specification of PVs for a linear LV: the sum of space " -- "assigned to PVs is not equal to the size of the LV") -+ raise ValueError("Invalid specification of PVs for a linear LV: the sum of space " -+ "assigned to PVs is not equal to the size of the LV") - - # When this device's format is set in the superclass constructor it will - # try to access self.snapshots. -@@ -721,13 +721,13 @@ class LVMLogicalVolumeBase(DMDevice, RaidDevice): - self._from_lvs = from_lvs - if self._from_lvs: - if exists: -- raise errors.DeviceError("Only new LVs can be created from other LVs") -+ raise ValueError("Only new LVs can be created from other LVs") - if size or maxsize or percent: -- raise errors.DeviceError("Cannot specify size for a converted LV") -+ raise ValueError("Cannot specify size for a converted LV") - if fmt: -- raise errors.DeviceError("Cannot specify format for a converted LV") -+ raise ValueError("Cannot specify format for a converted LV") - if any(lv.vg != self.vg for lv in self._from_lvs): -- raise errors.DeviceError("Conversion of LVs only possible inside a VG") -+ raise ValueError("Conversion of LVs only possible inside a VG") - - self._cache = None - if cache_request and not self.exists: -@@ -746,13 +746,13 @@ class LVMLogicalVolumeBase(DMDevice, RaidDevice): - elif isinstance(pv_spec, StorageDevice): - self._pv_specs.append(LVPVSpec(pv_spec, Size(0))) - else: -- raise AttributeError("Invalid PV spec '%s' for the '%s' LV" % (pv_spec, self.name)) -+ raise ValueError("Invalid PV spec '%s' for the '%s' LV" % (pv_spec, self.name)) - # Make sure any destination PVs are actually PVs in this VG - if not set(spec.pv for spec in self._pv_specs).issubset(set(self.vg.parents)): - missing = [r.name for r in - set(spec.pv for spec in self._pv_specs).difference(set(self.vg.parents))] - msg = "invalid destination PV(s) %s for LV %s" % (missing, self.name) -- raise errors.DeviceError(msg) -+ raise ValueError(msg) - if self._pv_specs: - self._assign_pv_space() - -@@ -1130,7 +1130,7 @@ class LVMLogicalVolumeBase(DMDevice, RaidDevice): - else: - msg = "the specified internal LV '%s' doesn't belong to this LV ('%s')" % (int_lv.lv_name, - self.name) -- raise errors.DeviceError(msg) -+ raise ValueError(msg) - - def populate_ksdata(self, data): - super(LVMLogicalVolumeBase, self).populate_ksdata(data) -@@ -1229,7 +1229,7 @@ class LVMInternalLogicalVolumeMixin(object): - def _init_check(self): - # an internal LV should have no parents - if self._parent_lv and self._parents: -- raise errors.DeviceError("an internal LV should have no parents") -+ raise ValueError("an internal LV should have no parents") - - @property - def is_internal_lv(self): -@@ -1289,7 +1289,7 @@ class LVMInternalLogicalVolumeMixin(object): - - @readonly.setter - def readonly(self, value): # pylint: disable=unused-argument -- raise errors.DeviceError("Cannot make an internal LV read-write") -+ raise ValueError("Cannot make an internal LV read-write") - - @property - def type(self): -@@ -1325,7 +1325,7 @@ class LVMInternalLogicalVolumeMixin(object): - def _check_parents(self): - # an internal LV should have no parents - if self._parents: -- raise errors.DeviceError("an internal LV should have no parents") -+ raise ValueError("an internal LV should have no parents") - - def _add_to_parents(self): - # nothing to do here, an internal LV has no parents (in the DeviceTree's -@@ -1335,13 +1335,13 @@ class LVMInternalLogicalVolumeMixin(object): - # internal LVs follow different rules limitting size - def _set_size(self, newsize): - if not isinstance(newsize, Size): -- raise AttributeError("new size must of type Size") -+ raise ValueError("new size must of type Size") - - if not self.takes_extra_space: - if newsize <= self.parent_lv.size: # pylint: disable=no-member - self._size = newsize # pylint: disable=attribute-defined-outside-init - else: -- raise errors.DeviceError("Internal LV cannot be bigger than its parent LV") -+ raise ValueError("Internal LV cannot be bigger than its parent LV") - else: - # same rules apply as for any other LV - raise NotTypeSpecific() -@@ -1419,18 +1419,18 @@ class LVMSnapshotMixin(object): - return - - if self.origin and not isinstance(self.origin, LVMLogicalVolumeDevice): -- raise errors.DeviceError("lvm snapshot origin must be a logical volume") -+ raise ValueError("lvm snapshot origin must be a logical volume") - if self.vorigin and not self.exists: -- raise errors.DeviceError("only existing vorigin snapshots are supported") -+ raise ValueError("only existing vorigin snapshots are supported") - - if isinstance(self.origin, LVMLogicalVolumeDevice) and \ - isinstance(self.parents[0], LVMVolumeGroupDevice) and \ - self.origin.vg != self.parents[0]: -- raise errors.DeviceError("lvm snapshot and origin must be in the same vg") -+ raise ValueError("lvm snapshot and origin must be in the same vg") - - if self.is_thin_lv: - if self.origin and self.size and not self.exists: -- raise errors.DeviceError("thin snapshot size is determined automatically") -+ raise ValueError("thin snapshot size is determined automatically") - - @property - def is_snapshot_lv(self): -@@ -1606,7 +1606,7 @@ class LVMThinPoolMixin(object): - def _check_from_lvs(self): - if self._from_lvs: - if len(self._from_lvs) != 2: -- raise errors.DeviceError("two LVs required to create a thin pool") -+ raise ValueError("two LVs required to create a thin pool") - - def _convert_from_lvs(self): - data_lv, metadata_lv = self._from_lvs -@@ -1652,7 +1652,7 @@ class LVMThinPoolMixin(object): - def _add_log_vol(self, lv): - """ Add an LV to this pool. """ - if lv in self._lvs: -- raise errors.DeviceError("lv is already part of this vg") -+ raise ValueError("lv is already part of this vg") - - # TODO: add some checking to prevent overcommit for preexisting - self.vg._add_log_vol(lv) -@@ -1663,7 +1663,7 @@ class LVMThinPoolMixin(object): - def _remove_log_vol(self, lv): - """ Remove an LV from this pool. """ - if lv not in self._lvs: -- raise errors.DeviceError("specified lv is not part of this vg") -+ raise ValueError("specified lv is not part of this vg") - - self._lvs.remove(lv) - self.vg._remove_log_vol(lv) -@@ -1772,14 +1772,14 @@ class LVMThinLogicalVolumeMixin(object): - """Check that this device has parents as expected""" - if isinstance(self.parents, (list, ParentList)): - if len(self.parents) != 1: -- raise errors.DeviceError("constructor requires a single thin-pool LV") -+ raise ValueError("constructor requires a single thin-pool LV") - - container = self.parents[0] - else: - container = self.parents - - if not container or not isinstance(container, LVMLogicalVolumeDevice) or not container.is_thin_pool: -- raise errors.DeviceError("constructor requires a thin-pool LV") -+ raise ValueError("constructor requires a thin-pool LV") - - @property - def is_thin_lv(self): -@@ -1816,7 +1816,7 @@ class LVMThinLogicalVolumeMixin(object): - - def _set_size(self, newsize): - if not isinstance(newsize, Size): -- raise AttributeError("new size must of type Size") -+ raise ValueError("new size must of type Size") - - newsize = self.vg.align(newsize) - newsize = self.vg.align(util.numeric_type(newsize)) -@@ -2499,7 +2499,7 @@ class LVMLogicalVolumeDevice(LVMLogicalVolumeBase, LVMInternalLogicalVolumeMixin - container = self.parents - - if not isinstance(container, LVMVolumeGroupDevice): -- raise AttributeError("constructor requires a LVMVolumeGroupDevice") -+ raise ValueError("constructor requires a LVMVolumeGroupDevice") - - @type_specific - def _add_to_parents(self): -@@ -2510,12 +2510,12 @@ class LVMLogicalVolumeDevice(LVMLogicalVolumeBase, LVMInternalLogicalVolumeMixin - @type_specific - def _check_from_lvs(self): - """Check the LVs to create this LV from""" -- raise errors.DeviceError("Cannot create a new LV of type '%s' from other LVs" % self.seg_type) -+ raise ValueError("Cannot create a new LV of type '%s' from other LVs" % self.seg_type) - - @type_specific - def _convert_from_lvs(self): - """Convert the LVs to create this LV from into its internal LVs""" -- raise errors.DeviceError("Cannot create a new LV of type '%s' from other LVs" % self.seg_type) -+ raise ValueError("Cannot create a new LV of type '%s' from other LVs" % self.seg_type) - - @property - def external_dependencies(self): -@@ -2535,7 +2535,7 @@ class LVMLogicalVolumeDevice(LVMLogicalVolumeBase, LVMInternalLogicalVolumeMixin - @type_specific - def _set_size(self, newsize): - if not isinstance(newsize, Size): -- raise AttributeError("new size must be of type Size") -+ raise ValueError("new size must be of type Size") - - newsize = self.vg.align(newsize) - log.debug("trying to set lv %s size to %s", self.name, newsize) -@@ -2544,7 +2544,7 @@ class LVMLogicalVolumeDevice(LVMLogicalVolumeBase, LVMInternalLogicalVolumeMixin - # space for it. A similar reasoning applies to shrinking the LV. - if not self.exists and newsize > self.size and newsize > self.vg.free_space + self.vg_space_used: - log.error("failed to set size: %s short", newsize - (self.vg.free_space + self.vg_space_used)) -- raise errors.DeviceError("not enough free space in volume group") -+ raise ValueError("not enough free space in volume group") - - LVMLogicalVolumeBase._set_size(self, newsize) - -@@ -2910,7 +2910,7 @@ class LVMCache(Cache): - spec.size = spec.pv.format.free - space_to_assign -= spec.pv.format.free - if space_to_assign > 0: -- raise errors.DeviceError("Not enough free space in the PVs for this cache: %s short" % space_to_assign) -+ raise ValueError("Not enough free space in the PVs for this cache: %s short" % space_to_assign) - - @property - def size(self): -diff --git a/tests/unit_tests/devices_test/lvm_test.py b/tests/unit_tests/devices_test/lvm_test.py -index 47613fdc..995c2da4 100644 ---- a/tests/unit_tests/devices_test/lvm_test.py -+++ b/tests/unit_tests/devices_test/lvm_test.py -@@ -32,10 +32,10 @@ class LVMDeviceTest(unittest.TestCase): - lv = LVMLogicalVolumeDevice("testlv", parents=[vg], - fmt=blivet.formats.get_format("xfs")) - -- with six.assertRaisesRegex(self, errors.DeviceError, "lvm snapshot origin must be a logical volume"): -+ with six.assertRaisesRegex(self, ValueError, "lvm snapshot origin must be a logical volume"): - LVMLogicalVolumeDevice("snap1", parents=[vg], origin=pv) - -- with six.assertRaisesRegex(self, errors.DeviceError, "only existing vorigin snapshots are supported"): -+ with six.assertRaisesRegex(self, ValueError, "only existing vorigin snapshots are supported"): - LVMLogicalVolumeDevice("snap1", parents=[vg], vorigin=True) - - lv.exists = True -@@ -60,7 +60,7 @@ class LVMDeviceTest(unittest.TestCase): - pool = LVMLogicalVolumeDevice("pool1", parents=[vg], size=Size("500 MiB"), seg_type="thin-pool") - thinlv = LVMLogicalVolumeDevice("thinlv", parents=[pool], size=Size("200 MiB"), seg_type="thin") - -- with six.assertRaisesRegex(self, errors.DeviceError, "lvm snapshot origin must be a logical volume"): -+ with six.assertRaisesRegex(self, ValueError, "lvm snapshot origin must be a logical volume"): - LVMLogicalVolumeDevice("snap1", parents=[pool], origin=pv, seg_type="thin") - - # now make the constructor succeed so we can test some properties -@@ -310,21 +310,21 @@ class LVMDeviceTest(unittest.TestCase): - vg = LVMVolumeGroupDevice("testvg", parents=[pv, pv2]) - - # pvs have to be specified for non-linear LVs -- with self.assertRaises(errors.DeviceError): -+ with self.assertRaises(ValueError): - lv = LVMLogicalVolumeDevice("testlv", parents=[vg], size=Size("512 MiB"), - fmt=blivet.formats.get_format("xfs"), - exists=False, seg_type="raid1") -- with self.assertRaises(errors.DeviceError): -+ with self.assertRaises(ValueError): - lv = LVMLogicalVolumeDevice("testlv", parents=[vg], size=Size("512 MiB"), - fmt=blivet.formats.get_format("xfs"), - exists=False, seg_type="striped") - - # no or complete specification has to be given for linear LVs -- with self.assertRaises(errors.DeviceError): -+ with self.assertRaises(ValueError): - lv = LVMLogicalVolumeDevice("testlv", parents=[vg], size=Size("512 MiB"), - fmt=blivet.formats.get_format("xfs"), - exists=False, pvs=[pv]) -- with self.assertRaises(errors.DeviceError): -+ with self.assertRaises(ValueError): - pv_spec = LVPVSpec(pv, Size("256 MiB")) - pv_spec2 = LVPVSpec(pv2, Size("250 MiB")) - lv = LVMLogicalVolumeDevice("testlv", parents=[vg], size=Size("512 MiB"), --- -2.38.1 - diff --git a/SOURCES/0004-Revert-Terminology-cleanups.patch b/SOURCES/0004-Revert-Terminology-cleanups.patch deleted file mode 100644 index 8260a44..0000000 --- a/SOURCES/0004-Revert-Terminology-cleanups.patch +++ /dev/null @@ -1,899 +0,0 @@ -From d8a8d96450bf0d3458671b9b7d23d972aa540396 Mon Sep 17 00:00:00 2001 -From: Vojtech Trefny -Date: Wed, 26 May 2021 12:27:34 +0200 -Subject: [PATCH] Revert "Terminology cleanups" - -This reverts following commits: -- 3d46339fe9cf12e9082fcbe4dc5acc9f92617e8d -- 63c9c7165e5cdfa4a47dcf0ed9d717b71e7921f2 -- 8956b9af8a785ae25e0e7153d2ef0702ce2f567c ---- - blivet/devicefactory.py | 24 +++---- - blivet/devices/dm.py | 9 ++- - blivet/devices/loop.py | 20 +++--- - blivet/devices/luks.py | 26 ++++--- - blivet/errors.py | 2 +- - blivet/partitioning.py | 22 +++++- - blivet/populator/helpers/dm.py | 4 +- - blivet/populator/helpers/luks.py | 4 +- - blivet/populator/helpers/lvm.py | 2 +- - blivet/populator/helpers/mdraid.py | 14 ++-- - blivet/populator/helpers/multipath.py | 8 +-- - blivet/populator/populator.py | 67 ++++++++++--------- - blivet/threads.py | 3 +- - blivet/udev.py | 34 +++++----- - tests/unit_tests/devicefactory_test.py | 10 +-- - .../devices_test/device_size_test.py | 6 +- - tests/unit_tests/populator_test.py | 34 +++++----- - tests/unit_tests/udev_test.py | 12 ++-- - tests/vmtests/vmbackedtestcase.py | 2 +- - 19 files changed, 167 insertions(+), 136 deletions(-) - -diff --git a/blivet/devicefactory.py b/blivet/devicefactory.py -index 6f460f6d..90082c28 100644 ---- a/blivet/devicefactory.py -+++ b/blivet/devicefactory.py -@@ -859,12 +859,12 @@ class DeviceFactory(object): - parent_container.parents.remove(orig_device) - - if self.encrypted and isinstance(self.device, LUKSDevice) and \ -- self.raw_device.format.luks_version != self.luks_version: -- self.raw_device.format.luks_version = self.luks_version -+ self.device.slave.format.luks_version != self.luks_version: -+ self.device.slave.format.luks_version = self.luks_version - - if self.encrypted and isinstance(self.device, LUKSDevice) and \ -- self.raw_device.format.luks_sector_size != self.luks_sector_size: -- self.raw_device.format.luks_sector_size = self.luks_sector_size -+ self.device.slave.format.luks_sector_size != self.luks_sector_size: -+ self.device.slave.format.luks_sector_size = self.luks_sector_size - - def _set_name(self): - if not self.device_name: -@@ -1201,11 +1201,11 @@ class PartitionSetFactory(PartitionFactory): - container.parents.remove(member) - self.storage.destroy_device(member) - members.remove(member) -- self.storage.format_device(member.raw_device, -+ self.storage.format_device(member.slave, - get_format(self.fstype)) -- members.append(member.raw_device) -+ members.append(member.slave) - if container: -- container.parents.append(member.raw_device) -+ container.parents.append(member.slave) - - continue - -@@ -1227,10 +1227,10 @@ class PartitionSetFactory(PartitionFactory): - - continue - -- if member_encrypted and self.encrypted and self.luks_version != member.raw_device.format.luks_version: -- member.raw_device.format.luks_version = self.luks_version -- if member_encrypted and self.encrypted and self.luks_sector_size != member.raw_device.format.luks_sector_size: -- member.raw_device.format.luks_sector_size = self.luks_sector_size -+ if member_encrypted and self.encrypted and self.luks_version != member.slave.format.luks_version: -+ member.slave.format.luks_version = self.luks_version -+ if member_encrypted and self.encrypted and self.luks_sector_size != member.slave.format.luks_sector_size: -+ member.slave.format.luks_sector_size = self.luks_sector_size - - ## - # Prepare previously allocated member partitions for reallocation. -@@ -1290,7 +1290,7 @@ class PartitionSetFactory(PartitionFactory): - - if isinstance(member, LUKSDevice): - self.storage.destroy_device(member) -- member = member.raw_device -+ member = member.slave - - self.storage.destroy_device(member) - -diff --git a/blivet/devices/dm.py b/blivet/devices/dm.py -index 2f936170..ae25e8e6 100644 ---- a/blivet/devices/dm.py -+++ b/blivet/devices/dm.py -@@ -154,6 +154,11 @@ class DMDevice(StorageDevice): - log_method_call(self, self.name, status=self.status) - super(DMDevice, self)._set_name(value) - -+ @property -+ def slave(self): -+ """ This device's backing device. """ -+ return self.parents[0] -+ - - class DMLinearDevice(DMDevice): - _type = "dm-linear" -@@ -189,8 +194,8 @@ class DMLinearDevice(DMDevice): - """ Open, or set up, a device. """ - log_method_call(self, self.name, orig=orig, status=self.status, - controllable=self.controllable) -- parent_length = self.parents[0].current_size / LINUX_SECTOR_SIZE -- blockdev.dm.create_linear(self.name, self.parents[0].path, parent_length, -+ slave_length = self.slave.current_size / LINUX_SECTOR_SIZE -+ blockdev.dm.create_linear(self.name, self.slave.path, slave_length, - self.dm_uuid) - - def _post_setup(self): -diff --git a/blivet/devices/loop.py b/blivet/devices/loop.py -index 0f4d7775..78f88d7d 100644 ---- a/blivet/devices/loop.py -+++ b/blivet/devices/loop.py -@@ -73,7 +73,7 @@ class LoopDevice(StorageDevice): - - def update_name(self): - """ Update this device's name. """ -- if not self.parents[0].status: -+ if not self.slave.status: - # if the backing device is inactive, so are we - return self.name - -@@ -81,7 +81,7 @@ class LoopDevice(StorageDevice): - # if our name is loopN we must already be active - return self.name - -- name = blockdev.loop.get_loop_name(self.parents[0].path) -+ name = blockdev.loop.get_loop_name(self.slave.path) - if name.startswith("loop"): - self.name = name - -@@ -89,24 +89,24 @@ class LoopDevice(StorageDevice): - - @property - def status(self): -- return (self.parents[0].status and -+ return (self.slave.status and - self.name.startswith("loop") and -- blockdev.loop.get_loop_name(self.parents[0].path) == self.name) -+ blockdev.loop.get_loop_name(self.slave.path) == self.name) - - @property - def size(self): -- return self.parents[0].size -+ return self.slave.size - - def _pre_setup(self, orig=False): -- if not os.path.exists(self.parents[0].path): -- raise errors.DeviceError("specified file (%s) does not exist" % self.parents[0].path) -+ if not os.path.exists(self.slave.path): -+ raise errors.DeviceError("specified file (%s) does not exist" % self.slave.path) - return StorageDevice._pre_setup(self, orig=orig) - - def _setup(self, orig=False): - """ Open, or set up, a device. """ - log_method_call(self, self.name, orig=orig, status=self.status, - controllable=self.controllable) -- blockdev.loop.setup(self.parents[0].path) -+ blockdev.loop.setup(self.slave.path) - - def _post_setup(self): - StorageDevice._post_setup(self) -@@ -123,3 +123,7 @@ class LoopDevice(StorageDevice): - StorageDevice._post_teardown(self, recursive=recursive) - self.name = "tmploop%d" % self.id - self.sysfs_path = '' -+ -+ @property -+ def slave(self): -+ return self.parents[0] -diff --git a/blivet/devices/luks.py b/blivet/devices/luks.py -index 2eb1f130..5ab840ea 100644 ---- a/blivet/devices/luks.py -+++ b/blivet/devices/luks.py -@@ -66,13 +66,17 @@ class LUKSDevice(DMCryptDevice): - - @property - def raw_device(self): -+ return self.slave -+ -+ @property -+ def slave(self): - if self._has_integrity: - return self.parents[0].parents[0] - return self.parents[0] - - def _get_size(self): - if not self.exists: -- size = self.raw_device.size - crypto.LUKS_METADATA_SIZE -+ size = self.slave.size - crypto.LUKS_METADATA_SIZE - elif self.resizable and self.target_size != Size(0): - size = self.target_size - else: -@@ -80,8 +84,8 @@ class LUKSDevice(DMCryptDevice): - return size - - def _set_size(self, newsize): -- if not self.exists and not self.raw_device.exists: -- self.raw_device.size = newsize + crypto.LUKS_METADATA_SIZE -+ if not self.exists and not self.slave.exists: -+ self.slave.size = newsize + crypto.LUKS_METADATA_SIZE - - # just run the StorageDevice._set_size to make sure we are in the format limits - super(LUKSDevice, self)._set_size(newsize - crypto.LUKS_METADATA_SIZE) -@@ -108,22 +112,22 @@ class LUKSDevice(DMCryptDevice): - raise ValueError("size is smaller than the minimum for this device") - - # don't allow larger luks than size (or target size) of backing device -- if newsize > (self.raw_device.size - crypto.LUKS_METADATA_SIZE): -+ if newsize > (self.slave.size - crypto.LUKS_METADATA_SIZE): - log.error("requested size %s is larger than size of the backing device %s", -- newsize, self.raw_device.size) -+ newsize, self.slave.size) - raise ValueError("size is larger than the size of the backing device") - - if self.align_target_size(newsize) != newsize: - raise ValueError("new size would violate alignment requirements") - - def _get_target_size(self): -- return self.raw_device.format.target_size -+ return self.slave.format.target_size - - @property - def max_size(self): - """ The maximum size this luks device can be. Maximum is based on the - maximum size of the backing device. """ -- max_luks = self.raw_device.max_size - crypto.LUKS_METADATA_SIZE -+ max_luks = self.slave.max_size - crypto.LUKS_METADATA_SIZE - max_format = self.format.max_size - return min(max_luks, max_format) if max_format else max_luks - -@@ -131,7 +135,7 @@ class LUKSDevice(DMCryptDevice): - def resizable(self): - """ Can this device be resized? """ - return (self._resizable and self.exists and self.format.resizable and -- self.raw_device.resizable and not self._has_integrity) -+ self.slave.resizable and not self._has_integrity) - - def resize(self): - # size of LUKSDevice depends on size of the LUKS format on backing -@@ -139,7 +143,7 @@ class LUKSDevice(DMCryptDevice): - log_method_call(self, self.name, status=self.status) - - def _post_create(self): -- self.name = self.raw_device.format.map_name -+ self.name = self.slave.format.map_name - StorageDevice._post_create(self) - - def _post_teardown(self, recursive=False): -@@ -162,10 +166,10 @@ class LUKSDevice(DMCryptDevice): - self.name = new_name - - def dracut_setup_args(self): -- return set(["rd.luks.uuid=luks-%s" % self.raw_device.format.uuid]) -+ return set(["rd.luks.uuid=luks-%s" % self.slave.format.uuid]) - - def populate_ksdata(self, data): -- self.raw_device.populate_ksdata(data) -+ self.slave.populate_ksdata(data) - data.encrypted = True - super(LUKSDevice, self).populate_ksdata(data) - -diff --git a/blivet/errors.py b/blivet/errors.py -index b886ffec..30c9921a 100644 ---- a/blivet/errors.py -+++ b/blivet/errors.py -@@ -201,7 +201,7 @@ class DeviceTreeError(StorageError): - pass - - --class NoParentsError(DeviceTreeError): -+class NoSlavesError(DeviceTreeError): - pass - - -diff --git a/blivet/partitioning.py b/blivet/partitioning.py -index ce77e4eb..2cd6554c 100644 ---- a/blivet/partitioning.py -+++ b/blivet/partitioning.py -@@ -32,7 +32,7 @@ import _ped - - from .errors import DeviceError, PartitioningError, AlignmentError - from .flags import flags --from .devices import Device, PartitionDevice, device_path_to_name -+from .devices import Device, PartitionDevice, LUKSDevice, device_path_to_name - from .size import Size - from .i18n import _ - from .util import stringize, unicodeize, compare -@@ -1635,7 +1635,15 @@ class TotalSizeSet(object): - :param size: the target combined size - :type size: :class:`~.size.Size` - """ -- self.devices = [d.raw_device for d in devices] -+ self.devices = [] -+ for device in devices: -+ if isinstance(device, LUKSDevice): -+ partition = device.slave -+ else: -+ partition = device -+ -+ self.devices.append(partition) -+ - self.size = size - - self.requests = [] -@@ -1673,7 +1681,15 @@ class SameSizeSet(object): - :keyword max_size: the maximum size for growable devices - :type max_size: :class:`~.size.Size` - """ -- self.devices = [d.raw_device for d in devices] -+ self.devices = [] -+ for device in devices: -+ if isinstance(device, LUKSDevice): -+ partition = device.slave -+ else: -+ partition = device -+ -+ self.devices.append(partition) -+ - self.size = size / len(devices) - self.grow = grow - self.max_size = max_size -diff --git a/blivet/populator/helpers/dm.py b/blivet/populator/helpers/dm.py -index 4721390e..0ad065e2 100644 ---- a/blivet/populator/helpers/dm.py -+++ b/blivet/populator/helpers/dm.py -@@ -47,13 +47,13 @@ class DMDevicePopulator(DevicePopulator): - name = udev.device_get_name(self.data) - log_method_call(self, name=name) - sysfs_path = udev.device_get_sysfs_path(self.data) -- parent_devices = self._devicetree._add_parent_devices(self.data) -+ slave_devices = self._devicetree._add_slave_devices(self.data) - device = self._devicetree.get_device_by_name(name) - - if device is None: - device = DMDevice(name, dm_uuid=self.data.get('DM_UUID'), - sysfs_path=sysfs_path, exists=True, -- parents=[parent_devices[0]]) -+ parents=[slave_devices[0]]) - device.protected = True - device.controllable = False - self._devicetree._add_device(device) -diff --git a/blivet/populator/helpers/luks.py b/blivet/populator/helpers/luks.py -index 3221122a..9b5023f8 100644 ---- a/blivet/populator/helpers/luks.py -+++ b/blivet/populator/helpers/luks.py -@@ -43,7 +43,7 @@ class LUKSDevicePopulator(DevicePopulator): - return udev.device_is_dm_luks(data) - - def run(self): -- parents = self._devicetree._add_parent_devices(self.data) -+ parents = self._devicetree._add_slave_devices(self.data) - device = LUKSDevice(udev.device_get_name(self.data), - sysfs_path=udev.device_get_sysfs_path(self.data), - parents=parents, -@@ -58,7 +58,7 @@ class IntegrityDevicePopulator(DevicePopulator): - return udev.device_is_dm_integrity(data) - - def run(self): -- parents = self._devicetree._add_parent_devices(self.data) -+ parents = self._devicetree._add_slave_devices(self.data) - name = udev.device_get_name(self.data) - - try: -diff --git a/blivet/populator/helpers/lvm.py b/blivet/populator/helpers/lvm.py -index 6ef2f417..b549e8d3 100644 ---- a/blivet/populator/helpers/lvm.py -+++ b/blivet/populator/helpers/lvm.py -@@ -58,7 +58,7 @@ class LVMDevicePopulator(DevicePopulator): - log.warning("found non-vg device with name %s", vg_name) - device = None - -- self._devicetree._add_parent_devices(self.data) -+ self._devicetree._add_slave_devices(self.data) - - # LVM provides no means to resolve conflicts caused by duplicated VG - # names, so we're just being optimistic here. Woo! -diff --git a/blivet/populator/helpers/mdraid.py b/blivet/populator/helpers/mdraid.py -index a7602d20..9bec11ef 100644 ---- a/blivet/populator/helpers/mdraid.py -+++ b/blivet/populator/helpers/mdraid.py -@@ -31,7 +31,7 @@ from ... import udev - from ...devicelibs import raid - from ...devices import MDRaidArrayDevice, MDContainerDevice - from ...devices import device_path_to_name --from ...errors import DeviceError, NoParentsError -+from ...errors import DeviceError, NoSlavesError - from ...flags import flags - from ...storage_log import log_method_call - from .devicepopulator import DevicePopulator -@@ -52,12 +52,12 @@ class MDDevicePopulator(DevicePopulator): - log_method_call(self, name=name) - - try: -- self._devicetree._add_parent_devices(self.data) -- except NoParentsError: -- log.error("no parents found for mdarray %s, skipping", name) -+ self._devicetree._add_slave_devices(self.data) -+ except NoSlavesError: -+ log.error("no slaves found for mdarray %s, skipping", name) - return None - -- # try to get the device again now that we've got all the parents -+ # try to get the device again now that we've got all the slaves - device = self._devicetree.get_device_by_name(name, incomplete=flags.allow_imperfect_devices) - - if device is None: -@@ -74,8 +74,8 @@ class MDDevicePopulator(DevicePopulator): - device.name = name - - if device is None: -- # if we get here, we found all of the parent devices and -- # something must be wrong -- if all of the parents are in -+ # if we get here, we found all of the slave devices and -+ # something must be wrong -- if all of the slaves are in - # the tree, this device should be as well - if name is None: - name = udev.device_get_name(self.data) -diff --git a/blivet/populator/helpers/multipath.py b/blivet/populator/helpers/multipath.py -index 96c0a9ad..10c745bf 100644 ---- a/blivet/populator/helpers/multipath.py -+++ b/blivet/populator/helpers/multipath.py -@@ -40,13 +40,13 @@ class MultipathDevicePopulator(DevicePopulator): - name = udev.device_get_name(self.data) - log_method_call(self, name=name) - -- parent_devices = self._devicetree._add_parent_devices(self.data) -+ slave_devices = self._devicetree._add_slave_devices(self.data) - - device = None -- if parent_devices: -- device = MultipathDevice(name, parents=parent_devices, -+ if slave_devices: -+ device = MultipathDevice(name, parents=slave_devices, - sysfs_path=udev.device_get_sysfs_path(self.data), -- wwn=parent_devices[0].wwn) -+ wwn=slave_devices[0].wwn) - self._devicetree._add_device(device) - - return device -diff --git a/blivet/populator/populator.py b/blivet/populator/populator.py -index 3a419418..068270b2 100644 ---- a/blivet/populator/populator.py -+++ b/blivet/populator/populator.py -@@ -31,7 +31,7 @@ gi.require_version("BlockDev", "2.0") - - from gi.repository import BlockDev as blockdev - --from ..errors import DeviceError, DeviceTreeError, NoParentsError -+from ..errors import DeviceError, DeviceTreeError, NoSlavesError - from ..devices import DMLinearDevice, DMRaidArrayDevice - from ..devices import FileDevice, LoopDevice - from ..devices import MDRaidArrayDevice -@@ -92,55 +92,56 @@ class PopulatorMixin(object): - - self._cleanup = False - -- def _add_parent_devices(self, info): -- """ Add all parents of a device, raising DeviceTreeError on failure. -+ def _add_slave_devices(self, info): -+ """ Add all slaves of a device, raising DeviceTreeError on failure. - - :param :class:`pyudev.Device` info: the device's udev info -- :raises: :class:`~.errors.DeviceTreeError if no parents are found or -- if we fail to add any parent -- :returns: a list of parent devices -+ :raises: :class:`~.errors.DeviceTreeError if no slaves are found or -+ if we fail to add any slave -+ :returns: a list of slave devices - :rtype: list of :class:`~.StorageDevice` - """ - name = udev.device_get_name(info) - sysfs_path = udev.device_get_sysfs_path(info) -- parent_dir = os.path.normpath("%s/slaves" % sysfs_path) -- parent_names = os.listdir(parent_dir) -- parent_devices = [] -- if not parent_names: -- log.error("no parents found for %s", name) -- raise NoParentsError("no parents found for device %s" % name) -- -- for parent_name in parent_names: -- path = os.path.normpath("%s/%s" % (parent_dir, parent_name)) -- parent_info = udev.get_device(os.path.realpath(path)) -- -- if not parent_info: -- msg = "unable to get udev info for %s" % parent_name -+ slave_dir = os.path.normpath("%s/slaves" % sysfs_path) -+ slave_names = os.listdir(slave_dir) -+ slave_devices = [] -+ if not slave_names: -+ log.error("no slaves found for %s", name) -+ raise NoSlavesError("no slaves found for device %s" % name) -+ -+ for slave_name in slave_names: -+ path = os.path.normpath("%s/%s" % (slave_dir, slave_name)) -+ slave_info = udev.get_device(os.path.realpath(path)) -+ -+ if not slave_info: -+ msg = "unable to get udev info for %s" % slave_name - raise DeviceTreeError(msg) - - # cciss in sysfs is "cciss!cXdYpZ" but we need "cciss/cXdYpZ" -- parent_name = udev.device_get_name(parent_info).replace("!", "/") -- -- parent_dev = self.get_device_by_name(parent_name) -- if not parent_dev and parent_info: -- # we haven't scanned the parent yet, so do it now -- self.handle_device(parent_info) -- parent_dev = self.get_device_by_name(parent_name) -- if parent_dev is None: -+ slave_name = udev.device_get_name(slave_info).replace("!", "/") -+ -+ slave_dev = self.get_device_by_name(slave_name) -+ if not slave_dev and slave_info: -+ # we haven't scanned the slave yet, so do it now -+ self.handle_device(slave_info) -+ slave_dev = self.get_device_by_name(slave_name) -+ if slave_dev is None: - if udev.device_is_dm_lvm(info): -- if parent_name not in lvs_info.cache: -+ if slave_name not in lvs_info.cache: - # we do not expect hidden lvs to be in the tree - continue - -- # if the current parent is still not in -+ # if the current slave is still not in - # the tree, something has gone wrong -- log.error("failure scanning device %s: could not add parent %s", name, parent_name) -- msg = "failed to add parent %s of device %s" % (parent_name, name) -+ log.error("failure scanning device %s: could not add slave %s", name, slave_name) -+ msg = "failed to add slave %s of device %s" % (slave_name, -+ name) - raise DeviceTreeError(msg) - -- parent_devices.append(parent_dev) -+ slave_devices.append(slave_dev) - -- return parent_devices -+ return slave_devices - - def _add_name(self, name): - if name not in self.names: -diff --git a/blivet/threads.py b/blivet/threads.py -index 5e2dff3f..1a5cc6db 100644 ---- a/blivet/threads.py -+++ b/blivet/threads.py -@@ -63,11 +63,12 @@ class SynchronizedMeta(type): - """ - def __new__(cls, name, bases, dct): - new_dct = {} -+ blacklist = dct.get('_unsynchronized_methods', []) - - for n in dct: - obj = dct[n] - # Do not decorate class or static methods. -- if n in dct.get('_unsynchronized_methods', []): -+ if n in blacklist: - pass - elif isinstance(obj, FunctionType): - obj = exclusive(obj) -diff --git a/blivet/udev.py b/blivet/udev.py -index efbc53d6..ddc49a37 100644 ---- a/blivet/udev.py -+++ b/blivet/udev.py -@@ -39,7 +39,7 @@ from gi.repository import BlockDev as blockdev - global_udev = pyudev.Context() - log = logging.getLogger("blivet") - --ignored_device_names = [] -+device_name_blacklist = [] - """ device name regexes to ignore; this should be empty by default """ - - -@@ -77,7 +77,7 @@ def get_devices(subsystem="block"): - - result = [] - for device in global_udev.list_devices(subsystem=subsystem): -- if not __is_ignored_blockdev(device.sys_name): -+ if not __is_blacklisted_blockdev(device.sys_name): - dev = device_to_dict(device) - result.append(dev) - -@@ -176,13 +176,13 @@ def resolve_glob(glob): - return ret - - --def __is_ignored_blockdev(dev_name): -+def __is_blacklisted_blockdev(dev_name): - """Is this a blockdev we never want for an install?""" - if dev_name.startswith("ram") or dev_name.startswith("fd"): - return True - -- if ignored_device_names: -- if any(re.search(expr, dev_name) for expr in ignored_device_names): -+ if device_name_blacklist: -+ if any(re.search(expr, dev_name) for expr in device_name_blacklist): - return True - - dev_path = "/sys/class/block/%s" % dev_name -@@ -375,7 +375,7 @@ def device_is_disk(info): - device_is_dm_crypt(info) or - device_is_dm_stratis(info) or - (device_is_md(info) and -- (not device_get_md_container(info) and not all(device_is_disk(d) for d in device_get_parents(info)))))) -+ (not device_get_md_container(info) and not all(device_is_disk(d) for d in device_get_slaves(info)))))) - - - def device_is_partition(info): -@@ -454,18 +454,18 @@ def device_get_devname(info): - return info.get('DEVNAME') - - --def device_get_parents(info): -- """ Return a list of udev device objects representing this device's parents. """ -- parents_dir = device_get_sysfs_path(info) + "/slaves/" -+def device_get_slaves(info): -+ """ Return a list of udev device objects representing this device's slaves. """ -+ slaves_dir = device_get_sysfs_path(info) + "/slaves/" - names = list() -- if os.path.isdir(parents_dir): -- names = os.listdir(parents_dir) -+ if os.path.isdir(slaves_dir): -+ names = os.listdir(slaves_dir) - -- parents = list() -+ slaves = list() - for name in names: -- parents.append(get_device(device_node="/dev/" + name)) -+ slaves.append(get_device(device_node="/dev/" + name)) - -- return parents -+ return slaves - - - def device_get_holders(info): -@@ -742,7 +742,7 @@ def device_get_partition_disk(info): - disk = None - majorminor = info.get("ID_PART_ENTRY_DISK") - sysfs_path = device_get_sysfs_path(info) -- parents_dir = "%s/slaves" % sysfs_path -+ slaves_dir = "%s/slaves" % sysfs_path - if majorminor: - major, minor = majorminor.split(":") - for device in get_devices(): -@@ -750,8 +750,8 @@ def device_get_partition_disk(info): - disk = device_get_name(device) - break - elif device_is_dm_partition(info): -- if os.path.isdir(parents_dir): -- parents = os.listdir(parents_dir) -+ if os.path.isdir(slaves_dir): -+ parents = os.listdir(slaves_dir) - if len(parents) == 1: - disk = resolve_devspec(parents[0].replace('!', '/')) - else: -diff --git a/tests/unit_tests/devicefactory_test.py b/tests/unit_tests/devicefactory_test.py -index ff6bcb9e..552aadc1 100644 ---- a/tests/unit_tests/devicefactory_test.py -+++ b/tests/unit_tests/devicefactory_test.py -@@ -115,9 +115,9 @@ class DeviceFactoryTestCase(unittest.TestCase): - kwargs.get("encrypted", False) or - kwargs.get("container_encrypted", False)) - if kwargs.get("encrypted", False): -- self.assertEqual(device.parents[0].format.luks_version, -+ self.assertEqual(device.slave.format.luks_version, - kwargs.get("luks_version", crypto.DEFAULT_LUKS_VERSION)) -- self.assertEqual(device.raw_device.format.luks_sector_size, -+ self.assertEqual(device.slave.format.luks_sector_size, - kwargs.get("luks_sector_size", 0)) - - self.assertTrue(set(device.disks).issubset(kwargs["disks"])) -@@ -357,7 +357,7 @@ class LVMFactoryTestCase(DeviceFactoryTestCase): - device = args[0] - - if kwargs.get("encrypted"): -- container = device.parents[0].container -+ container = device.slave.container - else: - container = device.container - -@@ -376,7 +376,7 @@ class LVMFactoryTestCase(DeviceFactoryTestCase): - self.assertIsInstance(pv, member_class) - - if pv.encrypted: -- self.assertEqual(pv.parents[0].format.luks_version, -+ self.assertEqual(pv.slave.format.luks_version, - kwargs.get("luks_version", crypto.DEFAULT_LUKS_VERSION)) - - @patch("blivet.formats.lvmpv.LVMPhysicalVolume.formattable", return_value=True) -@@ -592,7 +592,7 @@ class LVMThinPFactoryTestCase(LVMFactoryTestCase): - device = args[0] - - if kwargs.get("encrypted", False): -- thinlv = device.parents[0] -+ thinlv = device.slave - else: - thinlv = device - -diff --git a/tests/unit_tests/devices_test/device_size_test.py b/tests/unit_tests/devices_test/device_size_test.py -index d0c0a3f4..a1efa86d 100644 ---- a/tests/unit_tests/devices_test/device_size_test.py -+++ b/tests/unit_tests/devices_test/device_size_test.py -@@ -107,8 +107,8 @@ class LUKSDeviceSizeTest(StorageDeviceSizeTest): - - def _get_device(self, *args, **kwargs): - exists = kwargs.get("exists", False) -- parent = StorageDevice(*args, size=kwargs["size"] + crypto.LUKS_METADATA_SIZE, exists=exists) -- return LUKSDevice(*args, **kwargs, parents=[parent]) -+ slave = StorageDevice(*args, size=kwargs["size"] + crypto.LUKS_METADATA_SIZE, exists=exists) -+ return LUKSDevice(*args, **kwargs, parents=[slave]) - - def test_size_getter(self): - initial_size = Size("10 GiB") -@@ -116,4 +116,4 @@ class LUKSDeviceSizeTest(StorageDeviceSizeTest): - - # for LUKS size depends on the backing device size - self.assertEqual(dev.size, initial_size) -- self.assertEqual(dev.raw_device.size, initial_size + crypto.LUKS_METADATA_SIZE) -+ self.assertEqual(dev.slave.size, initial_size + crypto.LUKS_METADATA_SIZE) -diff --git a/tests/unit_tests/populator_test.py b/tests/unit_tests/populator_test.py -index 369fe878..7ba04bac 100644 ---- a/tests/unit_tests/populator_test.py -+++ b/tests/unit_tests/populator_test.py -@@ -86,7 +86,7 @@ class DMDevicePopulatorTestCase(PopulatorHelperTestCase): - @patch.object(DeviceTree, "get_device_by_name") - @patch.object(DMDevice, "status", return_value=True) - @patch.object(DMDevice, "update_sysfs_path") -- @patch.object(DeviceTree, "_add_parent_devices") -+ @patch.object(DeviceTree, "_add_slave_devices") - @patch("blivet.udev.device_get_name") - @patch("blivet.udev.device_get_sysfs_path", return_value=sentinel.sysfs_path) - def test_run(self, *args): -@@ -95,7 +95,7 @@ class DMDevicePopulatorTestCase(PopulatorHelperTestCase): - - devicetree = DeviceTree() - -- # The general case for dm devices is that adding the parent devices -+ # The general case for dm devices is that adding the slave/parent devices - # will result in the dm device itself being in the tree. - device = Mock() - device.id = 0 -@@ -106,7 +106,7 @@ class DMDevicePopulatorTestCase(PopulatorHelperTestCase): - parent = Mock() - parent.id = 0 - parent.parents = [] -- devicetree._add_parent_devices.return_value = [parent] -+ devicetree._add_slave_devices.return_value = [parent] - devicetree._add_device(parent) - devicetree.get_device_by_name.return_value = None - device_name = "dmdevice" -@@ -235,7 +235,7 @@ class LVMDevicePopulatorTestCase(PopulatorHelperTestCase): - # could be the first helper class checked. - - @patch.object(DeviceTree, "get_device_by_name") -- @patch.object(DeviceTree, "_add_parent_devices") -+ @patch.object(DeviceTree, "_add_slave_devices") - @patch("blivet.udev.device_get_name") - @patch("blivet.udev.device_get_lv_vg_name") - def test_run(self, *args): -@@ -247,7 +247,7 @@ class LVMDevicePopulatorTestCase(PopulatorHelperTestCase): - devicetree = DeviceTree() - data = Mock() - -- # Add parent devices and then look up the device. -+ # Add slave/parent devices and then look up the device. - device_get_name.return_value = sentinel.lv_name - devicetree.get_device_by_name.return_value = None - -@@ -267,7 +267,7 @@ class LVMDevicePopulatorTestCase(PopulatorHelperTestCase): - call(sentinel.vg_name), - call(sentinel.lv_name)]) - -- # Add parent devices, but the device is still not in the tree -+ # Add slave/parent devices, but the device is still not in the tree - get_device_by_name.side_effect = None - get_device_by_name.return_value = None - self.assertEqual(helper.run(), None) -@@ -639,7 +639,7 @@ class MDDevicePopulatorTestCase(PopulatorHelperTestCase): - # could be the first helper class checked. - - @patch.object(DeviceTree, "get_device_by_name") -- @patch.object(DeviceTree, "_add_parent_devices") -+ @patch.object(DeviceTree, "_add_slave_devices") - @patch("blivet.udev.device_get_name") - @patch("blivet.udev.device_get_md_uuid") - @patch("blivet.udev.device_get_md_name") -@@ -650,7 +650,7 @@ class MDDevicePopulatorTestCase(PopulatorHelperTestCase): - - devicetree = DeviceTree() - -- # base case: _add_parent_devices gets the array into the tree -+ # base case: _add_slave_devices gets the array into the tree - data = Mock() - device = Mock() - device.parents = [] -@@ -713,12 +713,12 @@ class MultipathDevicePopulatorTestCase(PopulatorHelperTestCase): - # could be the first helper class checked. - - @patch("blivet.udev.device_get_sysfs_path") -- @patch.object(DeviceTree, "_add_parent_devices") -+ @patch.object(DeviceTree, "_add_slave_devices") - @patch("blivet.udev.device_get_name") - def test_run(self, *args): - """Test multipath device populator.""" - device_get_name = args[0] -- add_parent_devices = args[1] -+ add_slave_devices = args[1] - - devicetree = DeviceTree() - # set up some fake udev data to verify handling of specific entries -@@ -733,13 +733,13 @@ class MultipathDevicePopulatorTestCase(PopulatorHelperTestCase): - - device_name = "mpathtest" - device_get_name.return_value = device_name -- parent_1 = Mock(tags=set(), wwn=wwn[2:], id=0) -- parent_1.parents = [] -- parent_2 = Mock(tags=set(), wwn=wwn[2:], id=0) -- parent_2.parents = [] -- devicetree._add_device(parent_1) -- devicetree._add_device(parent_2) -- add_parent_devices.return_value = [parent_1, parent_2] -+ slave_1 = Mock(tags=set(), wwn=wwn[2:], id=0) -+ slave_1.parents = [] -+ slave_2 = Mock(tags=set(), wwn=wwn[2:], id=0) -+ slave_2.parents = [] -+ devicetree._add_device(slave_1) -+ devicetree._add_device(slave_2) -+ add_slave_devices.return_value = [slave_1, slave_2] - - helper = self.helper_class(devicetree, data) - -diff --git a/tests/unit_tests/udev_test.py b/tests/unit_tests/udev_test.py -index b208efa8..ebcd59e2 100644 ---- a/tests/unit_tests/udev_test.py -+++ b/tests/unit_tests/udev_test.py -@@ -49,11 +49,11 @@ class UdevTest(unittest.TestCase): - @mock.patch('blivet.udev.device_is_dm_crypt', return_value=False) - @mock.patch('blivet.udev.device_is_md') - @mock.patch('blivet.udev.device_get_md_container') -- @mock.patch('blivet.udev.device_get_parents') -+ @mock.patch('blivet.udev.device_get_slaves') - def test_udev_device_is_disk_md(self, *args): - import blivet.udev - info = dict(DEVTYPE='disk', SYS_PATH=mock.sentinel.md_path) -- (device_get_parents, device_get_md_container, device_is_md) = args[:3] # pylint: disable=unbalanced-tuple-unpacking -+ (device_get_slaves, device_get_md_container, device_is_md) = args[:3] # pylint: disable=unbalanced-tuple-unpacking - - disk_parents = [dict(DEVTYPE="disk", SYS_PATH='/fake/path/2'), - dict(DEVTYPE="disk", SYS_PATH='/fake/path/3')] -@@ -68,20 +68,20 @@ class UdevTest(unittest.TestCase): - # Intel FW RAID (MD RAID w/ container layer) - # device_get_container will return some mock value which will evaluate to True - device_get_md_container.return_value = mock.sentinel.md_container -- device_get_parents.side_effect = lambda info: list() -+ device_get_slaves.side_effect = lambda info: list() - self.assertTrue(blivet.udev.device_is_disk(info)) - - # Normal MD RAID -- device_get_parents.side_effect = lambda info: partition_parents if info['SYS_PATH'] == mock.sentinel.md_path else list() -+ device_get_slaves.side_effect = lambda info: partition_parents if info['SYS_PATH'] == mock.sentinel.md_path else list() - device_get_md_container.return_value = None - self.assertFalse(blivet.udev.device_is_disk(info)) - - # Dell FW RAID (MD RAID whose members are all whole disks) -- device_get_parents.side_effect = lambda info: disk_parents if info['SYS_PATH'] == mock.sentinel.md_path else list() -+ device_get_slaves.side_effect = lambda info: disk_parents if info['SYS_PATH'] == mock.sentinel.md_path else list() - self.assertTrue(blivet.udev.device_is_disk(info)) - - # Normal MD RAID (w/ at least one non-disk member) -- device_get_parents.side_effect = lambda info: mixed_parents if info['SYS_PATH'] == mock.sentinel.md_path else list() -+ device_get_slaves.side_effect = lambda info: mixed_parents if info['SYS_PATH'] == mock.sentinel.md_path else list() - self.assertFalse(blivet.udev.device_is_disk(info)) - - -diff --git a/tests/vmtests/vmbackedtestcase.py b/tests/vmtests/vmbackedtestcase.py -index 797bac85..6255104f 100644 ---- a/tests/vmtests/vmbackedtestcase.py -+++ b/tests/vmtests/vmbackedtestcase.py -@@ -50,7 +50,7 @@ class VMBackedTestCase(unittest.TestCase): - defined in set_up_disks. - """ - -- udev.ignored_device_names = [r'^zram'] -+ udev.device_name_blacklist = [r'^zram'] - - # - # create disk images --- -2.38.1 - diff --git a/SOURCES/0005-DDF-RAID-support-using-mdadm.patch b/SOURCES/0005-DDF-RAID-support-using-mdadm.patch deleted file mode 100644 index 1232d02..0000000 --- a/SOURCES/0005-DDF-RAID-support-using-mdadm.patch +++ /dev/null @@ -1,86 +0,0 @@ -From f6490c469904f4808c63a170210e53acc908b018 Mon Sep 17 00:00:00 2001 -From: Vojtech Trefny -Date: Wed, 17 Aug 2022 14:24:21 +0200 -Subject: [PATCH 1/2] Use MD populator instead of DM to handle DDF RAID format - ---- - blivet/formats/dmraid.py | 2 +- - blivet/formats/mdraid.py | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -diff --git a/blivet/formats/dmraid.py b/blivet/formats/dmraid.py -index 2ba9dcfe..ce15905d 100644 ---- a/blivet/formats/dmraid.py -+++ b/blivet/formats/dmraid.py -@@ -43,7 +43,7 @@ class DMRaidMember(DeviceFormat): - # - # One problem that presents is the possibility of someone passing - # a dmraid member to the MDRaidArrayDevice constructor. -- _udev_types = ["adaptec_raid_member", "ddf_raid_member", -+ _udev_types = ["adaptec_raid_member", - "hpt37x_raid_member", "hpt45x_raid_member", - "isw_raid_member", - "jmicron_raid_member", "lsi_mega_raid_member", -diff --git a/blivet/formats/mdraid.py b/blivet/formats/mdraid.py -index 41ddef81..4aa3f3b0 100644 ---- a/blivet/formats/mdraid.py -+++ b/blivet/formats/mdraid.py -@@ -41,7 +41,7 @@ class MDRaidMember(DeviceFormat): - """ An mdraid member disk. """ - _type = "mdmember" - _name = N_("software RAID") -- _udev_types = ["linux_raid_member"] -+ _udev_types = ["linux_raid_member", "ddf_raid_member"] - parted_flag = PARTITION_RAID - _formattable = True # can be formatted - _supported = True # is supported --- -2.38.1 - - -From 5fadd850aae217d7692a6c8a50b2dcd5e61a63cd Mon Sep 17 00:00:00 2001 -From: Vojtech Trefny -Date: Wed, 17 Aug 2022 14:24:58 +0200 -Subject: [PATCH 2/2] Do not read DDF RAID UUID from udev - -The UUID we get from udev isn't the array UUID, we need to get -that using libblockdev. ---- - blivet/populator/helpers/mdraid.py | 16 ++++++++++------ - 1 file changed, 10 insertions(+), 6 deletions(-) - -diff --git a/blivet/populator/helpers/mdraid.py b/blivet/populator/helpers/mdraid.py -index 3479e3f7..a7602d20 100644 ---- a/blivet/populator/helpers/mdraid.py -+++ b/blivet/populator/helpers/mdraid.py -@@ -98,17 +98,21 @@ class MDFormatPopulator(FormatPopulator): - - def _get_kwargs(self): - kwargs = super(MDFormatPopulator, self)._get_kwargs() -- try: -- # ID_FS_UUID contains the array UUID -- kwargs["md_uuid"] = udev.device_get_uuid(self.data) -- except KeyError: -- log.warning("mdraid member %s has no md uuid", udev.device_get_name(self.data)) -+ kwargs["biosraid"] = udev.device_is_biosraid_member(self.data) -+ if not kwargs["biosraid"]: -+ try: -+ # ID_FS_UUID contains the array UUID -+ kwargs["md_uuid"] = udev.device_get_uuid(self.data) -+ except KeyError: -+ log.warning("mdraid member %s has no md uuid", udev.device_get_name(self.data)) -+ else: -+ # for BIOS RAIDs we can't get the UUID from udev, we'll get it from mdadm in `run` below -+ kwargs["md_uuid"] = None - - # reset the uuid to the member-specific value - # this will be None for members of v0 metadata arrays - kwargs["uuid"] = udev.device_get_md_device_uuid(self.data) - -- kwargs["biosraid"] = udev.device_is_biosraid_member(self.data) - return kwargs - - def run(self): --- -2.38.1 - diff --git a/SOURCES/0006-Revert-Remove-the-Blivet.roots-attribute.patch b/SOURCES/0006-Revert-Remove-the-Blivet.roots-attribute.patch deleted file mode 100644 index 76f3db8..0000000 --- a/SOURCES/0006-Revert-Remove-the-Blivet.roots-attribute.patch +++ /dev/null @@ -1,77 +0,0 @@ -From 62af1d7f96b8ed8eb8f2732787576161ae5da79f Mon Sep 17 00:00:00 2001 -From: Vojtech Trefny -Date: Thu, 13 Oct 2022 10:47:52 +0200 -Subject: [PATCH] Revert "Remove the Blivet.roots attribute" - -This reverts commit 19a826073345ca6b57a8f9a95ec855892320300e. ---- - blivet/blivet.py | 21 +++++++++++++++++++++ - blivet/devicefactory.py | 3 +++ - 2 files changed, 24 insertions(+) - -diff --git a/blivet/blivet.py b/blivet/blivet.py -index bf72ee9c..dc066b03 100644 ---- a/blivet/blivet.py -+++ b/blivet/blivet.py -@@ -88,6 +88,7 @@ class Blivet(object): - self.devicetree = DeviceTree(ignored_disks=self.ignored_disks, - exclusive_disks=self.exclusive_disks, - disk_images=self.disk_images) -+ self.roots = [] - - @property - def short_product_name(self): -@@ -1314,5 +1315,25 @@ class Blivet(object): - p = partition.disk.format.parted_disk.getPartitionByPath(partition.path) - partition.parted_partition = p - -+ for root in new.roots: -+ root.swaps = [new.devicetree.get_device_by_id(d.id, hidden=True) for d in root.swaps] -+ root.swaps = [s for s in root.swaps if s] -+ -+ removed = set() -+ for (mountpoint, old_dev) in root.mounts.items(): -+ if old_dev is None: -+ continue -+ -+ new_dev = new.devicetree.get_device_by_id(old_dev.id, hidden=True) -+ if new_dev is None: -+ # if the device has been removed don't include this -+ # mountpoint at all -+ removed.add(mountpoint) -+ else: -+ root.mounts[mountpoint] = new_dev -+ -+ for mnt in removed: -+ del root.mounts[mnt] -+ - log.debug("finished Blivet copy") - return new -diff --git a/blivet/devicefactory.py b/blivet/devicefactory.py -index 8105bfc7..6f460f6d 100644 ---- a/blivet/devicefactory.py -+++ b/blivet/devicefactory.py -@@ -383,6 +383,7 @@ class DeviceFactory(object): - # used for error recovery - self.__devices = [] - self.__actions = [] -+ self.__roots = [] - - def _is_container_encrypted(self): - return all(isinstance(p, LUKSDevice) for p in self.device.container.parents) -@@ -994,10 +995,12 @@ class DeviceFactory(object): - _blivet_copy = self.storage.copy() - self.__devices = _blivet_copy.devicetree._devices - self.__actions = _blivet_copy.devicetree._actions -+ self.__roots = _blivet_copy.roots - - def _revert_devicetree(self): - self.storage.devicetree._devices = self.__devices - self.storage.devicetree._actions = self.__actions -+ self.storage.roots = self.__roots - - - class PartitionFactory(DeviceFactory): --- -2.38.1 - diff --git a/SOURCES/0007-Fix-potential-AttributeError-when-getting-stratis-bl.patch b/SOURCES/0007-Fix-potential-AttributeError-when-getting-stratis-bl.patch deleted file mode 100644 index e117038..0000000 --- a/SOURCES/0007-Fix-potential-AttributeError-when-getting-stratis-bl.patch +++ /dev/null @@ -1,45 +0,0 @@ -From 1561bfe8820118178bbb07021adc1cacd875c4c7 Mon Sep 17 00:00:00 2001 -From: Vojtech Trefny -Date: Tue, 18 Oct 2022 12:28:37 +0200 -Subject: [PATCH] Fix potential AttributeError when getting stratis blockdev - info - ---- - blivet/static_data/stratis_info.py | 12 +++++++----- - 1 file changed, 7 insertions(+), 5 deletions(-) - -diff --git a/blivet/static_data/stratis_info.py b/blivet/static_data/stratis_info.py -index bd1c5a18..42f230ee 100644 ---- a/blivet/static_data/stratis_info.py -+++ b/blivet/static_data/stratis_info.py -@@ -124,20 +124,22 @@ class StratisInfo(object): - log.error("Failed to get DBus properties of '%s'", blockdev_path) - return None - -+ blockdev_uuid = str(uuid.UUID(properties["Uuid"])) -+ - pool_path = properties["Pool"] - if pool_path == "/": - pool_name = "" -+ return StratisBlockdevInfo(path=properties["Devnode"], uuid=blockdev_uuid, -+ pool_name="", pool_uuid="", object_path=blockdev_path) - else: - pool_info = self._get_pool_info(properties["Pool"]) - if not pool_info: - return None - pool_name = pool_info.name - -- blockdev_uuid = str(uuid.UUID(properties["Uuid"])) -- -- return StratisBlockdevInfo(path=properties["Devnode"], uuid=blockdev_uuid, -- pool_name=pool_name, pool_uuid=pool_info.uuid, -- object_path=blockdev_path) -+ return StratisBlockdevInfo(path=properties["Devnode"], uuid=blockdev_uuid, -+ pool_name=pool_name, pool_uuid=pool_info.uuid, -+ object_path=blockdev_path) - - def _get_locked_pools_info(self): - locked_pools = [] --- -2.38.1 - diff --git a/SOURCES/0008-tests-Skip-XFS-resize-test-on-CentOS-RHEL-8.patch b/SOURCES/0008-tests-Skip-XFS-resize-test-on-CentOS-RHEL-8.patch deleted file mode 100644 index 634eead..0000000 --- a/SOURCES/0008-tests-Skip-XFS-resize-test-on-CentOS-RHEL-8.patch +++ /dev/null @@ -1,27 +0,0 @@ -From b747c4ed07937f54a546ffb2f2c8c95e0797dd6c Mon Sep 17 00:00:00 2001 -From: Vojtech Trefny -Date: Thu, 20 Oct 2022 15:19:29 +0200 -Subject: [PATCH] tests: Skip XFS resize test on CentOS/RHEL 8 - -Partitions on loop devices are broken on CentOS/RHEL 8. ---- - tests/skip.yml | 6 ++++++ - 1 file changed, 6 insertions(+) - -diff --git a/tests/skip.yml b/tests/skip.yml -index 568c3fff..66b34493 100644 ---- a/tests/skip.yml -+++ b/tests/skip.yml -@@ -29,3 +29,9 @@ - - distro: "centos" - version: "9" - reason: "Creating RAID 1 LV on CentOS/RHEL 9 causes a system deadlock" -+ -+- test: storage_tests.formats_test.fs_test.XFSTestCase.test_resize -+ skip_on: -+ - distro: ["centos", "enterprise_linux"] -+ version: "8" -+ reason: "Creating partitions on loop devices is broken on CentOS/RHEL 8 latest kernel" --- -2.37.3 - diff --git a/SOURCES/0009-Revert-Adjust-to-new-XFS-min-size.patch b/SOURCES/0009-Revert-Adjust-to-new-XFS-min-size.patch deleted file mode 100644 index 167fd2d..0000000 --- a/SOURCES/0009-Revert-Adjust-to-new-XFS-min-size.patch +++ /dev/null @@ -1,160 +0,0 @@ -From 9618b84f94187efddc7316c2546bed923a91ecf9 Mon Sep 17 00:00:00 2001 -From: Vojtech Trefny -Date: Thu, 3 Nov 2022 08:36:27 +0100 -Subject: [PATCH 1/2] Revert "Set XFS minimal size to 300 MiB" - -This reverts commit 307d49833771d161314bae50c68e70dc35c3bb36. ---- - blivet/formats/fs.py | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/blivet/formats/fs.py b/blivet/formats/fs.py -index 8c346aa5..33922f3a 100644 ---- a/blivet/formats/fs.py -+++ b/blivet/formats/fs.py -@@ -1091,7 +1091,7 @@ class XFS(FS): - _modules = ["xfs"] - _labelfs = fslabeling.XFSLabeling() - _uuidfs = fsuuid.XFSUUID() -- _min_size = Size("300 MiB") -+ _min_size = Size("16 MiB") - _max_size = Size("16 EiB") - _formattable = True - _linux_native = True --- -2.38.1 - - -From 24d94922d6879baa85aaa101f6b21efa568a9cbc Mon Sep 17 00:00:00 2001 -From: Vojtech Trefny -Date: Thu, 3 Nov 2022 08:36:39 +0100 -Subject: [PATCH 2/2] Revert "tests: Create bigger devices for XFS testing" - -This reverts commit 467cb8024010b2cabb1e92d9e64f6d3cbe949ad9. ---- - tests/storage_tests/formats_test/fs_test.py | 7 +++---- - tests/storage_tests/formats_test/fslabeling.py | 4 +--- - tests/storage_tests/formats_test/fsuuid.py | 4 +--- - tests/storage_tests/formats_test/labeling_test.py | 2 -- - tests/storage_tests/formats_test/uuid_test.py | 3 --- - 5 files changed, 5 insertions(+), 15 deletions(-) - -diff --git a/tests/storage_tests/formats_test/fs_test.py b/tests/storage_tests/formats_test/fs_test.py -index cf8fb441..97f4cbbe 100644 ---- a/tests/storage_tests/formats_test/fs_test.py -+++ b/tests/storage_tests/formats_test/fs_test.py -@@ -54,7 +54,6 @@ class ReiserFSTestCase(fstesting.FSAsRoot): - - class XFSTestCase(fstesting.FSAsRoot): - _fs_class = fs.XFS -- _DEVICE_SIZE = Size("500 MiB") - - def can_resize(self, an_fs): - resize_tasks = (an_fs._resize, an_fs._size_info) -@@ -96,12 +95,12 @@ class XFSTestCase(fstesting.FSAsRoot): - self.assertFalse(an_fs.resizable) - # Not resizable, so can not do resizing actions. - with self.assertRaises(DeviceFormatError): -- an_fs.target_size = Size("300 MiB") -+ an_fs.target_size = Size("64 MiB") - with self.assertRaises(DeviceFormatError): - an_fs.do_resize() - else: - disk = DiskDevice(os.path.basename(self.loop_devices[0])) -- part = self._create_partition(disk, Size("300 MiB")) -+ part = self._create_partition(disk, Size("50 MiB")) - an_fs = self._fs_class() - an_fs.device = part.path - self.assertIsNone(an_fs.create()) -@@ -114,7 +113,7 @@ class XFSTestCase(fstesting.FSAsRoot): - part = self._create_partition(disk, size=part.size + Size("40 MiB")) - - # Try a reasonable target size -- TARGET_SIZE = Size("325 MiB") -+ TARGET_SIZE = Size("64 MiB") - an_fs.target_size = TARGET_SIZE - self.assertEqual(an_fs.target_size, TARGET_SIZE) - self.assertNotEqual(an_fs._size, TARGET_SIZE) -diff --git a/tests/storage_tests/formats_test/fslabeling.py b/tests/storage_tests/formats_test/fslabeling.py -index ebe0b70a..0e0dc261 100644 ---- a/tests/storage_tests/formats_test/fslabeling.py -+++ b/tests/storage_tests/formats_test/fslabeling.py -@@ -21,10 +21,8 @@ class LabelingAsRoot(loopbackedtestcase.LoopBackedTestCase): - _invalid_label = abc.abstractproperty( - doc="A label which is invalid for this filesystem.") - -- _DEVICE_SIZE = Size("100 MiB") -- - def __init__(self, methodName='run_test'): -- super(LabelingAsRoot, self).__init__(methodName=methodName, device_spec=[self._DEVICE_SIZE]) -+ super(LabelingAsRoot, self).__init__(methodName=methodName, device_spec=[Size("100 MiB")]) - - def setUp(self): - an_fs = self._fs_class() -diff --git a/tests/storage_tests/formats_test/fsuuid.py b/tests/storage_tests/formats_test/fsuuid.py -index 0b9762fd..16aa19a6 100644 ---- a/tests/storage_tests/formats_test/fsuuid.py -+++ b/tests/storage_tests/formats_test/fsuuid.py -@@ -23,11 +23,9 @@ class SetUUID(loopbackedtestcase.LoopBackedTestCase): - _invalid_uuid = abc.abstractproperty( - doc="An invalid UUID for this filesystem.") - -- _DEVICE_SIZE = Size("100 MiB") -- - def __init__(self, methodName='run_test'): - super(SetUUID, self).__init__(methodName=methodName, -- device_spec=[self._DEVICE_SIZE]) -+ device_spec=[Size("100 MiB")]) - - def setUp(self): - an_fs = self._fs_class() -diff --git a/tests/storage_tests/formats_test/labeling_test.py b/tests/storage_tests/formats_test/labeling_test.py -index 0702260a..d24e6619 100644 ---- a/tests/storage_tests/formats_test/labeling_test.py -+++ b/tests/storage_tests/formats_test/labeling_test.py -@@ -1,7 +1,6 @@ - import unittest - - from blivet.formats import device_formats --from blivet.size import Size - import blivet.formats.fs as fs - import blivet.formats.swap as swap - -@@ -62,7 +61,6 @@ class InitializationTestCase(unittest.TestCase): - class XFSTestCase(fslabeling.CompleteLabelingAsRoot): - _fs_class = fs.XFS - _invalid_label = "root filesystem" -- _DEVICE_SIZE = Size("500 MiB") - - - class FATFSTestCase(fslabeling.CompleteLabelingAsRoot): -diff --git a/tests/storage_tests/formats_test/uuid_test.py b/tests/storage_tests/formats_test/uuid_test.py -index af35c0ee..ee8d452e 100644 ---- a/tests/storage_tests/formats_test/uuid_test.py -+++ b/tests/storage_tests/formats_test/uuid_test.py -@@ -2,7 +2,6 @@ import unittest - - import blivet.formats.fs as fs - import blivet.formats.swap as swap --from blivet.size import Size - - from . import fsuuid - -@@ -53,14 +52,12 @@ class XFSTestCase(fsuuid.SetUUIDWithMkFs): - _fs_class = fs.XFS - _invalid_uuid = "abcdefgh-ijkl-mnop-qrst-uvwxyz123456" - _valid_uuid = "97e3d40f-dca8-497d-8b86-92f257402465" -- _DEVICE_SIZE = Size("500 MiB") - - - class XFSAfterTestCase(fsuuid.SetUUIDAfterMkFs): - _fs_class = fs.XFS - _invalid_uuid = "abcdefgh-ijkl-mnop-qrst-uvwxyz123456" - _valid_uuid = "97e3d40f-dca8-497d-8b86-92f257402465" -- _DEVICE_SIZE = Size("500 MiB") - - - class FATFSTestCase(fsuuid.SetUUIDWithMkFs): --- -2.38.1 - diff --git a/SOURCES/0010-Catch-BlockDevNotImplementedError-for-btrfs-plugin-c.patch b/SOURCES/0010-Catch-BlockDevNotImplementedError-for-btrfs-plugin-c.patch deleted file mode 100644 index a3a5f90..0000000 --- a/SOURCES/0010-Catch-BlockDevNotImplementedError-for-btrfs-plugin-c.patch +++ /dev/null @@ -1,55 +0,0 @@ -From fed62af06eb1584adbacd821dfe79c2df52c6aa4 Mon Sep 17 00:00:00 2001 -From: Vojtech Trefny -Date: Wed, 2 Nov 2022 12:14:28 +0100 -Subject: [PATCH] Catch BlockDevNotImplementedError for btrfs plugin calls - -This is a workaround for RHEL where the btrfs plugin is not -available and where we might still try to call some libblockdev -functions to gather information about preexisting btrfs devices. ---- - blivet/devices/btrfs.py | 8 ++++---- - 1 file changed, 4 insertions(+), 4 deletions(-) - -diff --git a/blivet/devices/btrfs.py b/blivet/devices/btrfs.py -index 0e029715..1ae6a04d 100644 ---- a/blivet/devices/btrfs.py -+++ b/blivet/devices/btrfs.py -@@ -362,7 +362,7 @@ class BTRFSVolumeDevice(BTRFSDevice, ContainerDevice, RaidDevice): - try: - subvols = blockdev.btrfs.list_subvolumes(mountpoint, - snapshots_only=snapshots_only) -- except blockdev.BtrfsError as e: -+ except (blockdev.BtrfsError, blockdev.BlockDevNotImplementedError) as e: - log.debug("failed to list subvolumes: %s", e) - else: - self._get_default_subvolume_id() -@@ -400,7 +400,7 @@ class BTRFSVolumeDevice(BTRFSDevice, ContainerDevice, RaidDevice): - with self._do_temp_mount() as mountpoint: - try: - subvolid = blockdev.btrfs.get_default_subvolume_id(mountpoint) -- except blockdev.BtrfsError as e: -+ except (blockdev.BtrfsError, blockdev.BlockDevNotImplementedError) as e: - log.debug("failed to get default subvolume id: %s", e) - - self._default_subvolume_id = subvolid -@@ -413,7 +413,7 @@ class BTRFSVolumeDevice(BTRFSDevice, ContainerDevice, RaidDevice): - with self._do_temp_mount() as mountpoint: - try: - blockdev.btrfs.set_default_subvolume(mountpoint, vol_id) -- except blockdev.BtrfsError as e: -+ except (blockdev.BtrfsError, blockdev.BlockDevNotImplementedError) as e: - log.error("failed to set new default subvolume id (%s): %s", - vol_id, e) - # The only time we set a new default subvolume is so we can remove -@@ -471,7 +471,7 @@ class BTRFSVolumeDevice(BTRFSDevice, ContainerDevice, RaidDevice): - if not self.format.vol_uuid: - try: - bd_info = blockdev.btrfs.filesystem_info(self.parents[0].path) -- except blockdev.BtrfsError as e: -+ except (blockdev.BtrfsError, blockdev.BlockDevNotImplementedError) as e: - log.error("failed to get filesystem info for new btrfs volume %s", e) - else: - self.format.vol_uuid = bd_info.uuid --- -2.38.1 - diff --git a/SOURCES/0011-Default-to-encryption-sector-size-512-for-LUKS-devic.patch b/SOURCES/0011-Default-to-encryption-sector-size-512-for-LUKS-devic.patch deleted file mode 100644 index ed3ede5..0000000 --- a/SOURCES/0011-Default-to-encryption-sector-size-512-for-LUKS-devic.patch +++ /dev/null @@ -1,57 +0,0 @@ -From 2aba050e74dc5df483da022dcf436b101c7a4301 Mon Sep 17 00:00:00 2001 -From: Vojtech Trefny -Date: Wed, 11 Jan 2023 14:59:24 +0100 -Subject: [PATCH] Default to encryption sector size 512 for LUKS devices - -We are currently letting cryptsetup decide the optimal encryption -sector size for LUKS. The problem is that for disks with physical -sector size 4096 cryptsetup will default to 4096 encryption sector -size even if the drive logical sector size is 512 which means -these disks cannot be combined with other 512 logical sector size -disks in LVM. This requires a more sophisticated solution in the -future, but for now just default to 512 if not specified by the -user otherwise. - -Resolves: rhbz#2103800 ---- - blivet/formats/luks.py | 10 +++++++--- - tests/unit_tests/formats_tests/luks_test.py | 2 +- - 2 files changed, 8 insertions(+), 4 deletions(-) - -diff --git a/blivet/formats/luks.py b/blivet/formats/luks.py -index 8de4911f..2637e0c5 100644 ---- a/blivet/formats/luks.py -+++ b/blivet/formats/luks.py -@@ -166,9 +166,13 @@ class LUKS(DeviceFormat): - if self.pbkdf_args.type == "pbkdf2" and self.pbkdf_args.max_memory_kb: - log.warning("Memory limit is not used for pbkdf2 and it will be ignored.") - -- self.luks_sector_size = kwargs.get("luks_sector_size") or 0 -- if self.luks_sector_size and self.luks_version != "luks2": -- raise ValueError("Sector size argument is valid only for LUKS version 2.") -+ self.luks_sector_size = kwargs.get("luks_sector_size") -+ if self.luks_version == "luks2": -+ if self.luks_sector_size is None: -+ self.luks_sector_size = 512 # XXX we don't want cryptsetup choose automatically here so fallback to 512 -+ else: -+ if self.luks_sector_size: -+ raise ValueError("Sector size argument is valid only for LUKS version 2.") - - def __repr__(self): - s = DeviceFormat.__repr__(self) -diff --git a/tests/unit_tests/formats_tests/luks_test.py b/tests/unit_tests/formats_tests/luks_test.py -index 5ae6acfe..ec7b7592 100644 ---- a/tests/unit_tests/formats_tests/luks_test.py -+++ b/tests/unit_tests/formats_tests/luks_test.py -@@ -53,7 +53,7 @@ class LUKSNodevTestCase(unittest.TestCase): - - def test_sector_size(self): - fmt = LUKS() -- self.assertEqual(fmt.luks_sector_size, 0) -+ self.assertEqual(fmt.luks_sector_size, 512) - - with self.assertRaises(ValueError): - fmt = LUKS(luks_version="luks1", luks_sector_size=4096) --- -2.39.0 - diff --git a/SOURCES/0012-Add-support-for-specifying-stripe-size-for-RAID-LVs.patch b/SOURCES/0012-Add-support-for-specifying-stripe-size-for-RAID-LVs.patch deleted file mode 100644 index 12eb181..0000000 --- a/SOURCES/0012-Add-support-for-specifying-stripe-size-for-RAID-LVs.patch +++ /dev/null @@ -1,172 +0,0 @@ -From 11c3e695d9a2130f325bb5459a9881ff70338f71 Mon Sep 17 00:00:00 2001 -From: Vojtech Trefny -Date: Thu, 9 Mar 2023 13:18:42 +0100 -Subject: [PATCH] Add support for specifying stripe size for RAID LVs - ---- - blivet/devices/lvm.py | 28 +++++++++++++++++--- - tests/storage_tests/devices_test/lvm_test.py | 12 +++++++-- - tests/unit_tests/devices_test/lvm_test.py | 27 +++++++++++++++++++ - 3 files changed, 61 insertions(+), 6 deletions(-) - -diff --git a/blivet/devices/lvm.py b/blivet/devices/lvm.py -index b8595d63..41358e9b 100644 ---- a/blivet/devices/lvm.py -+++ b/blivet/devices/lvm.py -@@ -659,7 +659,8 @@ class LVMLogicalVolumeBase(DMDevice, RaidDevice): - - def __init__(self, name, parents=None, size=None, uuid=None, seg_type=None, - fmt=None, exists=False, sysfs_path='', grow=None, maxsize=None, -- percent=None, cache_request=None, pvs=None, from_lvs=None): -+ percent=None, cache_request=None, pvs=None, from_lvs=None, -+ stripe_size=0): - - if not exists: - if seg_type not in [None, "linear", "thin", "thin-pool", "cache", "vdo-pool", "vdo", "cache-pool"] + lvm.raid_seg_types: -@@ -756,6 +757,15 @@ class LVMLogicalVolumeBase(DMDevice, RaidDevice): - if self._pv_specs: - self._assign_pv_space() - -+ self._stripe_size = stripe_size -+ if not self.exists and self._stripe_size: -+ if self.seg_type not in lvm.raid_seg_types: -+ raise errors.DeviceError("Stripe size can be specified only for RAID volumes") -+ if self.seg_type in ("raid1", "RAID1", "1", 1, "mirror"): -+ raise errors.DeviceError("Specifying stripe size is not allowed for RAID1 or mirror") -+ if self.cache: -+ raise errors.DeviceError("Creating cached LVs with custom stripe size is not supported") -+ - def _assign_pv_space(self): - if not self.is_raid_lv: - # nothing to do for non-RAID (and thus non-striped) LVs here -@@ -2295,7 +2305,7 @@ class LVMLogicalVolumeDevice(LVMLogicalVolumeBase, LVMInternalLogicalVolumeMixin - parent_lv=None, int_type=None, origin=None, vorigin=False, - metadata_size=None, chunk_size=None, profile=None, from_lvs=None, - compression=False, deduplication=False, index_memory=0, -- write_policy=None, cache_mode=None, attach_to=None): -+ write_policy=None, cache_mode=None, attach_to=None, stripe_size=0): - """ - :param name: the device name (generally a device node's basename) - :type name: str -@@ -2375,6 +2385,11 @@ class LVMLogicalVolumeDevice(LVMLogicalVolumeBase, LVMInternalLogicalVolumeMixin - be attached to when created - :type attach_to: :class:`LVMLogicalVolumeDevice` - -+ For RAID LVs only: -+ -+ :keyword stripe_size: size of the RAID stripe -+ :type stripe_size: :class:`~.size.Size` -+ - """ - - if isinstance(parents, (list, ParentList)): -@@ -2395,7 +2410,8 @@ class LVMLogicalVolumeDevice(LVMLogicalVolumeBase, LVMInternalLogicalVolumeMixin - LVMCachePoolMixin.__init__(self, metadata_size, cache_mode, attach_to) - LVMLogicalVolumeBase.__init__(self, name, parents, size, uuid, seg_type, - fmt, exists, sysfs_path, grow, maxsize, -- percent, cache_request, pvs, from_lvs) -+ percent, cache_request, pvs, from_lvs, -+ stripe_size) - LVMVDOPoolMixin.__init__(self, compression, deduplication, index_memory, - write_policy) - LVMVDOLogicalVolumeMixin.__init__(self) -@@ -2651,8 +2667,12 @@ class LVMLogicalVolumeDevice(LVMLogicalVolumeBase, LVMInternalLogicalVolumeMixin - pvs = [spec.pv.path for spec in self._pv_specs] - pvs = pvs or None - -+ extra = dict() -+ if self._stripe_size: -+ extra["stripesize"] = str(int(self._stripe_size.convert_to("KiB"))) -+ - blockdev.lvm.lvcreate(self.vg.name, self._name, self.size, -- type=self.seg_type, pv_list=pvs) -+ type=self.seg_type, pv_list=pvs, **extra) - else: - fast_pvs = [pv.path for pv in self.cache.fast_pvs] - -diff --git a/tests/storage_tests/devices_test/lvm_test.py b/tests/storage_tests/devices_test/lvm_test.py -index a055fc27..97ef1c4b 100644 ---- a/tests/storage_tests/devices_test/lvm_test.py -+++ b/tests/storage_tests/devices_test/lvm_test.py -@@ -1,4 +1,5 @@ - import os -+import subprocess - - from ..storagetestcase import StorageTestCase - -@@ -127,7 +128,7 @@ class LVMTestCase(StorageTestCase): - self.assertTrue(snap.is_snapshot_lv) - self.assertEqual(snap.origin, thinlv) - -- def _test_lvm_raid(self, seg_type, raid_level): -+ def _test_lvm_raid(self, seg_type, raid_level, stripe_size=0): - disk1 = self.storage.devicetree.get_device_by_path(self.vdevs[0]) - self.assertIsNotNone(disk1) - self.storage.initialize_disk(disk1) -@@ -151,7 +152,7 @@ class LVMTestCase(StorageTestCase): - - raidlv = self.storage.new_lv(fmt_type="ext4", size=blivet.size.Size("50 MiB"), - parents=[vg], name="blivetTestRAIDLV", -- seg_type=seg_type, pvs=[pv1, pv2]) -+ seg_type=seg_type, pvs=[pv1, pv2], stripe_size=stripe_size) - self.storage.create_device(raidlv) - - self.storage.do_it() -@@ -163,9 +164,16 @@ class LVMTestCase(StorageTestCase): - self.assertEqual(raidlv.raid_level, raid_level) - self.assertEqual(raidlv.seg_type, seg_type) - -+ if stripe_size: -+ out = subprocess.check_output(["lvs", "-o", "stripe_size", "--noheadings", "--nosuffix", "--units=b", raidlv.vg.name + "/" + raidlv.lvname]) -+ self.assertEqual(out.decode().strip(), str(int(stripe_size.convert_to()))) -+ - def test_lvm_raid_raid0(self): - self._test_lvm_raid("raid0", blivet.devicelibs.raid.RAID0) - -+ def test_lvm_raid_raid0_stripe_size(self): -+ self._test_lvm_raid("raid0", blivet.devicelibs.raid.RAID0, stripe_size=blivet.size.Size("1 MiB")) -+ - def test_lvm_raid_striped(self): - self._test_lvm_raid("striped", blivet.devicelibs.raid.Striped) - -diff --git a/tests/unit_tests/devices_test/lvm_test.py b/tests/unit_tests/devices_test/lvm_test.py -index 995c2da4..d7b55224 100644 ---- a/tests/unit_tests/devices_test/lvm_test.py -+++ b/tests/unit_tests/devices_test/lvm_test.py -@@ -363,6 +363,33 @@ class LVMDeviceTest(unittest.TestCase): - self.assertEqual(pv.format.free, Size("264 MiB")) - self.assertEqual(pv2.format.free, Size("256 MiB")) - -+ def test_lvm_logical_volume_raid_stripe_size(self): -+ pv = StorageDevice("pv1", fmt=blivet.formats.get_format("lvmpv"), -+ size=Size("1025 MiB")) -+ pv2 = StorageDevice("pv2", fmt=blivet.formats.get_format("lvmpv"), -+ size=Size("513 MiB")) -+ vg = LVMVolumeGroupDevice("testvg", parents=[pv, pv2]) -+ -+ with self.assertRaises(blivet.errors.DeviceError): -+ # non-raid LV -+ lv = LVMLogicalVolumeDevice("testlv", parents=[vg], size=Size("1 GiB"), -+ fmt=blivet.formats.get_format("xfs"), -+ exists=False, stripe_size=Size("1 MiB")) -+ -+ with self.assertRaises(blivet.errors.DeviceError): -+ # raid1 LV -+ lv = LVMLogicalVolumeDevice("testlv", parents=[vg], size=Size("1 GiB"), -+ fmt=blivet.formats.get_format("xfs"), -+ exists=False, seg_type="raid1", pvs=[pv, pv2], -+ stripe_size=Size("1 MiB")) -+ -+ lv = LVMLogicalVolumeDevice("testlv", parents=[vg], size=Size("1 GiB"), -+ fmt=blivet.formats.get_format("xfs"), -+ exists=False, seg_type="raid0", pvs=[pv, pv2], -+ stripe_size=Size("1 MiB")) -+ -+ self.assertEqual(lv._stripe_size, Size("1 MiB")) -+ - def test_target_size(self): - pv = StorageDevice("pv1", fmt=blivet.formats.get_format("lvmpv"), - size=Size("1 GiB")) --- -2.40.1 - diff --git a/SOURCES/0013-Fix-setting-kickstart-data.patch b/SOURCES/0013-Fix-setting-kickstart-data.patch deleted file mode 100644 index 1d9a583..0000000 --- a/SOURCES/0013-Fix-setting-kickstart-data.patch +++ /dev/null @@ -1,68 +0,0 @@ -From 1af0d3c37a93e431790e641a329a7f34dabf291a Mon Sep 17 00:00:00 2001 -From: Vojtech Trefny -Date: Thu, 2 Mar 2023 12:34:42 +0100 -Subject: [PATCH] Fix setting kickstart data - -When changing our code to PEP8 compliant we also changed some -pykickstart properties like onPart by accident. This PR fixes this. - -Resolves: rhbz#2175166 ---- - blivet/devices/btrfs.py | 4 ++-- - blivet/devices/lvm.py | 2 +- - blivet/devices/partition.py | 6 +++--- - 3 files changed, 6 insertions(+), 6 deletions(-) - -diff --git a/blivet/devices/btrfs.py b/blivet/devices/btrfs.py -index 1ae6a04d..3f56624e 100644 ---- a/blivet/devices/btrfs.py -+++ b/blivet/devices/btrfs.py -@@ -498,8 +498,8 @@ class BTRFSVolumeDevice(BTRFSDevice, ContainerDevice, RaidDevice): - - def populate_ksdata(self, data): - super(BTRFSVolumeDevice, self).populate_ksdata(data) -- data.data_level = self.data_level.name if self.data_level else None -- data.metadata_level = self.metadata_level.name if self.metadata_level else None -+ data.dataLevel = self.data_level.name if self.data_level else None -+ data.metaDataLevel = self.metadata_level.name if self.metadata_level else None - data.devices = ["btrfs.%d" % p.id for p in self.parents] - data.preexist = self.exists - -diff --git a/blivet/devices/lvm.py b/blivet/devices/lvm.py -index 41358e9b..c3132457 100644 ---- a/blivet/devices/lvm.py -+++ b/blivet/devices/lvm.py -@@ -1161,7 +1161,7 @@ class LVMLogicalVolumeBase(DMDevice, RaidDevice): - - if self.req_grow: - # base size could be literal or percentage -- data.max_size_mb = self.req_max_size.convert_to(MiB) -+ data.maxSizeMB = self.req_max_size.convert_to(MiB) - elif data.resize: - data.size = self.target_size.convert_to(MiB) - -diff --git a/blivet/devices/partition.py b/blivet/devices/partition.py -index 89d907c2..0e9250ce 100644 ---- a/blivet/devices/partition.py -+++ b/blivet/devices/partition.py -@@ -982,14 +982,14 @@ class PartitionDevice(StorageDevice): - data.size = self.req_base_size.round_to_nearest(MiB, rounding=ROUND_DOWN).convert_to(spec=MiB) - data.grow = self.req_grow - if self.req_grow: -- data.max_size_mb = self.req_max_size.convert_to(MiB) -+ data.maxSizeMB = self.req_max_size.convert_to(MiB) - - # data.disk = self.disk.name # by-id - if self.req_disks and len(self.req_disks) == 1: - data.disk = self.disk.name -- data.prim_only = self.req_primary -+ data.primOnly = self.req_primary - else: -- data.on_part = self.name # by-id -+ data.onPart = self.name # by-id - - if data.resize: - # on s390x in particular, fractional sizes are reported, which --- -2.40.1 - diff --git a/SOURCES/0014-Do-not-set-memory-limit-for-LUKS2-when-running-in-FI.patch b/SOURCES/0014-Do-not-set-memory-limit-for-LUKS2-when-running-in-FI.patch deleted file mode 100644 index e6e90c5..0000000 --- a/SOURCES/0014-Do-not-set-memory-limit-for-LUKS2-when-running-in-FI.patch +++ /dev/null @@ -1,133 +0,0 @@ -From c2b06150df0b876c7d442097b6c9ca90c9ca2ecc Mon Sep 17 00:00:00 2001 -From: Vojtech Trefny -Date: Thu, 4 May 2023 11:35:44 +0200 -Subject: [PATCH] Do not set memory limit for LUKS2 when running in FIPS mode - -With FIPS enabled LUKS uses pbkdf and not argon so the memory -limit is not a valid parameter. - -Resolves: rhbz#2183437 ---- - blivet/devicelibs/crypto.py | 11 +++++++ - blivet/formats/luks.py | 12 ++++---- - tests/unit_tests/formats_tests/luks_test.py | 30 +++++++++++++++++++ - .../unit_tests/formats_tests/methods_test.py | 3 +- - 4 files changed, 50 insertions(+), 6 deletions(-) - -diff --git a/blivet/devicelibs/crypto.py b/blivet/devicelibs/crypto.py -index f0caf0f7..68e68db1 100644 ---- a/blivet/devicelibs/crypto.py -+++ b/blivet/devicelibs/crypto.py -@@ -21,6 +21,7 @@ - # - - import hashlib -+import os - - import gi - gi.require_version("BlockDev", "2.0") -@@ -100,3 +101,13 @@ def calculate_integrity_metadata_size(device_size, algorithm=DEFAULT_INTEGRITY_A - jsize = (jsize / SECTOR_SIZE + 1) * SECTOR_SIZE # round up to sector - - return msize + jsize -+ -+ -+def is_fips_enabled(): -+ if not os.path.exists("/proc/sys/crypto/fips_enabled"): -+ # if the file doesn't exist, we are definitely not in FIPS mode -+ return False -+ -+ with open("/proc/sys/crypto/fips_enabled", "r") as f: -+ enabled = f.read() -+ return enabled.strip() == "1" -diff --git a/blivet/formats/luks.py b/blivet/formats/luks.py -index 2637e0c5..adf3c711 100644 ---- a/blivet/formats/luks.py -+++ b/blivet/formats/luks.py -@@ -303,11 +303,13 @@ class LUKS(DeviceFormat): - if luks_data.pbkdf_args: - self.pbkdf_args = luks_data.pbkdf_args - else: -- mem_limit = crypto.calculate_luks2_max_memory() -- if mem_limit: -- self.pbkdf_args = LUKS2PBKDFArgs(max_memory_kb=int(mem_limit.convert_to(KiB))) -- luks_data.pbkdf_args = self.pbkdf_args -- log.info("PBKDF arguments for LUKS2 not specified, using defaults with memory limit %s", mem_limit) -+ # argon is not used with FIPS so we don't need to adjust the memory when in FIPS mode -+ if not crypto.is_fips_enabled(): -+ mem_limit = crypto.calculate_luks2_max_memory() -+ if mem_limit: -+ self.pbkdf_args = LUKS2PBKDFArgs(max_memory_kb=int(mem_limit.convert_to(KiB))) -+ luks_data.pbkdf_args = self.pbkdf_args -+ log.info("PBKDF arguments for LUKS2 not specified, using defaults with memory limit %s", mem_limit) - - if self.pbkdf_args: - pbkdf = blockdev.CryptoLUKSPBKDF(type=self.pbkdf_args.type, -diff --git a/tests/unit_tests/formats_tests/luks_test.py b/tests/unit_tests/formats_tests/luks_test.py -index ec7b7592..1127e968 100644 ---- a/tests/unit_tests/formats_tests/luks_test.py -+++ b/tests/unit_tests/formats_tests/luks_test.py -@@ -6,9 +6,14 @@ except ImportError: - import unittest - - from blivet.formats.luks import LUKS -+from blivet.size import Size -+from blivet.static_data import luks_data - - - class LUKSNodevTestCase(unittest.TestCase): -+ def setUp(self): -+ luks_data.pbkdf_args = None -+ - def test_create_discard_option(self): - # flags.discard_new=False --> no discard - fmt = LUKS(exists=False) -@@ -51,6 +56,31 @@ class LUKSNodevTestCase(unittest.TestCase): - fmt = LUKS(cipher="aes-cbc-plain64") - self.assertEqual(fmt.key_size, 0) - -+ def test_luks2_pbkdf_memory_fips(self): -+ fmt = LUKS() -+ with patch("blivet.formats.luks.blockdev.crypto") as bd: -+ # fips enabled, pbkdf memory should not be set -+ with patch("blivet.formats.luks.crypto") as crypto: -+ attrs = {"is_fips_enabled.return_value": True, -+ "get_optimal_luks_sector_size.return_value": 0, -+ "calculate_luks2_max_memory.return_value": Size("256 MiB")} -+ crypto.configure_mock(**attrs) -+ -+ fmt._create() -+ crypto.calculate_luks2_max_memory.assert_not_called() -+ self.assertEqual(bd.luks_format.call_args[1]["extra"].pbkdf.max_memory_kb, 0) -+ -+ # fips disabled, pbkdf memory should be set -+ with patch("blivet.formats.luks.crypto") as crypto: -+ attrs = {"is_fips_enabled.return_value": False, -+ "get_optimal_luks_sector_size.return_value": 0, -+ "calculate_luks2_max_memory.return_value": Size("256 MiB")} -+ crypto.configure_mock(**attrs) -+ -+ fmt._create() -+ crypto.calculate_luks2_max_memory.assert_called() -+ self.assertEqual(bd.luks_format.call_args[1]["extra"].pbkdf.max_memory_kb, 256 * 1024) -+ - def test_sector_size(self): - fmt = LUKS() - self.assertEqual(fmt.luks_sector_size, 512) -diff --git a/tests/unit_tests/formats_tests/methods_test.py b/tests/unit_tests/formats_tests/methods_test.py -index 2743b7db..5d30c260 100644 ---- a/tests/unit_tests/formats_tests/methods_test.py -+++ b/tests/unit_tests/formats_tests/methods_test.py -@@ -366,7 +366,8 @@ class LUKSMethodsTestCase(FormatMethodsTestCase): - - def _test_create_backend(self): - self.format.exists = False -- self.format.create() -+ with patch("blivet.devicelibs.crypto.is_fips_enabled", return_value=False): -+ self.format.create() - self.assertTrue(self.patches["blockdev"].crypto.luks_format.called) # pylint: disable=no-member - - def _test_setup_backend(self): --- -2.40.1 - diff --git a/SOURCES/0015-Add-support-for-filesystem-online-resize.patch b/SOURCES/0015-Add-support-for-filesystem-online-resize.patch deleted file mode 100644 index 39f30e8..0000000 --- a/SOURCES/0015-Add-support-for-filesystem-online-resize.patch +++ /dev/null @@ -1,265 +0,0 @@ -From eb16230427fc1081f8515e6ad69ccf99ca521e5d Mon Sep 17 00:00:00 2001 -From: Vojtech Trefny -Date: Tue, 4 Apr 2023 13:31:40 +0200 -Subject: [PATCH 1/2] Add support for filesystem online resize - -Resolves: rhbz#2168680 ---- - blivet/devices/lvm.py | 13 ++++++++----- - blivet/devices/partition.py | 11 ++++++----- - blivet/flags.py | 3 +++ - blivet/formats/fs.py | 32 ++++++++++++++++++++++++++++---- - blivet/formats/fslib.py | 7 +++++++ - 5 files changed, 52 insertions(+), 14 deletions(-) - -diff --git a/blivet/devices/lvm.py b/blivet/devices/lvm.py -index c3132457..ca45c4b5 100644 ---- a/blivet/devices/lvm.py -+++ b/blivet/devices/lvm.py -@@ -42,6 +42,7 @@ from .. import errors - from .. import util - from ..storage_log import log_method_call - from .. import udev -+from ..flags import flags - from ..size import Size, KiB, MiB, ROUND_UP, ROUND_DOWN - from ..static_data.lvm_info import lvs_info - from ..tasks import availability -@@ -2729,12 +2730,14 @@ class LVMLogicalVolumeDevice(LVMLogicalVolumeBase, LVMInternalLogicalVolumeMixin - # Setup VG parents (in case they are dmraid partitions for example) - self.vg.setup_parents(orig=True) - -- if self.original_format.exists: -- self.original_format.teardown() -- if self.format.exists: -- self.format.teardown() -+ if not flags.allow_online_fs_resize: -+ if self.original_format.exists: -+ self.original_format.teardown() -+ if self.format.exists: -+ self.format.teardown() -+ -+ udev.settle() - -- udev.settle() - blockdev.lvm.lvresize(self.vg.name, self._name, self.size) - - @type_specific -diff --git a/blivet/devices/partition.py b/blivet/devices/partition.py -index 0e9250ce..6ae4b8d3 100644 ---- a/blivet/devices/partition.py -+++ b/blivet/devices/partition.py -@@ -745,11 +745,12 @@ class PartitionDevice(StorageDevice): - if not self.exists: - raise errors.DeviceError("device has not been created") - -- # don't teardown when resizing luks -- if self.format.type == "luks" and self.children: -- self.children[0].format.teardown() -- else: -- self.teardown() -+ if not flags.allow_online_fs_resize: -+ # don't teardown when resizing luks -+ if self.format.type == "luks" and self.children: -+ self.children[0].format.teardown() -+ else: -+ self.teardown() - - if not self.sysfs_path: - return -diff --git a/blivet/flags.py b/blivet/flags.py -index 6364164d..ecfa7ad7 100644 ---- a/blivet/flags.py -+++ b/blivet/flags.py -@@ -91,6 +91,9 @@ class Flags(object): - - self.debug_threads = False - -+ # Allow online filesystem resizes -+ self.allow_online_fs_resize = False -+ - def get_boot_cmdline(self): - with open("/proc/cmdline") as f: - buf = f.read().strip() -diff --git a/blivet/formats/fs.py b/blivet/formats/fs.py -index 33922f3a..3f553eb0 100644 ---- a/blivet/formats/fs.py -+++ b/blivet/formats/fs.py -@@ -56,7 +56,7 @@ from ..i18n import N_ - from .. import udev - from ..mounts import mounts_cache - --from .fslib import kernel_filesystems -+from .fslib import kernel_filesystems, FSResize - - import logging - log = logging.getLogger("blivet") -@@ -88,6 +88,9 @@ class FS(DeviceFormat): - # value is already unpredictable and can change in the future... - _metadata_size_factor = 1.0 - -+ # support for resize: grow/shrink, online/offline -+ _resize_support = 0 -+ - config_actions_map = {"label": "write_label"} - - def __init__(self, **kwargs): -@@ -436,12 +439,27 @@ class FS(DeviceFormat): - self.write_uuid() - - def _pre_resize(self): -- # file systems need a check before being resized -- self.do_check() -+ if self.status: -+ if flags.allow_online_fs_resize: -+ if self.target_size > self.size and not self._resize_support & FSResize.ONLINE_GROW: -+ raise FSError("This filesystem doesn't support online growing") -+ if self.target_size < self.size and not self._resize_support & FSResize.ONLINE_SHRINK: -+ raise FSError("This filesystem doesn't support online shrinking") -+ else: -+ raise FSError("Resizing of mounted filesystems is disabled") -+ -+ if self.status: -+ # fsck tools in general don't allow checks on mounted filesystems -+ log.debug("Filesystem on %s is mounted, not checking", self.device) -+ else: -+ # file systems need a check before being resized -+ self.do_check() -+ - super(FS, self)._pre_resize() - - def _post_resize(self): -- self.do_check() -+ if not self.status: -+ self.do_check() - super(FS, self)._post_resize() - - def do_check(self): -@@ -838,6 +856,7 @@ class Ext2FS(FS): - _formattable = True - _supported = True - _resizable = True -+ _resize_support = FSResize.ONLINE_GROW | FSResize.OFFLINE_GROW | FSResize.OFFLINE_SHRINK - _linux_native = True - _max_size = Size("8 TiB") - _dump = True -@@ -1097,6 +1116,7 @@ class XFS(FS): - _linux_native = True - _supported = True - _resizable = True -+ _resize_support = FSResize.ONLINE_GROW | FSResize.OFFLINE_GROW - _packages = ["xfsprogs"] - _fsck_class = fsck.XFSCK - _info_class = fsinfo.XFSInfo -@@ -1247,6 +1267,7 @@ class NTFS(FS): - _labelfs = fslabeling.NTFSLabeling() - _uuidfs = fsuuid.NTFSUUID() - _resizable = True -+ _resize_support = FSResize.OFFLINE_GROW | FSResize.OFFLINE_SHRINK - _formattable = True - _supported = True - _min_size = Size("1 MiB") -@@ -1490,6 +1511,9 @@ class TmpFS(NoDevFS): - # same, nothing actually needs to be set - pass - -+ def _pre_resize(self): -+ self.do_check() -+ - def do_resize(self): - # Override superclass method to record whether mount options - # should include an explicit size specification. -diff --git a/blivet/formats/fslib.py b/blivet/formats/fslib.py -index ea93b1fd..8722e942 100644 ---- a/blivet/formats/fslib.py -+++ b/blivet/formats/fslib.py -@@ -36,3 +36,10 @@ def update_kernel_filesystems(): - - - update_kernel_filesystems() -+ -+ -+class FSResize(): -+ OFFLINE_SHRINK = 1 << 1 -+ OFFLINE_GROW = 1 << 2 -+ ONLINE_SHRINK = 1 << 3 -+ ONLINE_GROW = 1 << 4 --- -2.40.1 - - -From 3fce5d0bfd7b09a976ff49feed15077477c6a425 Mon Sep 17 00:00:00 2001 -From: Vojtech Trefny -Date: Thu, 6 Apr 2023 14:02:11 +0200 -Subject: [PATCH 2/2] Add a test case for filesystem online resize - -Related: rhbz#2168680 ---- - tests/storage_tests/formats_test/fs_test.py | 43 ++++++++++++++++++++- - 1 file changed, 42 insertions(+), 1 deletion(-) - -diff --git a/tests/storage_tests/formats_test/fs_test.py b/tests/storage_tests/formats_test/fs_test.py -index 97f4cbbe..1d42dc21 100644 ---- a/tests/storage_tests/formats_test/fs_test.py -+++ b/tests/storage_tests/formats_test/fs_test.py -@@ -6,9 +6,10 @@ import parted - - import blivet.formats.fs as fs - from blivet.size import Size, ROUND_DOWN --from blivet.errors import DeviceFormatError -+from blivet.errors import DeviceFormatError, FSError - from blivet.formats import get_format - from blivet.devices import PartitionDevice, DiskDevice -+from blivet.flags import flags - - from .loopbackedtestcase import LoopBackedTestCase - -@@ -26,6 +27,46 @@ class Ext3FSTestCase(Ext2FSTestCase): - class Ext4FSTestCase(Ext3FSTestCase): - _fs_class = fs.Ext4FS - -+ def test_online_resize(self): -+ an_fs = self._fs_class() -+ if not an_fs.formattable: -+ self.skipTest("can not create filesystem %s" % an_fs.name) -+ an_fs.device = self.loop_devices[0] -+ self.assertIsNone(an_fs.create()) -+ an_fs.update_size_info() -+ -+ if not self.can_resize(an_fs): -+ self.skipTest("filesystem is not resizable") -+ -+ # shrink offline first (ext doesn't support online shrinking) -+ TARGET_SIZE = Size("64 MiB") -+ an_fs.target_size = TARGET_SIZE -+ self.assertEqual(an_fs.target_size, TARGET_SIZE) -+ self.assertNotEqual(an_fs._size, TARGET_SIZE) -+ self.assertIsNone(an_fs.do_resize()) -+ -+ with tempfile.TemporaryDirectory() as mountpoint: -+ an_fs.mount(mountpoint=mountpoint) -+ -+ # grow back when mounted -+ TARGET_SIZE = Size("100 MiB") -+ an_fs.target_size = TARGET_SIZE -+ self.assertEqual(an_fs.target_size, TARGET_SIZE) -+ self.assertNotEqual(an_fs._size, TARGET_SIZE) -+ -+ # should fail, online resize disabled by default -+ with self.assertRaisesRegex(FSError, "Resizing of mounted filesystems is disabled"): -+ an_fs.do_resize() -+ -+ # enable online resize -+ flags.allow_online_fs_resize = True -+ an_fs.do_resize() -+ flags.allow_online_fs_resize = False -+ self._test_sizes(an_fs) -+ self.assertEqual(an_fs.system_mountpoint, mountpoint) -+ -+ an_fs.unmount() -+ - - class FATFSTestCase(fstesting.FSAsRoot): - _fs_class = fs.FATFS --- -2.40.1 - diff --git a/SOURCES/0016-Backport-iSCSI-initiator-name-related-fixes.patch b/SOURCES/0016-Backport-iSCSI-initiator-name-related-fixes.patch deleted file mode 100644 index f61a188..0000000 --- a/SOURCES/0016-Backport-iSCSI-initiator-name-related-fixes.patch +++ /dev/null @@ -1,382 +0,0 @@ -From d06c45db59d0e917dbab4c283f2f04c8f9206a6e Mon Sep 17 00:00:00 2001 -From: Vojtech Trefny -Date: Mon, 6 Mar 2023 10:51:42 +0100 -Subject: [PATCH 1/5] Allow changing iSCSI initiator name after setting it - -Resolves: rhbz#2083139 ---- - blivet/iscsi.py | 13 +++++++++++-- - 1 file changed, 11 insertions(+), 2 deletions(-) - -diff --git a/blivet/iscsi.py b/blivet/iscsi.py -index 86451db3..0d063f2a 100644 ---- a/blivet/iscsi.py -+++ b/blivet/iscsi.py -@@ -212,14 +212,23 @@ class iSCSI(object): - @initiator.setter - @storaged_iscsi_required(critical=True, eval_mode=util.EvalMode.onetime) - def initiator(self, val): -- if self.initiator_set and val != self._initiator: -- raise ValueError(_("Unable to change iSCSI initiator name once set")) - if len(val) == 0: - raise ValueError(_("Must provide an iSCSI initiator name")) - -+ active = self._get_active_sessions() -+ if active: -+ raise errors.ISCSIError(_("Cannot change initiator name with an active session")) -+ - log.info("Setting up iSCSI initiator name %s", self.initiator) - args = GLib.Variant("(sa{sv})", (val, None)) - self._call_initiator_method("SetInitiatorName", args) -+ -+ if self.initiator_set and val != self._initiator: -+ log.info("Restarting iscsid after initiator name change") -+ rc = util.run_program(["systemctl", "restart", "iscsid"]) -+ if rc != 0: -+ raise errors.ISCSIError(_("Failed to restart iscsid after initiator name change")) -+ - self._initiator = val - - def active_nodes(self, target=None): --- -2.40.1 - - -From b71991d65c270c023364b03c499b4bf3e245fbd0 Mon Sep 17 00:00:00 2001 -From: Vojtech Trefny -Date: Mon, 6 Mar 2023 15:10:28 +0100 -Subject: [PATCH 2/5] Add a basic test case for the iscsi module - -Related: rhbz#2083139 ---- - tests/storage_tests/__init__.py | 2 + - tests/storage_tests/iscsi_test.py | 157 +++++++++++++++++++++++++++++ - 3 files changed, 162 insertions(+) - create mode 100644 tests/storage_tests/iscsi_test.py - -diff --git a/tests/storage_tests/__init__.py b/tests/storage_tests/__init__.py -index 3b2a6cc4..e69fcc34 100644 ---- a/tests/storage_tests/__init__.py -+++ b/tests/storage_tests/__init__.py -@@ -3,3 +3,5 @@ from .formats_test import * - - from .partitioning_test import * - from .unsupported_disklabel_test import * -+ -+from .iscsi_test import * -diff --git a/tests/storage_tests/iscsi_test.py b/tests/storage_tests/iscsi_test.py -new file mode 100644 -index 00000000..00cc7c36 ---- /dev/null -+++ b/tests/storage_tests/iscsi_test.py -@@ -0,0 +1,157 @@ -+import glob -+import os -+import re -+import shutil -+import subprocess -+import unittest -+ -+from contextlib import contextmanager -+ -+from .storagetestcase import create_sparse_tempfile -+ -+ -+def read_file(filename, mode="r"): -+ with open(filename, mode) as f: -+ content = f.read() -+ return content -+ -+ -+@contextmanager -+def udev_settle(): -+ try: -+ yield -+ finally: -+ os.system("udevadm settle") -+ -+ -+def _delete_backstore(name): -+ status = subprocess.call(["targetcli", "/backstores/fileio/ delete %s" % name], -+ stdout=subprocess.DEVNULL) -+ if status != 0: -+ raise RuntimeError("Failed to delete the '%s' fileio backstore" % name) -+ -+ -+def delete_iscsi_target(iqn, backstore=None): -+ status = subprocess.call(["targetcli", "/iscsi delete %s" % iqn], -+ stdout=subprocess.DEVNULL) -+ if status != 0: -+ raise RuntimeError("Failed to delete the '%s' iscsi device" % iqn) -+ -+ if backstore is not None: -+ _delete_backstore(backstore) -+ -+ -+def create_iscsi_target(fpath, initiator_name=None): -+ """ -+ Creates a new iSCSI target (using targetcli) on top of the -+ :param:`fpath` backing file. -+ -+ :param str fpath: path of the backing file -+ :returns: iSCSI IQN, backstore name -+ :rtype: tuple of str -+ -+ """ -+ -+ # "register" the backing file as a fileio backstore -+ store_name = os.path.basename(fpath) -+ status = subprocess.call(["targetcli", "/backstores/fileio/ create %s %s" % (store_name, fpath)], stdout=subprocess.DEVNULL) -+ if status != 0: -+ raise RuntimeError("Failed to register '%s' as a fileio backstore" % fpath) -+ -+ out = subprocess.check_output(["targetcli", "/backstores/fileio/%s info" % store_name]) -+ out = out.decode("utf-8") -+ store_wwn = None -+ for line in out.splitlines(): -+ if line.startswith("wwn: "): -+ store_wwn = line[5:] -+ if store_wwn is None: -+ raise RuntimeError("Failed to determine '%s' backstore's wwn" % store_name) -+ -+ # create a new iscsi device -+ out = subprocess.check_output(["targetcli", "/iscsi create"]) -+ out = out.decode("utf-8") -+ match = re.match(r'Created target (.*).', out) -+ if match: -+ iqn = match.groups()[0] -+ else: -+ _delete_backstore(store_name) -+ raise RuntimeError("Failed to create a new iscsi target") -+ -+ if initiator_name: -+ status = subprocess.call(["targetcli", "/iscsi/%s/tpg1/acls create %s" % (iqn, initiator_name)], stdout=subprocess.DEVNULL) -+ if status != 0: -+ delete_iscsi_target(iqn, store_name) -+ raise RuntimeError("Failed to set ACLs for '%s'" % iqn) -+ -+ with udev_settle(): -+ status = subprocess.call(["targetcli", "/iscsi/%s/tpg1/luns create /backstores/fileio/%s" % (iqn, store_name)], stdout=subprocess.DEVNULL) -+ if status != 0: -+ delete_iscsi_target(iqn, store_name) -+ raise RuntimeError("Failed to create a new LUN for '%s' using '%s'" % (iqn, store_name)) -+ -+ status = subprocess.call(["targetcli", "/iscsi/%s/tpg1 set attribute generate_node_acls=1" % iqn], stdout=subprocess.DEVNULL) -+ if status != 0: -+ raise RuntimeError("Failed to set ACLs for '%s'" % iqn) -+ -+ return iqn, store_name -+ -+ -+@unittest.skipUnless(os.geteuid() == 0, "requires root privileges") -+@unittest.skipUnless(os.environ.get("JENKINS_HOME"), "jenkins only test") -+@unittest.skipUnless(shutil.which("iscsiadm"), "iscsiadm not available") -+class ISCSITestCase(unittest.TestCase): -+ -+ _disk_size = 512 * 1024**2 -+ initiator = 'iqn.1994-05.com.redhat:iscsi-test' -+ -+ def setUp(self): -+ self.addCleanup(self._clean_up) -+ -+ self._dev_file = None -+ self.dev = None -+ -+ self._dev_file = create_sparse_tempfile("blivet_test", self._disk_size) -+ try: -+ self.dev, self.backstore = create_iscsi_target(self._dev_file, self.initiator) -+ except RuntimeError as e: -+ raise RuntimeError("Failed to setup targetcli device for testing: %s" % e) -+ -+ def _force_logout(self): -+ subprocess.call(["iscsiadm", "--mode", "node", "--logout", "--name", self.dev], stdout=subprocess.DEVNULL) -+ -+ def _clean_up(self): -+ self._force_logout() -+ delete_iscsi_target(self.dev, self.backstore) -+ os.unlink(self._dev_file) -+ -+ def test_discover_login(self): -+ from blivet.iscsi import iscsi, has_iscsi -+ -+ if not has_iscsi(): -+ self.skipTest("iSCSI not available, skipping") -+ -+ iscsi.initiator = self.initiator -+ nodes = iscsi.discover("127.0.0.1") -+ self.assertTrue(nodes) -+ -+ if len(nodes) > 1: -+ self.skipTest("Discovered more than one iSCSI target on localhost, skipping") -+ -+ self.assertEqual(nodes[0].address, "127.0.0.1") -+ self.assertEqual(nodes[0].port, 3260) -+ self.assertEqual(nodes[0].name, self.dev) -+ -+ # change the initiator name -+ iscsi.initiator = self.initiator + "_1" -+ self.assertEqual(iscsi.initiator, self.initiator + "_1") -+ -+ # try to login -+ ret, err = iscsi.log_into_node(nodes[0]) -+ self.assertTrue(ret, "Login failed: %s" % err) -+ -+ # check the session for initiator name -+ sessions = glob.glob("/sys/class/iscsi_session/*/") -+ self.assertTrue(sessions) -+ self.assertEqual(len(sessions), 1) -+ initiator = read_file(sessions[0] + "initiatorname").strip() -+ self.assertEqual(initiator, iscsi.initiator) --- -2.40.1 - - -From 65e8150a7404e37dd2740841a88e7f2565836406 Mon Sep 17 00:00:00 2001 -From: Vojtech Trefny -Date: Mon, 6 Mar 2023 15:14:40 +0100 -Subject: [PATCH 3/5] tests: Use blivet-specific prefix for targetcli backing - files - -The code is originally from libblockdev hence the "bd" prefix, we -should use a different prefix for blivet to be able to identify -which test suite failed to clean the files. - -Related: rhbz#2083139 ---- - tests/storage_tests/storagetestcase.py | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/tests/storage_tests/storagetestcase.py b/tests/storage_tests/storagetestcase.py -index 35d57ce9..9f859977 100644 ---- a/tests/storage_tests/storagetestcase.py -+++ b/tests/storage_tests/storagetestcase.py -@@ -39,7 +39,7 @@ def create_sparse_tempfile(name, size): - :param size: the file size (in bytes) - :returns: the path to the newly created file - """ -- (fd, path) = tempfile.mkstemp(prefix="bd.", suffix="-%s" % name) -+ (fd, path) = tempfile.mkstemp(prefix="blivet.", suffix="-%s" % name) - os.close(fd) - create_sparse_file(path, size) - return path --- -2.40.1 - - -From 41278ef1b3f949303fd30fff2ccdde75f713c9f8 Mon Sep 17 00:00:00 2001 -From: Vojtech Trefny -Date: Wed, 19 Jul 2023 13:57:39 +0200 -Subject: [PATCH 4/5] iscsi: Save firmware initiator name to - /etc/iscsi/initiatorname.iscsi - -Resolves: rhbz#2084043 ---- - blivet/iscsi.py | 5 +++++ - 1 file changed, 5 insertions(+) - -diff --git a/blivet/iscsi.py b/blivet/iscsi.py -index 0d063f2a..8080a671 100644 ---- a/blivet/iscsi.py -+++ b/blivet/iscsi.py -@@ -160,6 +160,11 @@ class iSCSI(object): - self._initiator = initiatorname - except Exception as e: # pylint: disable=broad-except - log.info("failed to get initiator name from iscsi firmware: %s", str(e)) -+ else: -+ # write the firmware initiator to /etc/iscsi/initiatorname.iscsi -+ log.info("Setting up firmware iSCSI initiator name %s", self.initiator) -+ args = GLib.Variant("(sa{sv})", (initiatorname, None)) -+ self._call_initiator_method("SetInitiatorName", args) - - # So that users can write iscsi() to get the singleton instance - def __call__(self): --- -2.40.1 - - -From fce8b73965d968aab546bc7e0ecb65d1995da46f Mon Sep 17 00:00:00 2001 -From: Vojtech Trefny -Date: Wed, 19 Jul 2023 10:38:45 +0200 -Subject: [PATCH 5/5] tests: Improve iscsi_test.ISCSITestCase - -Changed how we create the initiator name ACLs based on RTT test -case for rhbz#2084043 and also improved the test case itself. - -Related: rhbz#2083139 ---- - tests/storage_tests/iscsi_test.py | 36 +++++++++++++++++++++---------- - 1 file changed, 25 insertions(+), 11 deletions(-) - -diff --git a/tests/storage_tests/iscsi_test.py b/tests/storage_tests/iscsi_test.py -index 00cc7c36..6cc83a59 100644 ---- a/tests/storage_tests/iscsi_test.py -+++ b/tests/storage_tests/iscsi_test.py -@@ -77,21 +77,17 @@ def create_iscsi_target(fpath, initiator_name=None): - _delete_backstore(store_name) - raise RuntimeError("Failed to create a new iscsi target") - -- if initiator_name: -- status = subprocess.call(["targetcli", "/iscsi/%s/tpg1/acls create %s" % (iqn, initiator_name)], stdout=subprocess.DEVNULL) -- if status != 0: -- delete_iscsi_target(iqn, store_name) -- raise RuntimeError("Failed to set ACLs for '%s'" % iqn) -- - with udev_settle(): - status = subprocess.call(["targetcli", "/iscsi/%s/tpg1/luns create /backstores/fileio/%s" % (iqn, store_name)], stdout=subprocess.DEVNULL) - if status != 0: - delete_iscsi_target(iqn, store_name) - raise RuntimeError("Failed to create a new LUN for '%s' using '%s'" % (iqn, store_name)) - -- status = subprocess.call(["targetcli", "/iscsi/%s/tpg1 set attribute generate_node_acls=1" % iqn], stdout=subprocess.DEVNULL) -- if status != 0: -- raise RuntimeError("Failed to set ACLs for '%s'" % iqn) -+ if initiator_name: -+ status = subprocess.call(["targetcli", "/iscsi/%s/tpg1/acls create %s" % (iqn, initiator_name)], stdout=subprocess.DEVNULL) -+ if status != 0: -+ delete_iscsi_target(iqn, store_name) -+ raise RuntimeError("Failed to set ACLs for '%s'" % iqn) - - return iqn, store_name - -@@ -130,6 +126,7 @@ class ISCSITestCase(unittest.TestCase): - if not has_iscsi(): - self.skipTest("iSCSI not available, skipping") - -+ # initially set the initiator to the correct/allowed one - iscsi.initiator = self.initiator - nodes = iscsi.discover("127.0.0.1") - self.assertTrue(nodes) -@@ -141,11 +138,28 @@ class ISCSITestCase(unittest.TestCase): - self.assertEqual(nodes[0].port, 3260) - self.assertEqual(nodes[0].name, self.dev) - -- # change the initiator name -+ # change the initiator name to a wrong one - iscsi.initiator = self.initiator + "_1" - self.assertEqual(iscsi.initiator, self.initiator + "_1") - -- # try to login -+ # check the change made it to /etc/iscsi/initiatorname.iscsi -+ initiator_file = read_file("/etc/iscsi/initiatorname.iscsi").strip() -+ self.assertEqual(initiator_file, "InitiatorName=%s" % self.initiator + "_1") -+ -+ # try to login (should fail) -+ ret, err = iscsi.log_into_node(nodes[0]) -+ self.assertFalse(ret) -+ self.assertIn("authorization failure", err) -+ -+ # change the initiator name back to the correct one -+ iscsi.initiator = self.initiator -+ self.assertEqual(iscsi.initiator, self.initiator) -+ -+ # check the change made it to /etc/iscsi/initiatorname.iscsi -+ initiator_file = read_file("/etc/iscsi/initiatorname.iscsi").strip() -+ self.assertEqual(initiator_file, "InitiatorName=%s" % self.initiator) -+ -+ # try to login (should work now) - ret, err = iscsi.log_into_node(nodes[0]) - self.assertTrue(ret, "Login failed: %s" % err) - --- -2.40.1 - diff --git a/SOURCES/0017-Add-support-for-creating-shared-LVM-setups.patch b/SOURCES/0017-Add-support-for-creating-shared-LVM-setups.patch deleted file mode 100644 index 4bf0733..0000000 --- a/SOURCES/0017-Add-support-for-creating-shared-LVM-setups.patch +++ /dev/null @@ -1,206 +0,0 @@ -From faef0408d2f7c61aade6d187389c61e64f9f373b Mon Sep 17 00:00:00 2001 -From: Vojtech Trefny -Date: Thu, 20 Apr 2023 12:35:30 +0200 -Subject: [PATCH] Add support for creating shared LVM setups - -This feature is requested by GFS2 for the storage role. This adds -support for creating shared VGs and activating LVs in shared mode. - -Resolves: RHEL-14021 ---- - blivet/devices/lvm.py | 44 +++++++++++++++++++---- - blivet/tasks/availability.py | 9 +++++ - tests/unit_tests/devices_test/lvm_test.py | 25 +++++++++++++ - 3 files changed, 72 insertions(+), 6 deletions(-) - -diff --git a/blivet/devices/lvm.py b/blivet/devices/lvm.py -index ca45c4b5..068c5368 100644 ---- a/blivet/devices/lvm.py -+++ b/blivet/devices/lvm.py -@@ -97,7 +97,8 @@ class LVMVolumeGroupDevice(ContainerDevice): - - def __init__(self, name, parents=None, size=None, free=None, - pe_size=None, pe_count=None, pe_free=None, pv_count=None, -- uuid=None, exists=False, sysfs_path='', exported=False): -+ uuid=None, exists=False, sysfs_path='', exported=False, -+ shared=False): - """ - :param name: the device name (generally a device node's basename) - :type name: str -@@ -124,6 +125,11 @@ class LVMVolumeGroupDevice(ContainerDevice): - :type pv_count: int - :keyword uuid: the VG UUID - :type uuid: str -+ -+ For non-existing VGs only: -+ -+ :keyword shared: whether to create this VG as shared -+ :type shared: bool - """ - # These attributes are used by _add_parent, so they must be initialized - # prior to instantiating the superclass. -@@ -137,6 +143,7 @@ class LVMVolumeGroupDevice(ContainerDevice): - self.pe_count = util.numeric_type(pe_count) - self.pe_free = util.numeric_type(pe_free) - self.exported = exported -+ self._shared = shared - - # TODO: validate pe_size if given - if not self.pe_size: -@@ -254,7 +261,19 @@ class LVMVolumeGroupDevice(ContainerDevice): - """ Create the device. """ - log_method_call(self, self.name, status=self.status) - pv_list = [pv.path for pv in self.parents] -- blockdev.lvm.vgcreate(self.name, pv_list, self.pe_size) -+ extra = dict() -+ if self._shared: -+ extra["shared"] = "" -+ blockdev.lvm.vgcreate(self.name, pv_list, self.pe_size, **extra) -+ -+ if self._shared: -+ if availability.BLOCKDEV_LVM_PLUGIN_SHARED.available: -+ try: -+ blockdev.lvm.vglock_start(self.name) -+ except blockdev.LVMError as err: -+ raise errors.LVMError(err) -+ else: -+ raise errors.LVMError("Shared LVM is not fully supported: %s" % ",".join(availability.BLOCKDEV_LVM_PLUGIN_SHARED.availability_errors)) - - def _post_create(self): - self._complete = True -@@ -661,7 +680,7 @@ class LVMLogicalVolumeBase(DMDevice, RaidDevice): - def __init__(self, name, parents=None, size=None, uuid=None, seg_type=None, - fmt=None, exists=False, sysfs_path='', grow=None, maxsize=None, - percent=None, cache_request=None, pvs=None, from_lvs=None, -- stripe_size=0): -+ stripe_size=0, shared=False): - - if not exists: - if seg_type not in [None, "linear", "thin", "thin-pool", "cache", "vdo-pool", "vdo", "cache-pool"] + lvm.raid_seg_types: -@@ -690,6 +709,7 @@ class LVMLogicalVolumeBase(DMDevice, RaidDevice): - self.seg_type = seg_type or "linear" - self._raid_level = None - self.ignore_skip_activation = 0 -+ self._shared = shared - - self.req_grow = None - self.req_max_size = Size(0) -@@ -2306,7 +2326,8 @@ class LVMLogicalVolumeDevice(LVMLogicalVolumeBase, LVMInternalLogicalVolumeMixin - parent_lv=None, int_type=None, origin=None, vorigin=False, - metadata_size=None, chunk_size=None, profile=None, from_lvs=None, - compression=False, deduplication=False, index_memory=0, -- write_policy=None, cache_mode=None, attach_to=None, stripe_size=0): -+ write_policy=None, cache_mode=None, attach_to=None, stripe_size=0, -+ shared=False): - """ - :param name: the device name (generally a device node's basename) - :type name: str -@@ -2337,6 +2358,8 @@ class LVMLogicalVolumeDevice(LVMLogicalVolumeBase, LVMInternalLogicalVolumeMixin - :type cache_request: :class:`~.devices.lvm.LVMCacheRequest` - :keyword pvs: list of PVs to allocate extents from (size could be specified for each PV) - :type pvs: list of :class:`~.devices.StorageDevice` or :class:`LVPVSpec` objects (tuples) -+ :keyword shared: whether to activate the newly create LV in shared mode -+ :type shared: bool - - For internal LVs only: - -@@ -2412,7 +2435,7 @@ class LVMLogicalVolumeDevice(LVMLogicalVolumeBase, LVMInternalLogicalVolumeMixin - LVMLogicalVolumeBase.__init__(self, name, parents, size, uuid, seg_type, - fmt, exists, sysfs_path, grow, maxsize, - percent, cache_request, pvs, from_lvs, -- stripe_size) -+ stripe_size, shared) - LVMVDOPoolMixin.__init__(self, compression, deduplication, index_memory, - write_policy) - LVMVDOLogicalVolumeMixin.__init__(self) -@@ -2634,7 +2657,13 @@ class LVMLogicalVolumeDevice(LVMLogicalVolumeBase, LVMInternalLogicalVolumeMixin - log_method_call(self, self.name, orig=orig, status=self.status, - controllable=self.controllable) - ignore_skip_activation = self.is_snapshot_lv or self.ignore_skip_activation > 0 -- blockdev.lvm.lvactivate(self.vg.name, self._name, ignore_skip=ignore_skip_activation) -+ if self._shared: -+ if availability.BLOCKDEV_LVM_PLUGIN_SHARED.available: -+ blockdev.lvm.lvactivate(self.vg.name, self._name, ignore_skip=ignore_skip_activation, shared=True) -+ else: -+ raise errors.LVMError("Shared LVM is not fully supported: %s" % ",".join(availability.BLOCKDEV_LVM_PLUGIN_SHARED.availability_errors)) -+ else: -+ blockdev.lvm.lvactivate(self.vg.name, self._name, ignore_skip=ignore_skip_activation) - - @type_specific - def _pre_create(self): -@@ -2672,6 +2701,9 @@ class LVMLogicalVolumeDevice(LVMLogicalVolumeBase, LVMInternalLogicalVolumeMixin - if self._stripe_size: - extra["stripesize"] = str(int(self._stripe_size.convert_to("KiB"))) - -+ if self._shared: -+ extra["activate"] = "sy" -+ - blockdev.lvm.lvcreate(self.vg.name, self._name, self.size, - type=self.seg_type, pv_list=pvs, **extra) - else: -diff --git a/blivet/tasks/availability.py b/blivet/tasks/availability.py -index bba1ba84..85945c77 100644 ---- a/blivet/tasks/availability.py -+++ b/blivet/tasks/availability.py -@@ -435,6 +435,14 @@ if hasattr(blockdev.LVMTech, "VDO"): - else: - BLOCKDEV_LVM_TECH_VDO = _UnavailableMethod(error_msg="Installed version of libblockdev doesn't support LVM VDO technology") - -+if hasattr(blockdev.LVMTech, "SHARED"): -+ BLOCKDEV_LVM_SHARED = BlockDevTechInfo(plugin_name="lvm", -+ check_fn=blockdev.lvm_is_tech_avail, -+ technologies={blockdev.LVMTech.SHARED: blockdev.LVMTechMode.MODIFY}) # pylint: disable=no-member -+ BLOCKDEV_LVM_TECH_SHARED = BlockDevMethod(BLOCKDEV_LVM_SHARED) -+else: -+ BLOCKDEV_LVM_TECH_SHARED = _UnavailableMethod(error_msg="Installed version of libblockdev doesn't support shared LVM technology") -+ - # libblockdev mdraid plugin required technologies and modes - BLOCKDEV_MD_ALL_MODES = (blockdev.MDTechMode.CREATE | - blockdev.MDTechMode.DELETE | -@@ -476,6 +484,7 @@ BLOCKDEV_DM_PLUGIN_RAID = blockdev_plugin("libblockdev dm plugin (raid technolog - BLOCKDEV_LOOP_PLUGIN = blockdev_plugin("libblockdev loop plugin", BLOCKDEV_LOOP_TECH) - BLOCKDEV_LVM_PLUGIN = blockdev_plugin("libblockdev lvm plugin", BLOCKDEV_LVM_TECH) - BLOCKDEV_LVM_PLUGIN_VDO = blockdev_plugin("libblockdev lvm plugin (vdo technology)", BLOCKDEV_LVM_TECH_VDO) -+BLOCKDEV_LVM_PLUGIN_SHARED = blockdev_plugin("libblockdev lvm plugin (shared LVM technology)", BLOCKDEV_LVM_TECH_SHARED) - BLOCKDEV_MDRAID_PLUGIN = blockdev_plugin("libblockdev mdraid plugin", BLOCKDEV_MD_TECH) - BLOCKDEV_MPATH_PLUGIN = blockdev_plugin("libblockdev mpath plugin", BLOCKDEV_MPATH_TECH) - BLOCKDEV_SWAP_PLUGIN = blockdev_plugin("libblockdev swap plugin", BLOCKDEV_SWAP_TECH) -diff --git a/tests/unit_tests/devices_test/lvm_test.py b/tests/unit_tests/devices_test/lvm_test.py -index d7b55224..e645309f 100644 ---- a/tests/unit_tests/devices_test/lvm_test.py -+++ b/tests/unit_tests/devices_test/lvm_test.py -@@ -476,6 +476,31 @@ class LVMDeviceTest(unittest.TestCase): - lv.setup() - lvm.lvactivate.assert_called_with(vg.name, lv.lvname, ignore_skip=False) - -+ @patch("blivet.tasks.availability.BLOCKDEV_LVM_PLUGIN_SHARED", -+ new=blivet.tasks.availability.ExternalResource(blivet.tasks.availability.AvailableMethod, "")) -+ def test_lv_activate_shared(self): -+ pv = StorageDevice("pv1", fmt=blivet.formats.get_format("lvmpv"), -+ size=Size("1 GiB"), exists=True) -+ vg = LVMVolumeGroupDevice("testvg", parents=[pv], exists=True) -+ lv = LVMLogicalVolumeDevice("data_lv", parents=[vg], size=Size("500 MiB"), exists=True, shared=True) -+ -+ with patch("blivet.devices.lvm.blockdev.lvm") as lvm: -+ with patch.object(lv, "_pre_setup"): -+ lv.setup() -+ lvm.lvactivate.assert_called_with(vg.name, lv.lvname, ignore_skip=False, shared=True) -+ -+ @patch("blivet.tasks.availability.BLOCKDEV_LVM_PLUGIN_SHARED", -+ new=blivet.tasks.availability.ExternalResource(blivet.tasks.availability.AvailableMethod, "")) -+ def test_vg_create_shared(self): -+ pv = StorageDevice("pv1", fmt=blivet.formats.get_format("lvmpv"), -+ size=Size("1 GiB"), exists=True) -+ vg = LVMVolumeGroupDevice("testvg", parents=[pv], shared=True) -+ -+ with patch("blivet.devices.lvm.blockdev.lvm") as lvm: -+ vg._create() -+ lvm.vgcreate.assert_called_with(vg.name, [pv.path], Size("4 MiB"), shared="") -+ lvm.vglock_start.assert_called_with(vg.name) -+ - def test_vg_is_empty(self): - pv = StorageDevice("pv1", fmt=blivet.formats.get_format("lvmpv"), - size=Size("1024 MiB")) --- -2.41.0 - diff --git a/SPECS/python-blivet.spec b/python-blivet.spec similarity index 76% rename from SPECS/python-blivet.spec rename to python-blivet.spec index 0b5f6e1..15f5292 100644 --- a/SPECS/python-blivet.spec +++ b/python-blivet.spec @@ -1,59 +1,33 @@ -%define is_rhel 0%{?rhel} != 0 - -# python3 is not available on RHEL <=7 -%if %{is_rhel} && 0%{?rhel} <= 7 -# disable python3 by default -%bcond_with python3 -%else -%bcond_without python3 -%endif - -# python2 is not available on RHEL > 7 and not needed on Fedora > 28 -%if 0%{?rhel} > 7 || 0%{?fedora} > 28 -# disable python2 by default -%bcond_with python2 -%else -%bcond_without python2 -%endif - Summary: A python module for system storage configuration Name: python-blivet Url: https://storageapis.wordpress.com/projects/blivet -Version: 3.6.0 +Version: 3.10.0 #%%global prerelease .b2 # prerelease, if defined, should be something like .a1, .b1, .b2.dev1, or .c2 -Release: 8%{?prerelease}%{?dist} +Release: 5%{?prerelease}%{?dist} Epoch: 1 -License: LGPLv2+ +License: LGPL-2.1-or-later %global realname blivet %global realversion %{version}%{?prerelease} Source0: http://github.com/storaged-project/blivet/archive/%{realname}-%{realversion}.tar.gz Source1: http://github.com/storaged-project/blivet/archive/%{realname}-%{realversion}-tests.tar.gz -Patch0: 0001-force-lvm-cli.plugin -Patch1: 0002-remove-btrfs-plugin.patch -Patch2: 0003-Revert-More-consistent-lvm-errors.patch -Patch3: 0004-Revert-Terminology-cleanups.patch -Patch4: 0005-DDF-RAID-support-using-mdadm.patch -Patch5: 0006-Revert-Remove-the-Blivet.roots-attribute.patch -Patch6: 0007-Fix-potential-AttributeError-when-getting-stratis-bl.patch -Patch7: 0008-tests-Skip-XFS-resize-test-on-CentOS-RHEL-8.patch -Patch8: 0009-Revert-Adjust-to-new-XFS-min-size.patch -Patch9: 0010-Catch-BlockDevNotImplementedError-for-btrfs-plugin-c.patch -Patch10: 0011-Default-to-encryption-sector-size-512-for-LUKS-devic.patch -Patch11: 0012-Add-support-for-specifying-stripe-size-for-RAID-LVs.patch -Patch12: 0013-Fix-setting-kickstart-data.patch -Patch13: 0014-Do-not-set-memory-limit-for-LUKS2-when-running-in-FI.patch -Patch14: 0015-Add-support-for-filesystem-online-resize.patch -Patch15: 0016-Backport-iSCSI-initiator-name-related-fixes.patch -Patch16: 0017-Add-support-for-creating-shared-LVM-setups.patch + +%if 0%{?rhel} >= 9 +Patch0: 0001-remove-btrfs-plugin.patch +%endif + +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). -%global partedver 3.2 +%global partedver 1.8.1 %global pypartedver 3.10.4 %global utillinuxver 2.15.1 -%global libblockdevver 2.24 +%global libblockdevver 3.0 %global libbytesizever 0.3 %global pyudevver 0.18 @@ -76,7 +50,6 @@ Conflicts: python3-blivet < 1:2.0.0 The %{realname}-data package provides data files required by the %{realname} python module. -%if %{with python3} %package -n python3-%{realname} Summary: A python3 package for examining and modifying storage configuration. @@ -86,26 +59,28 @@ BuildRequires: gettext BuildRequires: python3-devel BuildRequires: python3-setuptools -%{?__python3:Requires: %{__python3}} -Requires: python3-six +Requires: python3 Requires: python3-pyudev >= %{pyudevver} Requires: parted >= %{partedver} Requires: python3-pyparted >= %{pypartedver} Requires: libselinux-python3 +Requires: python3-libmount Requires: python3-blockdev >= %{libblockdevver} Recommends: libblockdev-btrfs >= %{libblockdevver} Recommends: libblockdev-crypto >= %{libblockdevver} Recommends: libblockdev-dm >= %{libblockdevver} Recommends: libblockdev-fs >= %{libblockdevver} -Recommends: libblockdev-kbd >= %{libblockdevver} Recommends: libblockdev-loop >= %{libblockdevver} Recommends: libblockdev-lvm >= %{libblockdevver} Recommends: libblockdev-mdraid >= %{libblockdevver} Recommends: libblockdev-mpath >= %{libblockdevver} -Recommends: libblockdev-nvdimm >= %{libblockdevver} -Recommends: libblockdev-part >= %{libblockdevver} +Recommends: libblockdev-nvme >= %{libblockdevver} Recommends: libblockdev-swap >= %{libblockdevver} + +%ifarch s390 s390x Recommends: libblockdev-s390 >= %{libblockdevver} +%endif + Requires: python3-bytesize >= %{libbytesizever} Requires: util-linux >= %{utillinuxver} Requires: lsof @@ -115,76 +90,19 @@ Requires: %{realname}-data = %{epoch}:%{version}-%{release} Obsoletes: blivet-data < 1:2.0.0 -%if %{without python2} -Obsoletes: python2-blivet < 1:2.0.2-2 -Obsoletes: python-blivet < 1:2.0.2-2 -%else -Obsoletes: python-blivet < 1:2.0.0 -%endif - %description -n python3-%{realname} The python3-%{realname} is a python3 package for examining and modifying storage configuration. -%endif - -%if %{with python2} -%package -n python2-%{realname} -Summary: A python2 package for examining and modifying storage configuration. - -%{?python_provide:%python_provide python2-%{realname}} - -BuildRequires: gettext -BuildRequires: python2-devel -BuildRequires: python2-setuptools - -Requires: python2 -Requires: python2-six -Requires: python2-pyudev >= %{pyudevver} -Requires: parted >= %{partedver} -Requires: python2-pyparted >= %{pypartedver} -Requires: python2-libselinux -Requires: python2-blockdev >= %{libblockdevver} -Recommends: libblockdev-btrfs >= %{libblockdevver} -Recommends: libblockdev-crypto >= %{libblockdevver} -Recommends: libblockdev-dm >= %{libblockdevver} -Recommends: libblockdev-fs >= %{libblockdevver} -Recommends: libblockdev-kbd >= %{libblockdevver} -Recommends: libblockdev-loop >= %{libblockdevver} -Recommends: libblockdev-lvm >= %{libblockdevver} -Recommends: libblockdev-mdraid >= %{libblockdevver} -Recommends: libblockdev-mpath >= %{libblockdevver} -Recommends: libblockdev-nvdimm >= %{libblockdevver} -Recommends: libblockdev-part >= %{libblockdevver} -Recommends: libblockdev-swap >= %{libblockdevver} -Recommends: libblockdev-s390 >= %{libblockdevver} -Requires: python2-bytesize >= %{libbytesizever} -Requires: util-linux >= %{utillinuxver} -Requires: lsof -Requires: python2-hawkey -Requires: %{realname}-data = %{epoch}:%{version}-%{release} - -Requires: systemd-udev -Requires: python2-gobject-base - -Obsoletes: blivet-data < 1:2.0.0 -Obsoletes: python-blivet < 1:2.0.0 - -%description -n python2-%{realname} -The python2-%{realname} is a python2 package for examining and modifying storage -configuration. -%endif %prep %autosetup -n %{realname}-%{realversion} -N %autosetup -n %{realname}-%{realversion} -b1 -p1 %build -%{?with_python2:make PYTHON=%{__python2}} -%{?with_python3:make PYTHON=%{__python3}} +make %install -%{?with_python2:make PYTHON=%{__python2} DESTDIR=%{buildroot} install} -%{?with_python3:make PYTHON=%{__python3} DESTDIR=%{buildroot} install} +make DESTDIR=%{buildroot} install %find_lang %{realname} @@ -194,321 +112,927 @@ configuration. %{_libexecdir}/* %{_unitdir}/* -%if %{with python2} -%files -n python2-%{realname} -%license COPYING -%doc README.md ChangeLog examples -%{python2_sitelib}/* -%endif - -%if %{with python3} %files -n python3-%{realname} %license COPYING %doc README.md ChangeLog examples %{python3_sitelib}/* -%endif %changelog -* Mon Oct 30 2023 Vojtech Trefny - 3.6.0-8 -- Add support for creating shared LVM setups - Resolves: RHEL-14021 +* Tue Jul 16 2024 Vojtech Trefny - 3.10.0-5 +- Consolidated Device Configuration for RHEL 10 + Resolves: RHEL-39381 -* Mon Jul 24 2023 Jan Pokorny - 3.6.0-7 -Backport iSCSI initiator name related fixes: -- Allow changing iSCSI initiator name after setting it - Resolves: rhbz#2083139 -- Add a basic test case for the iscsi module - Related: rhbz#2083139 -- tests: Use blivet-specific prefix for targetcli backing files - Related: rhbz#2083139 -- iscsi: Save firmware initiator name to /etc/iscsi/initiatorname.iscsi - Resolves: rhbz#2084043 -- tests: Improve iscsi_test.ISCSITestCase - Related: rhbz#2083139 +* Thu Jun 27 2024 Vojtech Trefny - 3.10.0-4 +- tests: Try waiting after partition creation for XFS resize test + Resolves: RHEL-45177 +- Run mkfs.xfs with the force (-f) option by default + Resolves: RHEL-39384 -* Thu May 18 2023 Vojtech Trefny - 3.6.0-6 -- Fix setting kickstart data - Resolves: rhbz#2175166 -- Do not set memory limit for LUKS2 when running in FIPS mode - Resolves: rhbz#2183437 +* Mon Jun 24 2024 Troy Dawson - 1:3.10.0-3 +- Bump release for June 2024 mass rebuild + +* Tue May 14 2024 Vojtech Trefny - 3.10.0-2 +- Fix skipping btrfs calls when libblockdev btrfs plugin is missing + Resolves: RHEL-36190 + +* Fri May 10 2024 Vojtech Trefny - 3.10.0-1 +- Added support for PV grow (japokorn) +- misc: Add stratis-cli and stratisd to test dependencies (vtrefny) +- tests: Add a base class for stratis tests (vtrefny) +- Add a Stratis example with pool encryption using Clevis/Tang (vtrefny) +- Clear VG UUID from PVs after removing the PV (#2278058) (vtrefny) +- Use longer timeout for Stratis DBus calls (vtrefny) +- safe-dbus: Allow using custom timeouts for the DBus calls (vtrefny) +- Catch JSONDecodeError when parsing Stratis Clevis info (vtrefny) +- Add support for unlocking locked Stratis pools with Clevis (vtrefny) +- Add support for creating encrypted Stratis pool with Clevis (vtrefny) +- Round Stratis Filesystem size down to the nearest sector (vtrefny) +- Make sure to include stderr when gathering output of stratis tools (vtrefny) +- Add support for adding new members to existing Stratis pool (vtrefny) +- Base StratisPoolDevice on ContainerDevice instead of StorageDevice (vtrefny) +- Ignore invalid/empty UUIDs for NVMe namespaces (vtrefny) +- lvm: Use more generic exception for inconsistent PV sector sizes (vtrefny) +- Do not allow creating stratis pools with different sector sizes (vtrefny) +- availability: Fix starting DBus services (vtrefny) +- fstab: Use 'mount_type' when writing filesystem type to fstab (vtrefny) +- Add basic support for BitLocker devices (vtrefny) +- nvme: Skip startup/write when NVMe plugin isn't available (vtrefny) +- Fix scanning partitions on RAID arrays (#2269133) (vtrefny) +- Add a test case with DDF BIOS RAID array (vtrefny) +- tests: Try to get distro and version from /etc/os-release (vtrefny) +- availability: Fix checking for DBus service availability (vtrefny) +- ci: Update packit configuration for 3.10-devel (vtrefny) +- Remove vim formatting comments (vtrefny) +- tests: Do not ignore entire test files in pylint (vtrefny) +- tests: Do not try to import mock and patch from mock (vtrefny) +- Remove util.stringize and unicodeize functions (vtrefny) +- Remove Python SIX usage (vtrefny) +- Remove unused flags and do not read flags from boot command line (vtrefny) + +* Mon Feb 12 2024 Vojtech Trefny - 3.9.0-3 +- Fix UnboundLocalError in MD populator (#2263668) + +* Tue Feb 06 2024 Vojtech Trefny - 3.9.0-2 +- Fix crash when scanning degraded/not fully assembled MD arrays + +* Wed Jan 31 2024 Vojtech Trefny - 3.9.0-1 +- Fix getting default LVM cache metadata size from libblockdev (vtrefny) +- Fix checking for segment type for cache pools (vtrefny) +- tests: Enable GFS2 tests (vtrefny) +- tests: Move 'test_labels' to unit tests (vtrefny) +- Add a new function to check if a filesystem is empty (vtrefny) +- tests: Wait for array resync in MD tests (vtrefny) +- misc: Vagrantfile update (vtrefny) +- tests: Add a simple unit test for the NVMe module (vtrefny) +- tests: Add a test case with multiple devices with the same name (vtrefny) +- tests: Add basic unit tests for device_id (vtrefny) +- tests: Add a simple test for DeviceTree.get_device_by_device_id (vtrefny) +- Use get_device_by_device_id instead of _by_name in populator (vtrefny) +- Add a function to get a device by device ID (vtrefny) +- Add "device ID" that could be used as a unique device identifier (vtrefny) +- Fix adding new members to array with redundancy (vtrefny) +- Correctly set md_uuid when adding/removing member to/from array (vtrefny) +- tests: Add storage test case for MD RAID (vtrefny) +- Remove unused pylintcodediff helper script (vtrefny) +- tests: Add a simple unit test for Btrfs (vtrefny) +- Generate UUID for newly created btrfs volumes (vtrefny) +- nvme: Retrieve HostNQN from a first active fabrics connection (tbzatek) +- ci: Set custom release number for Packit (vtrefny) +- Support partitioning of hybrid boot disks (vponcova) +- Fix checking PV free space when removing it from a VG (#2232328) (vtrefny) +- tests: run_tests script enhancements (vtrefny) +- Add a BTRFS example (vtrefny) +- tests: Add a storage test case for BTRFS (vtrefny) +- Remove support for NVDIMM namespaces (vtrefny) +- Fix passing extra mkfs arguments to libblockdev (vtrefny) +- ci: Add a GH action to run blivet-gui test suite on PRs (vtrefny) +- ci: Add a Dockerfile for building a CI container (vtrefny) +- ci: Allow installing only build dependencies without test deps (vtrefny) +- Fix failing tests when running as a non-root user (vtrefny) +- Add flag to control LVM devices file support (vtrefny) +- Use libblockdev to check for kernel modules availability (vtrefny) +- Use libblockdev to remove filesystems instead of calling wipefs (vtrefny) +- swap: Use libblockdev to check label and UUID format (vtrefny) +- fs_test: Enable NTFS test case (vtrefny) +- availability: Remove the unused "lvmdevices" application (vtrefny) +- availability: Cleanup applications (vtrefny) +- Remove support for Apple HFS format (vtrefny) +- Fix raising FormatCreateError in FS._create (vtrefny) +- Use libblockdev for filesystem mount operation (vtrefny) +- Use os.statvfs instead of df to get tmpfs size (vtrefny) +- Use libblockdev to create supported filesystems (vtrefny) +- Use libblockdev for reading filesystem label (vtrefny) +- Use libblockdev for getting filesystem info and size (vtrefny) +- Use libblockdev for filesystem resizing (vtrefny) +- Use libblockdev for setting and checking filesystem label and UUID (vtrefny) +- swap: Simplify creating swap with UUID (vtrefny) +- Use libblockdev for the filesystem sync operation (vtrefny) +- Add libblockdev filesystem plugin to the list of required plugins (vtrefny) +- availability: Remove unused "mlabel" application (vtrefny) +- availability: Simplify checks for LVM VDO and shared LVM support (vtrefny) +- availability: Do not check e2fsprogs version (vtrefny) +- Remove JFS support (vtrefny) +- Remove support for ReiserFS (vtrefny) +- ci: Update default branch for Packit to 3.9-devel/release (vtrefny) +- fcoe/iscsi: Use libblockdev to load modules instead of modprobe (vtrefny) +- Added missing fstab object to SwapSpace (japokorn) +- misc: Update test dependencies ansible playbook (vtrefny) +- misc: Simplify the makebumpver script (vtrefny) +- Do not fail when kpartx is not available (vtrefny) +- Move kpartx dependency from DMDevice to MultipathDevice (vtrefny) +- ci: Update default branch for Packit to 3.9-devel/release (vtrefny) +- Include btrfs volumes names/labels in DeviceTreeBase.names (vtrefny) +- fixed fstab.read issue (japokorn) +- Added support for user defined values in fstab (japokorn) +- Incorporated review comments (japokorn) +- Fstab support (japokorn) +- add udev-builtin-path_id property to zfcp-attached SCSI disks (maier) + +* Fri Jan 26 2024 Fedora Release Engineering - 1:3.8.2-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild + +* Sun Jan 21 2024 Fedora Release Engineering - 1:3.8.2-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild + +* Wed Dec 13 2023 Vojtech Trefny - 3.8.2-2 +- add udev-builtin-path_id property to zfcp-attached SCSI disks + +* Thu Oct 12 2023 Vojtech Trefny - 3.8.2-1 +- tests: Ignore new pylint false positive with pylint 3.0 (vtrefny) +- pylint: Use 'exit' instead of 'do_exit' for pylint.lint.Run (vtrefny) +- Revert "When creating a shared LVM VG skip pvcreate" (vtrefny) +- Revert "Force command line based libblockdev LVM plugin" (vtrefny) +- ci: Bump actions/checkout from v2/3 to v4 (vtrefny) +- spec: Add libblockdev-nvme as weak dependency (vtrefny) +- Always require NVMe plugin (vtrefny) +- Enable LVM logging only in debug mode (vtrefny) +- nvme: Require additional rpms for dracut (tbzatek) +- Force command line based libblockdev LVM plugin (vtrefny) +- When creating a shared LVM VG skip pvcreate (vtrefny) +- Add support for creating shared LVM setups (vtrefny) +- nvme: Align HostNQN and HostID format to TP4126 (tbzatek) +- README: Fix typo (vtrefny) +- README: Update Debian dependencies for libblockdev 3.0 (vtrefny) + +* Thu Aug 03 2023 Vojtech Trefny - 3.8.1-1 +- Ignore new false positives with the latest pylint (vtrefny) +- iscsi: Rename storaged to udisks (tbzatek) +- iscsi: Rework UDisks iscsi module activation (tbzatek) +- iscsi: Make sure to modprobe iscsi_ibft (tbzatek) +- iscsi: Downgrade default CHAP auth algs to SHA1,MD5 (tbzatek) +- iscsi: Save firmware initiator name to /etc/iscsi/initiatorname.iscsi (vtrefny) +- spec: Bump release to 99 to be always ahead of Fedora in nightly (vtrefny) +- tests: Improve iscsi_test.ISCSITestCase (vtrefny) +- Make sure that LUKS.has_key always returns a boolean value (vtrefny) +- Squashed 'translation-canary/' changes from d6a40985..5bb81253 (vtrefny) +- Add btrfs subvolume specification to devicetree.resolve_device (vtrefny) +- Revert "Makefile cleanup" (vtrefny) + +* Fri Jul 21 2023 Fedora Release Engineering - 1:3.8.0-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild + +* Thu Jun 29 2023 Python Maint - 1:3.8.0-2 +- Rebuilt for Python 3.12 + +* Thu Jun 29 2023 Vojtech Trefny - 3.8.0-1 +- Revert "Makefile cleanup" (blivet-ci) +- Require libblockdev 3.0 when importing from GI (vtrefny) +- spec: Bump required version of libblockdev to 3.0 (vtrefny) +- md: Adapt libblockdev 3.0 mdraid bitmap arg changes (tbzatek) +- spec: Bump release to 99 to be always ahead of Fedora in nightly (vtrefny) +- ci: Run GH actions tests in a Fedora container (vtrefny) +- Add new LUKS tests for add/remove key and key file usage (vtrefny) +- Adjust to the new libblockdev 3.0 crypto API (vtrefny) +- Adjust to libblockdev 3.0 API changes (vtrefny) +- blivet: Enable the extended node bitmap for F2FS (akoskovich) +- Remove all state-dependent objects when resetting Blivet DBus object. (dlehman) +- Run callbacks when pruning actions. (dlehman) +- Always prefer GPT disk labels on x86_64 (and clean up the logic) (awilliam) +- Do not add new PVs to the LVM devices file if it doesn't exist and VGs are present (vtrefny) +- Add RISCV64 architecture helper [is_riscv64()] for arch module. (48907457+nirousseau) +- iscsi: Extend allowed CHAP auth algorithms (tbzatek) +- Fix checking FIPS mode when /proc/sys/crypto/fips_enabled doesn't exist (vtrefny) +- Fix creating LUKS1 on disks with mixed sector size (#2188785) (vtrefny) +- Do not set memory limit for LUKS2 when running in FIPS mode (vtrefny) +- Revert "tests: Skip test_lvcreate_type on CentOS/RHEL 9" (vtrefny) +- DBus: remove extra callback invocations (dlehman) +- Add a test case for filesystem online resize (vtrefny) +- Add support for filesystem online resize (vtrefny) +- iscsi: Use UDisks instead of storaged in the availability message (vtrefny) +- tests: Fix skipping iSCSI tests if UDisks iSCSI isn't available (vtrefny) +- Add ChangeLog to .gitignore (vtrefny) +- Makefile cleanup (vtrefny) +- ci: Use Packit for daily builds in Copr (vtrefny) +- Avoid raising libblockdev exceptions from our code (vtrefny) +- ci: Fix Packit configuration (vtrefny) +- Add support for specifying stripe size for RAID LVs (vtrefny) +- tests: Use blivet-specific prefix for targetcli backing files (vtrefny) +- Add a basic test case for the iscsi module (vtrefny) +- Allow changing iSCSI initiator name after setting it (vtrefny) +- Prefer UUID for fstab spec for DM devices too (vtrefny) +- Remove support for Python 2 from spec and Makefile (vtrefny) + +* Tue Jun 13 2023 Python Maint - 1:3.7.1-5 +- Rebuilt for Python 3.12 + +* Wed May 31 2023 Vojtech Trefny <@trefny@redhat.com> - 3.7.1-4 +- Always prefer GPT disk labels on x86_64 + +* Tue May 23 2023 Vojtech Trefny - 3.7.1-3 - Add support for filesystem online resize - Resolves: rhbz#2168680 -* Tue May 02 2023 Vojtech Trefny - 3.6.0-5 +* Thu May 04 2023 Vojtech Trefny - 3.7.1-2 - Add support for specifying stripe size for RAID LVs - Resolves: rhbz#2142550 -* Thu Jan 19 2023 Vojtech Trefny - 3.6.0-4 -- Default to encryption sector size 512 for LUKS devices - Resolves: rhbz#2160465 +* Thu Mar 16 2023 Vojtech Trefny - 3.7.1-1 +- Fix the get_mount_device function (vponcova) +- Prefer using UUID for the kickstart --onpart argument (vtrefny) +- Fix setting kickstart data (vtrefny) +- pylint: Remove the "EXCEPTIONS" section from pylintrc (vtrefny) +- Add "microsoft" to list of recognized VM environments (vtrefny) +- ci: Add action to run unit tests in GH actions (vtrefny) +- tests: Make sure that unit tests can run without root privileges (vtrefny) +- doc: Link to the LVM VDO documentation from the index page (vtrefny) +- Ignore missing parted disk in ActionList._post_process (#2102960) (vtrefny) -* Thu Nov 03 2022 Vojtech Trefny - 3.6.0-3 -- Catch BlockDevNotImplementedError for btrfs plugin calls - Resolves: rhbz#2139169 -- Revert "Adjust to new XFS min size" - Resolves: rhbz#2139187 +* Wed Feb 08 2023 Vojtech Trefny - 3.7.0-1 +- Remove unused BLOCKDEV_DM_RAID technology from tasks (vtrefny) +- tests: Force remove LVM VG /dev/ entry not removed by vgremove (vtrefny) +- Mark LUKS2 integrity devices as always controllable (vtrefny) +- Ignore parent dependencies during action execute (vtrefny) +- tests: Patch checking stratis pool metadata size (vtrefny) +- Remove support for DMRAID devices (vtrefny) +- Do not read DDF RAID UUID from udev (vtrefny) +- Check physical and logical block size when creating a LUKS format (vtrefny) +- Add separate properties for logical and physical block size (vtrefny) +- Use DMI product_name for t2 mac detection. (83884198+sharpenedblade) +- vmtests: add a --logs arg to capture blivet.log from failed tests (berrange) +- examples: illustrate GPT GUID usage in partitioning example (berrange) +- vmtests: add test for GPT part type UUID validation (berrange) +- blivet: allow 'mountpoint' to be passed to PartitionDevice (berrange) +- deviceaction: retain explicit part type UUID when formatting (berrange) +- devices/partition: add ability to auto apply a GPT UUID (berrange) +- gpt: add helper API for discoverable partition UUIDs (berrange) +- devices/partition: allow passing partition type UUID (berrange) +- formats/disklabel: allow passing partition type UUID (berrange) +- Add a forced delay to udev settle in chroot environments (vlad.bespalov) +- Update public API documentation (vtrefny) +- tests/README: Clarify various test classes (vtrefny) +- Rename unit_tests.storagetestcase to unit_tests.blivettestcase (vtrefny) +- Add additional identifiers to NVMeNamespaceDevice (vtrefny) +- Add transport and address to NVMeController info (vtrefny) +- Make sure we close the streams when reading a file (vtrefny) +- Style changes. (sharpenedblade) +- Do not report mactel on T2 macs. (sharpenedblade) +- Add function to check for T2 apple macs. (sharpenedblade) +- Add a basic read-only support for UDF filesystem (vtrefny) +- add loongarch support (mahailiang) +- Add a basic support for NVMe and NVMe Fabrics devices (vtrefny) -* Fri Oct 21 2022 Vojtech Trefny - 3.6.0-2 -- Skip XFS resize test on CentOS/RHEL 8 - Related: rhbz#2123712 +* Thu Feb 02 2023 Vojtech Trefny - 3.6.1-3 +- Use mdadm to support BIOS RAID devices (#2158574) -* Fri Oct 21 2022 Vojtech Trefny - 3.6.0-1 -- Rebase to the latest upstream release 3.6.0 - Resolves: rhbz#2123712 +* Fri Jan 20 2023 Fedora Release Engineering - 1:3.6.1-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild -* Thu Aug 18 2022 Vojtech Trefny - 3.4.0-13 -- DDF RAID support using mdadm - Resolves: rhbz#2063791 +* Mon Nov 28 2022 Vojtech Trefny - 3.6.1-1 +- misc: Remove "warn: false" from Ansible "command" (vtrefny) +- spec: Change license string to the SPDX format required by Fedora (vtrefny) +- Catch BlockDevNotImplementedError for btrfs plugin calls (vtrefny) +- tests: document how to use the VM tests (berrange) +- tests: allow filtering tests to run in VM (berrange) +- tests: don't start/stop VM if it was already running (berrange) +- tests: use correct password arg for SSH to VM (berrange) +- tests: add logging to runvmtests.py (berrange) +- Fix potential AttributeError when getting stratis blockdev info (vtrefny) +- spec: Fix recommended libblockdev plugins (vtrefny) +- tests: remove unused global variables (berrange) +- Backport total_memory improvements from anaconda (vslavik) +- Fix regex for checking e2fsprogs version (vtrefny) -* Mon Jun 20 2022 Vojtech Trefny - 3.4.0-12 +* Fri Nov 11 2022 Vojtech Trefny - 3.6.0-2 +- Change license string to the SPDX format required by Fedora + +* Tue Sep 20 2022 Vojtech Trefny - 3.6.0-1 +- pylint: Explicitly allow loading the _ped module from pyparted (vtrefny) +- ci: Run static analysis on Ubuntu 22.04 (vtrefny) +- tests: Create bigger devices for XFS testing (vtrefny) +- Set XFS minimal size to 300 MiB (vtrefny) +- Fix missing whitespaces around not keyword (vtrefny) +- Remove the Blivet.roots attribute (vponcova) +- packit: Set downstream_package_name to python-blivet (vtrefny) +- packit: Add srpm_build_deps for SRPM builds in Copr (vtrefny) +- tests: Fix message when skipping stratis tests (vtrefny) +- tests: Tell pytest to ignore symlinks when gathering test cases (vtrefny) +- Configure ids for Mock devices in populator_test (vtrefny) +- Add storage tests for Stratis (vtrefny) +- ci: Fix installing targetcli on Debian/Ubuntu (vtrefny) +- tests: Add test for creating and attaching cache pools (vtrefny) +- tests: Add storage tests for more LVM RAID levels (vtrefny) +- tests: Add test for ActionAddMember/ActionRemoveMember (vtrefny) +- tests: Add a test for creating and attaching a cache pool (vtrefny) +- Mark LVM cache pool format as immutable (vtrefny) +- tests: Skip test_lvcreate_type on CentOS/RHEL 9 (vtrefny) +- Add a YAML config for skipping tests on specified distributions (vtrefny) +- Add targetcli to the test dependencies playbook (vtrefny) +- Add a simple LVM test case that uses real storage (vtrefny) +- Add a test case that creates targetcli disks to run tests on (vtrefny) +- Allow running action_test even if some dependencies are missing (vtrefny) +- Use "fake" names for disks in DeviceTreeTestCase (vtrefny) +- Change how we import LoopBackedTestCase in fs_test (vtrefny) +- Add information about the new test suites to tests/README.rst (vtrefny) +- Makefile: Add targets to run the two new test suites separately (vtrefny) +- Fix typo in name of test_new_encrypted_stratis (vtrefny) +- Patch access to lvs in stratis tests (vtrefny) +- Fix pylint issues in the tests/pylint scripts (vtrefny) +- Make sure LVM unit tests can run without dependencies (vtrefny) +- Patch _pre_create in StorageDeviceMethodsTestCase.test_create (vtrefny) +- Assure that tests that set LVM devices filter can run without root (vtrefny) +- Fix running StratisFactoryTestCase as a non-root user (vtrefny) +- Split the test suite into "unit" and "storage" tests (vtrefny) +- Add support for attaching and creating LVM writecached LVs (vtrefny) +- Add support for enabling/disabling compression/deduplication (vtrefny) + +* Fri Jul 22 2022 Fedora Release Engineering - 1:3.5.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild + +* Tue Jul 19 2022 Vojtech Trefny - 3.5.0-1 +- tests: Fix patching NVDIMM static data in populator_test (vtrefny) +- Ignore pylint false positives about missing methods in Gio and GLib (vtrefny) +- Ignore pylint warning about missing inspect.getargspec (vtrefny) +- Rename class ZFCPDevice to ZFCPDeviceFullPath (jstodola) +- Move _is_associated_with_fcp() implementation to the derived class (jstodola) +- Improve naming of zfcp classes/methods/functions (jstodola) +- Correct zfcp comments and strings (jstodola) +- Fix checking for stratis pool free space when adding a new filesystem (vtrefny) +- tests: Add a VM test case for Stratis (vtrefny) +- Use libblockdev to check for DBus service availability (vtrefny) +- Allow specifying size for stratis filesystems (vtrefny) +- tests: Skip Stratis DeviceFactory tests if missing dependencies (vtrefny) +- Use availability checks in devicelibs.stratis (vtrefny) +- Add external dependencies for Stratis devices classes (vtrefny) +- Add availability checks for Stratis dependencies (vtrefny) +- availability: Add a method to check for DBus service availability (vtrefny) +- Use the new Stratis tool to predict pool and fs used size (vtrefny) +- misc: Vagrantfile update (vtrefny) +- Add CentOS 9 Stream to the install-test-dependencies playbook (vtrefny) +- ci: Run static analysis checks in GitHub actions (vtrefny) +- doc: Add LVMWriteCache and LVMCachePoolMixin to public API (vtrefny) +- pylint: Remove deprecated pylint warnings from pylintrc and code (vtrefny) +- Add option to attach a newly created cache pool to existing LV (vtrefny) +- Add support for LVM RAID raid0 level (vtrefny) +- Do not fail when we can't get LVM cache information (#2086310) (vtrefny) +- Add a very simple NVMe module (vtrefny) +- Do not check for "problematic" disks in ActionList._pre_process (vtrefny) +- Change label_format_ok and uuid_format_ok to class methods (vtrefny) +- Generate correct dracut boot arguments for NPIV devices (jstodola) +- Add new class for NPIV-enabled devices (jstodola) +- LUN and WWPN should not be used for NPIV zFCP devices (jstodola) +- Add a function for reading the value of a kernel module parameter (jstodola) +- Allow to delete more than one SCSI device (jstodola) +- Move offline_scsi_device() to the base class (jstodola) +- Refactor the ZFCPDevice class (jstodola) +- misc: Vagrantfile update (vtrefny) +- Do not crash when a disk populator doesn't return kwargs (vtrefny) +- Disable Fedora ELN builds in packit (vtrefny) +- Fix raising exception when trying to resize internal LVs (vtrefny) +- Create loop devices for tests with --partscan (vtrefny) +- Make sure configure actions obsolete only actions with same attribute (vtrefny) +- Fix exception message when trying to format an non-existing device (vtrefny) +- Add default arguments for mkntfs (vtrefny) +- Mark NTFS as supported (vtrefny) +- Do no try to read cache MD size for inactive LVs from cache stats (vtrefny) +- Show better error when using unitialized disk in do_partitioning (vtrefny) +- Exclude unusable disks from PartitionFactory (vtrefny) +- Mark StratisXFS format as unsupported (vtrefny) +- Adjust to Stratis 3.0 API (vtrefny) +- lvm: Use blivet static data when checking if the VG is active (vtrefny) +- examples: Add LVM cache pool example (vtrefny) +- Add suport for creating LVM cache pools (vtrefny) +- Do not run pvcreate with --devices and list of PVs (vtrefny) +- Fix object type for ActionConfigureDevice (vtrefny) +- Use subvolume mountpoints when listing btrfs subvolumes (vtrefny) +- Squashed 'translation-canary/' changes from 4d4e65b8..d6a40985 (vtrefny) +- Fix log message for the LVM devices filter (vtrefny) +- Add support for creating standalone integrity devices (vtrefny) +- Use bigger chunk size for thinpools bigger than ~15.88 TiB (vtrefny) +- Fix removing zFCP SCSI devices (jstodola) +- Add public functions to add/remove PV to/from the LVM system.devices (vtrefny) +- Ignore errors for LVM devices file actions (vtrefny) +- Make sure PVs are added/deleted to/from the LVM device file (vtrefny) +- Use LVM devices for filtering LVM devices with LVM >= 2.02.13 (vtrefny) +- Switch LVM devices filter from "reject" to "accept" by default (vtrefny) +- tests: Mark "fake" disks in test_get_related_disks as non-existing (vtrefny) +- Set correct map name for existing LUKS devices (vtrefny) +- Do not raise deprecated IOError from iscsi and fcoe modules (vtrefny) +- Remove unused flag multipath (vtrefny) +- Do not add device name as a parameter for errors.DeviceError (vtrefny) +- Add stratis filesystem metadata size and pool free space (vtrefny) +- Fix parameters differ from overridden in StratisPoolDevice (vtrefny) +- Fix/unify importing mock module in stratis tests (vtrefny) +- Add fstab options for Stratis Filesystem devices (vtrefny) +- Add MountClass for StratisXFS filesystem (vtrefny) +- Add Stratis devices and formats to the public API documentation (vtrefny) +- Hide the private LUKS device for unlockded Stratis pools (vtrefny) +- Add property with list of Stratis block devices to StratisPoolDevice (vtrefny) +- Set pool info on the block devices when adding/removing Stratis pool (vtrefny) +- Set the StratisBlockdev format status based on whether it has a pool or not (vtrefny) +- Add more tests for creating Stratis devices (vtrefny) +- Add support for creating encrypted Stratis devices with DeviceFactory (vtrefny) +- Add support for working with locked Stratis pools (vtrefny) +- Add support for creating encrypted Stratis pools (vtrefny) +- Add Stratis device factory (vtrefny) +- Mark format on Stratis pool devices as immutable (vtrefny) +- Add Stratis example (vtrefny) +- Add simple test case for Stratis (vtrefny) +- Add basic support for creating Stratis devices (vtrefny) +- Add a special "XFS Stratis" filesystem for Stratis filesystem devices (vtrefny) +- Avoid circular depency when in static_data/stratis_info.py (vtrefny) +- Add dracut setup args for Stratis devices (vtrefny) +- Add support for removing Stratis devices using DBus API (vtrefny) +- Add basic support for Stratis devices (vtrefny) +- Ignore all "private" devices during populate (vtrefny) +- safe_dbus: Add function to get all properties for an interface (vtrefny) +- Add support for renaming devices using ActionConfigureDevice (vtrefny) + +* Mon Jun 20 2022 Vojtech Trefny - 3.4.4-3 - Add support for NPIV-enabled zFCP devices - Resolves: rhbz#1497087 -* Thu Jun 02 2022 Vojtech Trefny - 3.4.0-11 -- Fix running gating tests on AWS/Xen machines - Resolves: rhbz#2093207 +* Mon Jun 13 2022 Python Maint - 1:3.4.4-2 +- Rebuilt for Python 3.11 -* Thu Jun 02 2022 Vojtech Trefny - 3.4.0-10 -- Fix getting PV info in LVMPhysicalVolume from the cache - Resolves: rhbz#2079220 -- Do not crash when changing disklabel on disks with active devices - Resolves: rhbz#2078801 -- ActionDestroyDevice should not obsolete ActionRemoveMember - Resolves: rhbz#2076958 -- Correctly set vg_name after adding/removing a PV from a VG - Resolves: rhbz#2081276 -- Use LVM PV format current_size in LVMVolumeGroupDevice._remove - Related: rhbz#2081276 -- Add support for creating LVM cache pools - Resolves: rhbz#2055198 +* Mon May 16 2022 Vojtech Trefny - 3.4.4-1 +- Use LVM PV format current_size in LVMVolumeGroupDevice._remove (vtrefny) +- Correctly set vg_name after adding/removing a PV from a VG (vtrefny) +- Do not crash when changing disklabel on disks with active devices (vtrefny) +- ActionDestroyDevice should not obsolete ActionRemoveMember (vtrefny) +- Correctly set compression and deduplication for existing VDO pools (vtrefny) +- Correctly cancel configure actions in cancel() (vtrefny) +- Set partition flags after setting parted filesystem (#2033875) (vtrefny) -* Mon Jan 10 2022 Vojtech Trefny - 3.4.0-9 -- Translation update - Resolves: rhbz#2003050 +* Tue Feb 15 2022 Jan Pokorny - 3.4.3-2 +- Set partition flags after setting parted filesystem (#2033875) (vtrefny) -* Tue Dec 14 2021 ojtech Trefny - 3.4.0-8 -- Replace all log_exception_info calls with log.info - Resolves: rhbz#2028134 +* Tue Feb 01 2022 Vojtech Trefny - 3.4.3-1 +- Make sure we mount the top level subvolume when mounting btrfs (vtrefny) +- README: Fix API documentation link (vtrefny) +- iscsi: Replace all log_exception_info calls with log.info (vtrefny) -* Fri Nov 26 2021 Vojtech Trefny - 3.4.0-7 -- Release number bump - Related: rhbz#1988276 +* Fri Jan 21 2022 Fedora Release Engineering - 1:3.4.2-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild -* Fri Nov 26 2021 Vojtech Trefny - 3.4.0-6 -- Improve error message printed for missing dependecies - Resolves: rhbz#1988276 -- Use bigger chunk size for thinpools bigger than ~15.88 TiB - Resolves: rhbz#1949953 +* Thu Sep 30 2021 Vojtech Trefny - 3.4.2-1 +- pylint: Remove pdb breakpoint in device_properties_test (vtrefny) +- pylint: Fix exception string in get_cow_sysfs_path (vtrefny) +- pylint: Remove redundant 'u' prefixes for strings in doc/conf.py (vtrefny) +- pylint: Ignore the "redundant-u-string-prefix" warning in i18n.py (vtrefny) +- pylint: Ignore the new warning W1514 "unspecified-encoding" (vtrefny) +- pylint: Fix multuple unused variables 'e' in exceptions (vtrefny) +- Makefile: Specify weblate repository branch for the potfile target (vtrefny) +- flags: Fix leaking file descriptor (vtrefny) +- README: Add info about our openSUSE/Mageia/OpenMandriva Copr repo (vtrefny) +- Fix checking for LVM VDO support with libblockdev 2.23 and older (vtrefny) +- tasks: Allow specifying custom error message for UnavailableMethod (vtrefny) +- Use setuptools instead of distutils in setup.py (vtrefny) +- Use shutil.which instead of distutils.spawn.find_executable (vtrefny) +- Do not use FS.mount for btrfs temporary mounts (vtrefny) -* Wed Aug 4 2021 Vojtech Trefny - 3.4.0-5 -- Fix running upstream test suite in gating - Resolves: rhbz#1990232 +* Thu Aug 19 2021 Vojtech Trefny - 3.4.1-1 +- pylint: Ignore deprecation warning about threading.currentThread (vtrefny) +- Fix getting PV info in LVMPhysicalVolume from the cache (vtrefny) +- Fix ActionRemoveMember requires check (#1993655) (vtrefny) +- util: Ignore false positive assignment-from-no-return warning in ObjectID (vtrefny) +- tasks: Ignore pylint arguments-differ warning for do_tasks (vtrefny) +- Remove unused __save_passphrase member from LUKS_Data (vtrefny) +- size: Ignore new pylint warning "arguments-renamed" (vtrefny) +- Do not use deprecated (vtrefny) +- Remove unused member __names from DeviceFactory (vtrefny) +- Improve error message printed for missing dependecies (vtrefny) +- tests: Print version and blivet location when running tests (vtrefny) +- tests: Allow running tests without the tests directory in PYTHONPATH (vtrefny) +- edd_test: Locate the edd_data based on the test file location (vtrefny) +- Run Anaconda tests on blivet pull requests (jkonecny) +- Do not set chunk size for RAID 1 (vtrefny) +- When sorting devices make sure partitions are sorted correctly (vtrefny) +- Make sure LVM config is updated before running pvcreate (vtrefny) +- Tell LVM to ignore the new devices file for now (vtrefny) +- Revert "Use PARTITION_ESP flag for EFIFS partitions (#1930486)" (vtrefny) +- Fix resolving devices with names that look like BIOS drive number (vtrefny) +- Ignore pylint false positive no-member warning (vtrefny) +- Fix util.virt_detect on Xen (vtrefny) +- Fix/unify importing mock module in tests (vtrefny) +- Convert LVM filter lists to sets (vtrefny) +- Remove action device from LVM reject list (vtrefny) +- Fix activating old style LVM snapshots (vtrefny) +- Make sure the device is setup before configuring its format (vtrefny) +- Remove RHEL 9 specific patch from SPEC (vtrefny) +- Use package list instead of cycle in our dependencies Ansible playbook (vtrefny) +- Add vagrant file for running tests and development in a VM (vtrefny) +- Update our playbook for installing test dependencies (vtrefny) +- Add example for working with actions (vtrefny) +- Add LUKS encrypted LV to LVM example (vtrefny) +- Add example for LVM thin provisioning (vtrefny) +- Squashed 'translation-canary/' changes from 3bc2ad68..4d4e65b8 (vtrefny) -* Mon Aug 2 2021 Vojtech Trefny - 3.4.0-4 -- Do not set chunk size for RAID 1 - Resolves: rhbz#1987170 +* Fri Jul 23 2021 Fedora Release Engineering - 1:3.4.0-5 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild -* Wed Jul 21 2021 Vojtech Trefny - 3.4.0-3 -- Fix resolving devices with names that look like BIOS drive number - Resolves: rhbz#1983309 +* Wed Jul 21 2021 Vojtech Trefny - 3.4.0-4 +- Revert "Use PARTITION_ESP flag for EFIFS partitions" (#1975375) -* Wed Jul 7 2021 Vojtech Trefny - 3.4.0-2 -- Fix activating old style LVM snapshots - Resolves: rhbz#1961739 +* Wed Jun 30 2021 Vojtech Trefny - 3.4.0-3 +- Fix resolving devices with names that look like BIOS drive number (#1960798) -* Wed May 5 2021 Vojtech Trefny - 3.4.0-1 -- Rebase to latest upstream release 3.4.0 - Resolves: rhbz#1918357 +* Thu Jun 03 2021 Python Maint - 1:3.4.0-2 +- Rebuilt for Python 3.10 -* Tue Feb 9 2021 Vojtech Trefny - 3.2.2-9 -- LVM VDO support - Resolves: rhbz#1509337 +* Fri May 07 2021 Vojtech Trefny - 3.4.0-1 +- Fix setting SELinux flag in SELinuxContextTestCase (vtrefny) +- Allow running blivet without Python SELinux module (vtrefny) +- Adapt to dosfstools 4.2 FAT label changes (vtrefny) +- Add LVM VDO to public API (vtrefny) +- Add a special exception type for LVM inconsistent sector sizes (vtrefny) +- Remove the "encryption_passphrase" attribute from Blivet class (vtrefny) +- Use PARTITION_ESP flag for EFIFS partitions (#1930486) (vtrefny) +- Provide better error message for LVM with inconsistent sector sizes (vtrefny) +- Avoid AttributeError for DiskLabel formats without disklabel type (vtrefny) +- Ignore ArithmeticError when trying to align partition size down (vtrefny) +- Do not log entire exception when trying to get ISCSI initiator name (vtrefny) +- Fix running BlivetLVMVDODependenciesTest test case as non-root (vtrefny) +- Remove EDD test logs after the tests finish (vtrefny) +- Replace IOError with OSError around file operations (vslavik) +- spec: Add 'make' to BuildRequires (vtrefny) +- Fix usage of assert_called_with in lvm_test (vtrefny) +- apply directory's SELinux context to freshly created mount points (rmetrich) +- Try to get Btrfs volume UUID using libblockdev if UDev lookup fails (vtrefny) +- Allow removing LVM VDO devices without VDO support (vtrefny) +- Sync spec with downstream (vtrefny) +- Use real paths to Python site packages (vponcova) +- Fix excessive logging in udev.__is_ignored_blockdev (vtrefny) +- Make sure we use size >= LVM VDO min size in test_lv_unique_name (vtrefny) +- Replace pocketlint by a custom script (vtrefny) +- Fix pylint errors in translation canary (jkonecny) +- Bump required libblockdev version to 2.24 (vtrefny) +- Fix external dependencies for LVM VDO devices (vtrefny) +- Use better description for libblockdev plugins in tasks.availability (vtrefny) +- Set minimum size for LVM VDO pool devices (vtrefny) +- Add LVM VDO documentation (vtrefny) +- Add LVM VDO example (vtrefny) +- Add nodiscard option by default when creating VDO logical volumes (vtrefny) +- Allow adding nodiscard option when running mkfs (vtrefny) +- Add VM test for LVM VDO (vtrefny) +- Add LVM VDO device factory (vtrefny) +- Allow creating LVM VDO pools and volumes using "blivet.new_lv" (vtrefny) +- Add support for creating LVM VDO pools and LVM VDO volumes (vtrefny) +- Add "vdo_lv" property to LVMVDOPoolMixin (vtrefny) +- Read the LVM VDO pool current size from the internal data LV (vtrefny) +- Add availability functions for LVM VDO (vtrefny) +- Add VDO pool data LV to internal LVs during populate (vtrefny) +- Fix type of LVM VDO logical volumes (vtrefny) -* Mon Jan 11 2021 Vojtech Trefny - 3.2.2-8 -- Let parted fix fixable issues with partition table - Resolves: rhbz#1846869 -- Fix possible UnicodeDecodeError when reading sysfs attributes - Resolves: rhbz#1849326 +* Mon Apr 12 2021 Vojtech Trefny - 3.3.3-2 +- Avoid AttributeError for DiskLabel formats without disklabel type (#1945914) -* Wed Nov 18 2020 Vojtech Trefny - 3.2.2-7 -- Add support for XFS format grow - Resolves: rhbz#1862349 -- Do not limit swap to 128 GiB - Resolves: rhbz#1656485 -- Use UnusableConfigurationError for partially hidden multipath devices - Resolves: rhbz#1877052 -- Fix possible UnicodeDecodeError when reading model from sysfs - Resolves: rhbz#1849326 -- Add basic support for LVM VDO devices - Resolves: rhbz#1828745 +* Thu Feb 18 2021 Vojtech Trefny - 3.3.3-1 +- apply compression settings from blivet.flags.btrfs_compression (#1926892) (michel) -* Thu Aug 20 2020 Vojtech Trefny - 3.2.2-6 -- Fix name resolution for MD devices and partitions on them - Resolves: rhbz#1862904 -- Fix ignoring disk devices with parents or children - Resolves: rhbz#1866243 +* Wed Jan 27 2021 Fedora Release Engineering - 1:3.3.2-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild -* Thu Jul 16 2020 Vojtech Trefny - 3.2.2-5 +* Thu Jan 14 2021 Vojtech Trefny - 3.3.2-1 +- Fix "suggest_container_name" for Anaconda (vtrefny) +- Add test for util.get_sysfs_attr (vtrefny) +- Use util.get_sysfs_attr in __is_ignored_blockdev to read device mode (vtrefny) +- Fix possible UnicodeDecodeError when reading sysfs attributes (vtrefny) +- Update LUKS device name after parent partition name change (vtrefny) +- TFT is still broken so let's avoid failures by just doing a build (jkonecny) +- Fix logging information about ignoring hidden devices (vtrefny) +- Add __repr__ and __str__ methods to ParentList (vtrefny) +- Make sure LV name is unique when adding it in device factory (vtrefny) +- In name checks add name which is already in use to error message (vtrefny) +- Refactor suggest device/container name functions (vtrefny) +- Remove an unused attribute from the Blivet class (vponcova) +- Add PyPI build artifacts to .gitignore (vtrefny) +- Sync spec with downstream (vtrefny) + +* Wed Nov 11 2020 Vojtech Trefny - 3.3.1-2 +- Remove btrfs from requested libblockdev plugins on RHEL 9 + +* Tue Oct 20 2020 Vojtech Trefny - 3.3.1-1 +- Make sure the product name is safe when using it for device name (vtrefny) +- Run packit RPM builds on Fedora ELN (vtrefny) +- Allow specifying 'mode' for the sdist command (vtrefny) +- Enable packit RPM builds on pull requests (vtrefny) +- Start the iscsi-init service (#1880673) (vponcova) +- Let parted fix fixable issues with partition table (vtrefny) +- edd: Fix UnboundLocalError when trying to close fd in collect_mbrs (vtrefny) +- Use UnusableConfigurationError for partially hidden multipath devices (vtrefny) +- Close fd if it fails to read the device (nashok) +- Do not run udev.settle in StorageDevice._pre_teardown (vtrefny) +- Try to not use udev.resolve_devspec when querying MountsCache (vtrefny) +- Remove Zanata config file (vtrefny) +- Ignore new pylint warning W0707 "raise-missing-from" (vtrefny) +- Use SSH "link" for l10n repository in Makefile (vtrefny) +- Fix source tarball cleanup in srpm and rpm Makefile targets (vtrefny) + +* Wed Sep 16 2020 Vojtech Trefny - 3.3.0-2 +- Avoid using unnecessary udev.settle calls (#1876162) + +* Thu Aug 20 2020 Vojtech Trefny - 3.3.0-1 +- Account for pmspare grow when adjusting thinpool metadata size (vtrefny) +- Fix ignoring disk devices with parents or children (vtrefny) +- Terminology cleanup, part 3 (vtrefny) +- Terminology cleanups, part 2. (dlehman) +- Clean up some terminology. (dlehman) +- Add tests for udev.device_get_name for RAID devices (vtrefny) +- Fix name resolution for MD devices and partitions on them (vtrefny) +- Fix reading hidden sysfs attribute (vtrefny) +- Add support for specifying sector size for LUKS 2 devices (vtrefny) +- Do not ignore unknown/unsupported device mapper devices (vtrefny) +- Allow specifying custom hash function for LUKS 2 format (vtrefny) +- Ignore devices marked as hidden in sysfs (#1856974) (vtrefny) +- Add basic F2FS support (#1794950) (vtrefny) +- Make safe_device_name device type specific (vtrefny) +- Add exFAT to filesystems we recognize (vtrefny) +- Use xfs_db in read-only mode when getting XFS information (vtrefny) +- Add support for checking and fixing XFS using xfs_repair (vtrefny) +- Ignore zRAM devices in VMBackedTestCase (vtrefny) +- Add tests for XFS resize (vtrefny) +- Add support for XFS format grow (vtrefny) +- Typo fix (vtrefny) +- tests: Skip test_reset when running as non-root (vtrefny) +- tests: Patch LVM availability functions for some tests (vtrefny) +- tests: Patch LVM lvs call for some non-LVM tests (vtrefny) +- Do not propagate ped exception from add_partition (vtrefny) +- Do not use BlockDev.utils_have_kernel_module to check for modules (vtrefny) +- set allowed disk labels for s390x as standard ones (msdos + gpt) plus dasd (dan) +- Do not use FSAVAIL and FSUSE%% options when running lsblk (vtrefny) +- Rewrite README and add it as a long_description in setup.py (vtrefny) +- Round down to nearest MiB value when writing ks parittion info. (sbueno+anaconda) +- Add _teardown method to IntegrityDevice (vtrefny) +- Fix status for DM Integrity format (#1814005) (vtrefny) +- udev: Add function to get list of device's holders (vtrefny) +- Add basic support for LVM writecache devices (vtrefny) +- Add test for SwapSpace max size (vtrefny) +- Do not limit swap to 128 GiB (vtrefny) +- Fix possible UnicodeDecodeError when reading model from sysfs (vtrefny) +- Add install_requires and classifiers to setup.py (vtrefny) +- Import setuptools in setup.py to make bdist_wheel work (vtrefny) +- Set device.original_format to the new format in ActionCreateFormat (vtrefny) +- Fix resizable property for partitions (vtrefny) +- Update TODO. (dlehman) +- Ignore pycodestyle warning E741 (vtrefny) +- Skip test_mounting for filesystems that are not mountable (vtrefny) +- Sync specfile with downstream (japokorn) +- Make extended partitions resizable (vtrefny) +- Fix LV min size for resize in test_action_dependencies (vtrefny) +- Fix checking for filesystem support in action_test (vtrefny) +- Add basic support for LVM VDO devices (vtrefny) +- Update POT file in the Weblate repo during "make potfile" (vtrefny) +- Skip translation canary check if POT file is not available (vtrefny) +- Add blivet-weblate repository as a submodule (vtrefny) +- Remove Zanata from our build process (vtrefny) +- Remove po folder (vtrefny) +- More consistent lvm errors (API break) (japokorn) +- Added support for device tags (japokorn) + +* Wed Jul 29 2020 Vojtech Trefny - 3.2.2-4 - set allowed disk labels for s390x as standard ones (msdos + gpt) plus dasd - Resolves: rhbz#1855200 -- Do not use BlockDev.utils_have_kernel_module to check for modules - Resolves: rhbz#1855344 -* Thu Jul 09 2020 Vojtech Trefny - 3.2.2-4 -- Blivet RHEL 8.3 localization update - Resolves: rhbz#182056 -- Do not use FSAVAIL and FSUSE% options when running lsblk - Resolves: rhbz#1853624 +* Tue Jul 28 2020 Fedora Release Engineering - 1:3.2.2-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild -* Tue Jun 30 2020 Vojtech Trefny - 3.2.2-3 -- Round down to nearest MiB value when writing ks parittion info - Resolves: rhbz#1850670 +* Sat May 23 2020 Miro Hrončok - 1:3.2.2-2 +- Rebuilt for Python 3.9 -* Wed Jun 24 2020 Vojtech Trefny - 3.2.2-2 -- Add extra sleep after pvremove call - Resolves: rhbz#1640601 +* Thu May 21 2020 Jan Pokorny - 3.2.2-1 +- Allow setting size for non-existing LUKS devices (vtrefny) +- Fix toggling container encryption in devicefactory (#1827254) (vtrefny) +- Do no include destroyed devices in list of names (#1830515) (vtrefny) +- Fix changing LUKS version in devicefactory (#1834373) (vtrefny) +- Add "is_empty" property to StorageDevice (vtrefny) +- Mark warning "'GError' has no 'message' member" as false positive (vtrefny) +- Use the specified LUKS version for container encryption (vponcova) +- Log current storage state before reset using lsblk (vtrefny) +- Do not remove _netdev mount option specified manually by users (vtrefny) +- Fix renaming encrypted devices in the DeviceFactory (vtrefny) +- Fix typo in string formatter in EddEntry (vtrefny) -* Fri May 22 2020 Vojtech Trefny - 3.2.2-1 -- Rebase to the latest upstream release 3.2.2 - Resolves: rhbz#1714970 +* Tue Apr 21 2020 Vojtech Trefny - 3.2.1-2 +- Invalidate LVM caches in blivet device discovery loop (#1824418) -* Mon Mar 02 2020 Vojtech Trefny - 3.1.0-20 -- add `-y' to lvm.pvcreate - Resolves: rhbz#1768494 +* Mon Apr 06 2020 Vojtech Trefny - 3.2.1-1 +- Correctly recognize EFI format on an MD RAID device (#1695913) (vtrefny) +- Do not set empty name instead of invalid one in devicefactory (#1813710) (vtrefny) +- Fix crash for devices without ID_PATH udev property (#1814920) (vtrefny) +- Allow for reserved vg space and a growable thin pool. (#1783946) (dlehman) +- Fix name resolution for md member partitions. (#1798792) (dlehman) -* Wed Jan 29 2020 Vojtech Trefny - 3.1.0-19 -- Override LVM skip-activation to allow for thorough removal - Resolves: rhbz#1766498 -- Make sure LVs are writable before wiping - Related: rhbz#1766498 -- Fix udev test names so they actually get run. - Related: rhbz#1758102 -- Add recognition of Dell FW RAID to udev.device_is_disk. - Resolves: rhbz#1758102 -- Align base sizes up if smaller than min I/O size. - Resolves: rhbz#1781106 -- Make minimal and optimal alignment getters public. - Related: rhbz#1781106 +* Wed Mar 11 2020 Vojtech Trefny - 3.2.0-3 +- Fix name resolution for md member partitions. (#1798792) -* Tue Nov 19 2019 Vojtech Trefny - 3.1.0-18 -- Check for PV sector size when creating new VG - Resolves: rhbz#1754446 +* Thu Jan 30 2020 Fedora Release Engineering - 1:3.2.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild -* Wed Oct 02 2019 David Lehman - 3.1.0-17 -- Fix util.detect_virt function - Resolves: rhbz#1676935 +* Wed Jan 29 2020 Vojtech Trefny - 3.2.0-1 +- Align base sizes up if smaller than min I/O size. (dlehman) +- Make minimal and optimal alignment getters public. (dlehman) +- Add support for relabeling of the swap format (vtrefny) +- Define the 'relabels' method for all formats (vtrefny) +- Add support for LVMPV format resize (vtrefny) +- Add a new "id_path" attribute for iSCSI and FCoE disks (vtrefny) +- Do not load module when creating an FS instance (vtrefny) +- Add a simple script for running tests manually (vtrefny) +- Remove unused API code (jkonecny) +- devicetree.names is now a property (japokorn) +- initial PowerNV class support (dan) +- Use LUKS2 by default (vponcova) -* Mon Aug 05 2019 Vojtech Trefny - 3.1.0-16 -- Minor cleanups to reduce log noise - Related: rhbz#1579375 +* Wed Jan 29 2020 Vojtech Trefny - 3.1.7-1 +- Use SHA256 instead of MD5 for /proc/mounts hash calculation (vtrefny) +- Fix udev test names so they actually get run. (dlehman) +- Add recognition of Dell FW RAID to udev.device_is_disk. (dlehman) +- Fix Blivet DBus service version in service and config files (vtrefny) +- Make sure _chrooted_mountpoint attribute is defined before using it (vtrefny) +- Allow running 'write_label' in dry run mode on non-existing devices (vtrefny) +- Make 'makeupdates' and 'makebumpver' scripts Python 3 compatible (vtrefny) +- Do not hardcode coverage executable name (vtrefny) +- Make sure LVs are writable before wiping. (dlehman) +- Override LVM skip-activation to allow for thorough removal. (dlehman) +- Add setters for requested_size/percent form LVMVolumeGroupDevice (vtrefny) +- Set min size for XFS to 16 MiB (vtrefny) +- Revert "Ignore invalid-overridden-method warning for abstract properties" (vtrefny) +- Fix invalid-overridden-method in events_test (vtrefny) -* Mon Jul 15 2019 Vojtech Trefny - 3.1.0-15 -- Do not crash if 'dm.get_member_raid_sets' fails - Resolves: rhbz#1704289 +* Fri Oct 25 2019 Vojtech Trefny - 3.1.6-1 +- Do not allow creating VGs with PVs with different sector size (vtrefny) +- Add a new "sector_size" property to storage devices. (vtrefny) +- Ignore invalid-overridden-method warning for abstract properties (vtrefny) +- Change NFSMount._availability_errors to a property (vtrefny) +- Fix util.detect_virt function (vtrefny) +- Do not try to normalize size for zero size device factories (vtrefny) +- Always set default key size to 512 bits for ciphers with XTS mode (vtrefny) -* Tue Jul 02 2019 Vojtech Trefny - 3.1.0-14 -- Correctly handle non-unicode iSCSI initiator names - Resolves: rhbz#1632117 +* Thu Oct 03 2019 Miro Hrončok - 1:3.1.5-4 +- Rebuilt for Python 3.8.0rc1 (#1748018) -* Tue Jun 18 2019 Vojtech Trefny - 3.1.0-13 -- Fix reading LV attributes in LVMVolumeGroupDevice.status - Resolves: rhbz#1721381 +* Tue Aug 27 2019 Vojtech Trefny - 3.1.5-3 +- Do not try to normalize size for zero size device factories (#1743753) -* Fri Jun 14 2019 Vojtech Trefny - 3.1.0-12 -- Deactivate incomplete VGs along with everything else - Resolves: rhbz#1635125 -- Automatically adjust size of growable devices for new format - Resolves: rhbz#1680013 -- Add flag for protecting cdrom devices during populate - Resolves: rhbz#1719648 -- Clean up some errors evident in installer logs - Resolves: rhbz#1579375 -- Use dasd disklabel for vm disks backed by dasds - Resolves: rhbz#1676935 +* Fri Aug 16 2019 Miro Hrončok - 1:3.1.5-2 +- Rebuilt for Python 3.8 -* Thu May 16 2019 Vojtech Trefny - 3.1.0-11 -- Various test fixes for RHEL 8 - Related: rhbz#1682561 -- Add upstream test suite to the SRPM - Related: rhbz#1682561 +* Thu Aug 15 2019 Vojtech Trefny - 3.1.5-1 +- Move dependencies code from StorageDevice to Device (vtrefny) +- Always use luks_data.min_entropy as a default minimum entropy (vponcova) +- Add 'protected' property setter to LVMVolumeGroupDevice (#1729363) (vtrefny) +- fix of LV max size calculation (japokorn) +- Added min size for partitions (japokorn) +- Improved non-unique UUID handling (japokorn) +- Check if disklabel supports partition names (#1723228) (vtrefny) +- format_device: Revert destroy action if create fails (#1727589) (vtrefny) +- Do not allow resizing of LUKS devices with integrity (vtrefny) +- Return underlying block device as 'slave' for LUKS with integrity (vtrefny) +- Fix removing LUKS devices with integrity (vtrefny) +- Check status before activating dmraid set in populate. (#1723979) (dlehman) +- Use DBus call to see if we're in a vm. (dlehman) +- Use dasd disklabel for vm disks backed by dasds. (dlehman) +- Add a function to detect if running in a vm. (dlehman) +- Remove teardown_all from the populate method (vponcova) +- Correctly handle non-unicode iSCSI initiator names (vtrefny) +- Add, test and use a new method to get size with reserve (vpodzime) +- Beware non-positive sizes in thpool metadata size calculations (vpodzime) +- Log sizes in MiB in thpool auto metadata size calculations (vpodzime) +- Recalculate thpool's metadata size on resize in LVMThinPFactory (vpodzime) +- Move the thpool reserve calculations to LVMFactory (vpodzime) -* Wed Apr 03 2019 David Lehman - 3.1.0-10 -- Ensure correct type of mpath cache member list. - Related: rhbz#1672971 +* Fri Jul 26 2019 Fedora Release Engineering - 1:3.1.4-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild -* Mon Feb 25 2019 David Lehman - 3.1.0-9 -- Update to latest translations. - Resolves: rhbz#1608337 -- Require libfc instead of fcoe for offloaded FCoE. - Resolves: rhbz#1575953 -- Use udev to determine if disk is a multipath member. - Related: rhbz#1575953 -- Don't crash if blockdev mpath plugin isn't available. - Resolves: rhbz#1672971 +* Thu Jul 11 2019 Vojtech Trefny - 3.1.4-2 +- Remove teardown_all from the populate method (vponcova) +- initial PowerNV class support (dan) -* Tue Jan 15 2019 Vojtech Trefny - 3.1.0-8 +* Tue Jun 11 2019 Vojtech Trefny - 3.1.4-1 +- Don't call fnmatch with None (#1698937) (vponcova) +- Do not crash on non-int lun argument when creating iscsi disk object. (rvykydal) +- Make iscsi device attribute modifications backward compatible. (rvykydal) +- Do not store iscsi module nodeinfo in device object. (rvykydal) +- Only call mpath plugin when it is available. (#1697378) (dlehman) +- Include tests archive where appropriate in make targets. (dlehman) +- Add spec file logic to include unit tests in SRPM. (dlehman) +- Add a target to create an archive of the unit tests. (dlehman) +- Remove profanity from an old comment. (dlehman) +- Fix mounting of the filesystem iso9660 (vponcova) +- Remove unnecessary pass statements (vtrefny) +- Check for format tools availability in action_test (vtrefny) +- Skip weak dependencies test if we don't have all libblockdev plugins (vtrefny) +- Properly clean after availability test case (vtrefny) +- Ensure correct type of mpath cache member list. (dlehman) +- Do not crash if 'dm.get_member_raid_sets' fails (#1684851) (vtrefny) +- Fix supported disklabels in 'test_platform_label_types' on EFI (vtrefny) +- Support legacy MBR (msdos) as part of UEFI to enable hybrid builds (pbrobinson) +- Automatically adjust size of growable devices for new format (vtrefny) +- spec: Remove obsolete Group tag and bump min libblockdev version (vtrefny) + +* Thu Mar 21 2019 Vojtech Trefny - 3.1.3-3 +- Ensure correct type of mpath cache member list + +* Mon Mar 11 2019 Vojtech Trefny - 3.1.3-2 +- Support legacy MBR (msdos) as part of UEFI to enable hybrid builds (pbrobinson) + +* Wed Feb 27 2019 Vojtech Trefny - 3.1.3-1 +- Don't crash if blockdev mpath plugin isn't available. (#1672971) (dlehman) +- iscsi: Add default value to unused 'storage' argument in 'write' (vtrefny) +- Add exported property to LVMVolumeGroupDevice (vtrefny) +- Add VG data to static_data (vtrefny) +- Do not try to get format free space for non-existing formats (vtrefny) +- Do not raise exception if can't get PV free space (vtrefny) +- Fix undefined attribute in LVM info cache (vtrefny) +- Use raw_device to get thinpool device in LVMThinPFactory (#1490174) (vtrefny) +- Do not crash if DM RAID activation fails (#1661712) (vtrefny) +- Remove the unused sysroot property (vponcova) +- Remove unused attributes from the Blivet class (vponcova) +- Remove the unused gpt flag (vponcova) - Copy the iSCSI initiator name file to the installed system (vtrefny) - Resolves: rhbz#1664587 +- Use udev to determine if disk is a multipath member. (dlehman) +- Require libfc instead of fcoe for offloaded FCoE. (#1575953) (dlehman) -* Mon Dec 17 2018 Vojtech Trefny - 3.1.0-7 -- Wipe all stale metadata after creating md array (dlehman) - Resolves: rhbz#1639682 +* Sat Feb 02 2019 Fedora Release Engineering - 1:3.1.2-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild -* Tue Oct 16 2018 David Lehman - 3.1.0-6 -- Fix options for ISCSI functions (vtrefny) - Resolves: rhbz#1635569 +* Wed Dec 12 2018 Vojtech Trefny - 3.1.2-1 +- Fix reading LV attributes in LVMVolumeGroupDevice.status (vtrefny) +- Do not try to login to iBFTs with active session (vtrefny) +- Fix xfs sync of chrooted mountpoint. (dlehman) +- Only update sysfs path in ctor for active devices. (dlehman) +- Fix new pep8/pycodestyle warnings (vtrefny) +- Ignore PEP8 W504 warning ("line break after binary operator") (vtrefny) +- pylint: Allow loading all C extensions (vtrefny) +- Use 'pycodestyle' instead of 'pep8' (vtrefny) +- Fix failing populator test without nvdimm plugin (vtrefny) +- Add 'srpm' and 'rpm' targets to Makefile for building (S)RPMs (vtrefny) +- Fix crash on reset on systems without nvdimm plugin (vtrefny) +- Use the size info of internal LVs when getting space usage for existing LVs (v.podzimek) +- Calculate the number of RAID PVs from the origin for cached LVs (v.podzimek) +- Make raid_level a property of an LV object (v.podzimek) +- Add a test for DeviceTree.get_related_disks. (dlehman) +- Fix ixgbe/bnx2fc fcoe disk detection (#1651506) (rvykydal) +- Use RAID name for partitions on an MD array (vtrefny) +- Move btrfs name validation to devicelibs (vtrefny) +- Don't try to set selinux context for nodev or vfat file systems. (dlehman) +- Only try to set selinux context for lost+found on ext file systems. (dlehman) +- Wipe all stale metadata after creating md array. (#1639682) (dlehman) +- Don't try to update sysfs path for non-block devices. (#1579375) (dlehman) +- Don't raise errors without messages (vponcova) +- Install ndctl when NVDIMMs are used. (dlehman) +- Deactivate incomplete VGs along with everything else. (dlehman) +- Work around udev timing issues. (dlehman) +- Fix options for ISCSI functions (#1632656) (vtrefny) +- Use format.status when checking for PV status (vtrefny) +- Remove Anaconda flags (vponcova) +- Remove square brackets when matching internal LVs (v.podzimek) -* Thu Sep 27 2018 Vojtech Trefny - 3.1.0-5 +* Mon Oct 08 2018 Vojtech Trefny - 3.1.1-2 +- Fix options for ISCSI functions (#1632656) (vtrefny) + +* Wed Sep 26 2018 Vojtech Trefny - 3.1.1-1 +- Check device dependencies only for device actions (vtrefny) +- Allow removing btrfs volumes without btrfs support (vtrefny) +- Adjust LVMPhysicalVolumeMethodsTestCase to new pvcreate option (vtrefny) +- add `-y' to lvm.pvcreate (hongxu.jia) +- Drop omap partition table tests on ARM platforms (pbrobinson) +- Update disk label tests for ARM platforms (pbrobinson) +- Ignore pylint 'no-value-for-parameter' warning (vtrefny) +- arm: add support for EFI on ARMv7 (pbrobinson) +- Aarch64 platforms: Fix gpt defaults for 64 bit arm platforms (pbrobinson) +- arch: arm: drop get_arm_machine function (pbrobinson) +- arch: arm: drop omap specifics for partitioning (pbrobinson) +- Create a separate availability check for dmraid support (vtrefny) + +* Thu Aug 30 2018 Vojtech Trefny - 3.1.0-2 - arm: add support for EFI on ARMv7 (probinson) - Related: rhbz#1623882 - Aarch64 platforms: Fix gpt defaults for 64 bit arm platforms (probinson) - Resolves: rhbz#1623882 - arch: arm: drop get_arm_machine function (probinson) - Related: rhbz#1623882 - arch: arm: drop omap specifics for partitioning (probinson) - Related: rhbz#1623882 -* Thu Sep 20 2018 Tomas Orsava - 3.1.0-4 -- Require the Python interpreter directly instead of using the package name -- Related: rhbz#1619153 - -* Wed Sep 19 2018 Vojtech Trefny - 3.1.0-3 -- Check device dependencies only for device actions - Related: rhbz#1605213 -- Allow removing btrfs volumes without btrfs support - Resolves: rhbz#1605213 - -* Tue Aug 21 2018 Vojtech Trefny - 3.1.0-2 -- Create a separate availability check for dmraid support - Resolves: rhbz#1617958 - -* Fri Aug 10 2018 David Lehman - 3.1.0-1 +* Mon Aug 13 2018 Vojtech Trefny - 3.1.0-1 - Allow configuring default LUKS2 PBKDF arguments using luks_data (vtrefny) - Related: rhbz#1561352 - Fix the populate_kickstart method in LUKS (vtrefny) - Related: rhbz#1561352 - Allow specifying extra arguments for PBKDF when creating LUKS2 (vtrefny) - Related: rhbz#1561352 - Add support for LUKS2 to DeviceFactory (vtrefny) - Resolves: rhbz#1561352 - DeviceFactory: use min_luks_entropy from kwargs (vtrefny) - Related: rhbz#1561352 - Fix passing 'min_luks_entropy' when creating LUKS format (vtrefny) - Related: rhbz#1561352 - Use passphrase/key file when resizing LUKS2 format (vtrefny) - Related: rhbz#1561352 - Require libblockdev 2.17 (vtrefny) - Related: rhbz#1561352 - Add support for LUKS2 format (vtrefny) - Related: rhbz#1561352 - Add initial support for DM Integrity "format" (vtrefny) - Related: rhbz#1561352 - Do not try to add LUKSDevice in LUKSFormatPopulator (vtrefny) - Related: rhbz#1561352 - Add support for dm-integrity devices (vtrefny) - Related: rhbz#1561352 - Fixed various issues preventing successful build (japokorn) - Related: rhbz#1561352 + +* Thu Aug 2 2018 Peter Robinson 3.1.0-0.5.b2 +- Bump release to fix upgrade path * Mon Jul 30 2018 David Lehman - 3.1.0-0.1.b2 - Do not ignore "Image out-of-sync" internal LVs (vtrefny) @@ -534,12 +1058,15 @@ Backport iSCSI initiator name related fixes: - Adapt mock imports for compatibility w/ python2 & python3. (dlehman) - Use py2-compatible syntax to get system architecture. (dlehman) -* Mon Jul 16 2018 Vojtech Trefny - 3.1.0-0.3.b1 -- Remove btrfs from requested libblockdev plugins (vtrefny) - -* Wed Jul 11 2018 Vojtech Trefny - 3.1.0-0.2.b1 +* Tue Jul 17 2018 Vojtech Trefny - 3.1.0-0.4.b1 - Force command line based libblockdev LVM plugin (vtrefny) +* Fri Jul 13 2018 Fedora Release Engineering - 1:3.1.0-0.3.b1 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild + +* Fri Jun 15 2018 Miro Hrončok - 1:3.1.0-0.2.b1 +- Rebuilt for Python 3.7 + * Wed May 02 2018 David Lehman - 3.1.0-0.1.b1 - Add 'nvdimm' tag for NVDIMM namespaces (vtrefny) - Add test for NVDIMMNamespaceDevicePopulator (vtrefny) diff --git a/sources b/sources new file mode 100644 index 0000000..f5e8f03 --- /dev/null +++ b/sources @@ -0,0 +1,2 @@ +SHA512 (blivet-3.10.0-tests.tar.gz) = 53d2f37ff9822141caf669889835069da6e3f728761c0d006afcf80a2628f8816cbf558d30a085082e1bfec2e4b575f9ea78859a17f4e0bf7458e3faba158ef7 +SHA512 (blivet-3.10.0.tar.gz) = 74172dec98a1b4f71cee6d64d46cdafa5116cfbbaddfdaed3dd118fef019dce54ff9d9206faada5991efac6b61bc558bb3050165f1d68bde1c1ec228c01916c8