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

[PATCH 07/13] Add a "boot drive" concept to the bootloader since stage1 types vary.



---
 pyanaconda/bootloader.py           |   21 ++++++++++++++++++++-
 pyanaconda/iw/cleardisks_gui.py    |    3 ++-
 pyanaconda/storage/partitioning.py |    6 +++---
 3 files changed, 25 insertions(+), 5 deletions(-)

diff --git a/pyanaconda/bootloader.py b/pyanaconda/bootloader.py
index dcb022b..791b1fc 100644
--- a/pyanaconda/bootloader.py
+++ b/pyanaconda/bootloader.py
@@ -263,6 +263,9 @@ class BootLoader(object):
         # the device the bootloader will be installed on
         self._stage1_device = None
 
+        # the "boot drive", meaning the drive we prefer stage1 be on
+        self.stage1_drive = None
+
         self._update_only = False
 
     #
@@ -283,6 +286,7 @@ class BootLoader(object):
 
         log.debug("new bootloader stage1 device: %s" % device.name)
         self._stage1_device = device
+        self.stage1_drive = device.disks[0]
 
     @property
     def stage2_device(self):
@@ -332,6 +336,10 @@ class BootLoader(object):
         # XXX requiring partitioned may break clearpart
         drives = [d for d in self.storage.disks if d.partitioned]
         self._drives = self._sort_drives(drives)
+
+        # set "boot drive"
+        self.stage1_drive = self._drives[0]
+
         return self._drives
 
     #
@@ -503,7 +511,18 @@ class BootLoader(object):
         for slot in slots:
             devices.extend(slot)
 
-        return self._sort_drives(devices)
+        devices = self._sort_drives(devices)
+
+        # if a boot drive has been chosen put it, and devices on it, first
+        # XXX should this be done in _sort_drives instead?
+        if self.stage1_drive:
+            boot_devs = [d for d in devices if self.stage1_drive in d.disks]
+            if len(boot_devs) != len(devices):
+                for dev in reversed(boot_devs):
+                    idx = devices.index(dev)
+                    devices.insert(0, devices.pop(idx))
+
+        return devices
 
     #
     # boot/stage2 device access
diff --git a/pyanaconda/iw/cleardisks_gui.py b/pyanaconda/iw/cleardisks_gui.py
index cd685e8..36453a4 100644
--- a/pyanaconda/iw/cleardisks_gui.py
+++ b/pyanaconda/iw/cleardisks_gui.py
@@ -62,7 +62,7 @@ class ClearDisksWindow (InstallWindow):
         cleardisks.sort(self.anaconda.storage.compareDisks)
 
         self.anaconda.storage.config.clearPartDisks = cleardisks
-        self.anaconda.bootloader.stage1_device = bootDisk
+        self.anaconda.bootloader.stage1_drive = bootDisk
 
     def getScreen (self, anaconda):
         # We can't just use exclusiveDisks here because of kickstart.  First,
@@ -76,6 +76,7 @@ class ClearDisksWindow (InstallWindow):
         # Skip this screen as well if there's only one disk to use.
         if len(disks) == 1:
             anaconda.storage.config.clearPartDisks = [disks[0].name]
+            anaconda.bootloader.stage1_drive = disks[0]
             return None
 
         (xml, self.vbox) = gui.getGladeWidget("cleardisks.glade", "vbox")
diff --git a/pyanaconda/storage/partitioning.py b/pyanaconda/storage/partitioning.py
index 30aee90..9aa3c0b 100644
--- a/pyanaconda/storage/partitioning.py
+++ b/pyanaconda/storage/partitioning.py
@@ -410,10 +410,10 @@ def clearPartitions(storage, bootloader=None):
     # 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 bootloader or not bootloader.stage1_device:
+        if not bootloader or not bootloader.stage1_drive:
             break
 
-        if disk in bootloader.stage1_device.disks:
+        if disk != bootloader.stage1_drive:
             continue
 
         if storage.config.clearPartType != CLEARPART_TYPE_ALL or \
@@ -961,7 +961,7 @@ def allocatePartitions(storage, disks, partitions, freespace, bootloader=None):
         req_disks.sort(key=lambda d: d.name, cmp=storage.compareDisks)
         boot_index = None
         for disk in req_disks:
-            if bootloader and disk == bootloader.stage1_device.disks[0]:
+            if bootloader and disk == bootloader.stage1_drive:
                 boot_index = req_disks.index(disk)
 
         if boot_index is not None and len(req_disks) > 1:
-- 
1.7.3.4


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