[PATCH 2/2] Update partitions' numbers and names when adding new partition (#1166598)
Anne Mulhern
amulhern at redhat.com
Mon Dec 1 13:29:14 UTC 2014
----- Original Message -----
> From: "Vratislav Podzimek" <vpodzime at redhat.com>
> To: anaconda-patches at lists.fedorahosted.org
> Sent: Wednesday, November 26, 2014 8:37:32 AM
> Subject: [PATCH 2/2] Update partitions' numbers and names when adding new partition (#1166598)
>
> Adding a new partition may change partitions' order (e.g. adding sda1 after
> sda2) so we need to handle that correctly.
>
> Signed-off-by: Vratislav Podzimek <vpodzime at redhat.com>
> ---
> blivet/devicetree.py | 9 +++++++++
> blivet/formats/disklabel.py | 26 ++++++++++++++++++++++++--
> python-blivet.spec | 2 +-
> 3 files changed, 34 insertions(+), 3 deletions(-)
>
> diff --git a/blivet/devicetree.py b/blivet/devicetree.py
> index f6cf600..98b1251 100644
> --- a/blivet/devicetree.py
> +++ b/blivet/devicetree.py
> @@ -26,6 +26,7 @@ import re
> import shutil
> import pprint
> import copy
> +import itertools
>
> from .errors import CryptoError, DeviceError, DeviceTreeError,
> DiskLabelCommitError, DMError, FSError, InvalidDiskLabelError, LUKSError,
> MDRaidError, StorageError
> from .devices import BTRFSDevice, BTRFSSubVolumeDevice, BTRFSVolumeDevice,
> BTRFSSnapShotDevice
> @@ -402,6 +403,14 @@ class DeviceTree(object):
> newdev.addHook(new=new)
> self._devices.append(newdev)
>
> + # adding a partition may change partedPartition's paths which are
> used
> + # to construct names which thus should be updated
> + if isinstance(newdev, PartitionDevice):
> + sibling_parts_lists = [self.getChildren(parent) for parent in
> newdev.parents]
Any reason not to make the above lazy, instead of a list?
> + sibling_parts = itertools.chain(*sibling_parts_lists)
> + for part in sibling_parts:
> + part.updateName()
> +
> # don't include "req%d" partition names
> if ((newdev.type != "partition" or
> not newdev.name.startswith("req")) and
> diff --git a/blivet/formats/disklabel.py b/blivet/formats/disklabel.py
> index c69aa04..590b58c 100644
> --- a/blivet/formats/disklabel.py
> +++ b/blivet/formats/disklabel.py
> @@ -311,8 +311,30 @@ class DiskLabel(DeviceFormat):
> geometry=geometry)
>
> constraint = parted.Constraint(exactGeom=geometry)
> - self.partedDisk.addPartition(partition=new_partition,
> - constraint=constraint)
> +
> + # adding a partition the start of which is before some already added
> + # partition requires change of partitions' order because parted just
> + # increments the number while partitions are added
> + if any(part.geometry.start > start for part in
> self.partedDisk.partitions):
> + parts = self.partedDisk.partitions[:]
> +
> + # first remove all partitions
> + for part in parts:
> + self.partedDisk.removePartition(part)
> +
> + # then add them back sorted together with the new one
> + parts.append(new_partition)
> + parts.sort(key=lambda p: p.geometry.start)
> + for part in parts:
> + # reset the partition's number so that it gets a new one
> when
> + # added to partedDisk
> + part.resetNumber()
It feels like it would be better to handle this number resetting within pyparted,
probably in Disk.addPartition().
> + constr = parted.Constraint(exactGeom=part.geometry)
> + self.partedDisk.addPartition(partition=part,
> + constraint=constr)
> + else:
> + self.partedDisk.addPartition(partition=new_partition,
> +
overall, the above code would be simpler if partitions were always kept sorted
by start, and this method could rely on that holding true.
constraint=constraint)
>
> def removePartition(self, partition):
> """ Remove a partition from the disklabel.
> diff --git a/python-blivet.spec b/python-blivet.spec
> index 3a81c4a..08f5887 100644
> --- a/python-blivet.spec
> +++ b/python-blivet.spec
> @@ -14,7 +14,7 @@ Source0:
> http://github.com/dwlehman/blivet/archive/%{realname}-%{version}.tar.gz
> %define dmver 1.02.17-6
> %define pykickstartver 1.99.22
> %define partedver 1.8.1
> -%define pypartedver 2.5-2
> +%define pypartedver 3.10.2
> %define pythonpyblockver 0.45
> %define e2fsver 1.41.0
> %define pythoncryptsetupver 0.1.1
> --
> 1.9.3
>
> _______________________________________________
> anaconda-patches mailing list
> anaconda-patches at lists.fedorahosted.org
> https://lists.fedorahosted.org/mailman/listinfo/anaconda-patches
>
- mulhern
More information about the anaconda-patches
mailing list