We use 2 in memory copies of the partition table (2 PartedDisk instances), one which we manipulate while auto / manual partitioning, and one copy on which we reply the changes done by the auto / manual partitioning step by step (committing each step to the disk) as we process our actions. For pre-existing partitions the PartitionDevice's partedPartition member would point to the manipulated table's partitions, even though we had already switched over and where actually executing actions. This causes issues (segfaults!) with the flag clearing in ActionDestroyFormat.execute(), as this was now calling unsetFlag on a partition which is no longer part of a disk (as it was removed by clearParts). This patch fixes this by making PartitionDevice's partedPartition property switch over to the partitions in the new PartedDisk after we've switched over to it. p.s. For some reason in my case, the segfault kept getting caught be some handler and retriggered, so I had to scp in strace to find out it was segfaulting, this showed up as the installer hanging after "executing action: Destroy Format None on .... (partition)" So this patch might fix some bug reports with these symptoms --- storage/devices.py | 13 +++++++++++-- storage/formats/disklabel.py | 3 +-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/storage/devices.py b/storage/devices.py index de55547..d11fce5 100644 --- a/storage/devices.py +++ b/storage/devices.py @@ -970,6 +970,16 @@ class PartitionDevice(StorageDevice): self.partType & parted.PARTITION_PROTECTED) def _getPartedPartition(self): + if not self.exists: + return self._partedPartition + + partitionDisk = self._partedPartition.disk.getPedDisk() + disklabelDisk = self.disk.format.partedDisk.getPedDisk() + if partitionDisk is not disklabelDisk: + # The disklabel's parted disk has been reset, reget our partition + log.debug("regetting partedPartition for %s because of PartedDisk reset" % self.path) + self._partedPartition = self.disk.format.partedDisk.getPartitionByPath(self.path) + return self._partedPartition def _setPartedPartition(self, partition): @@ -1175,8 +1185,7 @@ class PartitionDevice(StorageDevice): raise DeviceError("Cannot destroy non-leaf device", self.path) self.setupParents() - partition = self.disk.format.partedDisk.getPartitionByPath(self.path) - self.disk.format.removePartition(partition) + self.disk.format.removePartition(self.partedPartition) self.disk.format.commit() self.exists = False diff --git a/storage/formats/disklabel.py b/storage/formats/disklabel.py index 08e2461..e4122fb 100644 --- a/storage/formats/disklabel.py +++ b/storage/formats/disklabel.py @@ -233,8 +233,7 @@ class DiskLabel(DeviceFormat): constraint=constraint) def removePartition(self, partition): - rempart = self.partedDisk.getPartitionByPath(partition.path) - self.partedDisk.removePartition(rempart) + self.partedDisk.removePartition(partition) @property def extendedPartition(self): -- 1.6.4 _______________________________________________ Anaconda-devel-list mailing list Anaconda-devel-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/anaconda-devel-list