[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[PATCH 3/3] Ensure proper disklabel type on boot disk if CLEARPART_TYPE_ALL. (#570483, #530225)



If the user specified "clearpart --all" or chose "Use All Space",
make sure that the boot disk gets initialized with a disklabel
whose type is appropriate for the platform's bootloader.
---
 storage/partitioning.py |   39 +++++++++++++++++++++++++++++++++++++++
 1 files changed, 39 insertions(+), 0 deletions(-)

diff --git a/storage/partitioning.py b/storage/partitioning.py
index 719e21f..20d7694 100644
--- a/storage/partitioning.py
+++ b/storage/partitioning.py
@@ -373,6 +373,45 @@ def clearPartitions(storage):
     # now remove any empty extended partitions
     removeEmptyExtendedPartitions(storage)
 
+    _platform = storage.anaconda.platform
+
+    # make sure that the the boot device has the correct disklabel type if
+    # we're going to completely clear it.
+    for disk in storage.partitioned:
+        if not storage.anaconda.bootloader.drivelist:
+            break
+
+        if disk.name != storage.anaconda.bootloader.drivelist[0]:
+            continue
+
+        if storage.clearPartType != CLEARPART_TYPE_ALL or \
+           (storage.clearPartDisks and disk.name not in storage.clearPartDisks):
+            continue
+
+        # don't reinitialize the disklabel if the disk contains install media
+        if filter(lambda p: p.dependsOn(disk), storage.protectedDevices):
+            continue
+
+        nativeLabelType = _platform.diskLabelType(disk.partedDevice.type)
+        if disk.format.labelType == nativeLabelType:
+            continue
+
+        if part.disk.format.labelType == "mac":
+            # remove the magic apple partition
+            for part in storage.partitions:
+                if part.disk == disk:
+                    log.debug("clearing %s" % part.name)
+                    # We can't schedule the apple map partition for removal
+                    # because parted will not allow us to remove it from the
+                    # disk. Still, we need it out of the devicetree.
+                    storage.devicetree._removeDevice(part, moddisk=False)
+
+        destroy_action = ActionDestroyFormat(disk)
+        newLabel = getFormat("disklabel", device=disk.path)
+        create_action = ActionCreateFormat(disk, format=newLabel)
+        storage.devicetree.registerAction(destroy_action)
+        storage.devicetree.registerAction(create_action)
+
 def removeEmptyExtendedPartitions(storage):
     for disk in storage.partitioned:
         log.debug("checking whether disk %s has an empty extended" % disk.name)
-- 
1.6.6


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]