[PATCH 3/3] Treat existing md arrays whose members are all disks like disks.

David Lehman dlehman at redhat.com
Fri Jun 26 21:59:56 UTC 2015


Similarly, if all members of an existing array are partitionable
the array is also partitionable.

Resolves: rhbz#1197582
---
 blivet/devices/md.py | 30 ++++++++++++++++++++++++++++--
 1 file changed, 28 insertions(+), 2 deletions(-)

diff --git a/blivet/devices/md.py b/blivet/devices/md.py
index 096975a..2a3df0d 100644
--- a/blivet/devices/md.py
+++ b/blivet/devices/md.py
@@ -72,6 +72,19 @@ class MDRaidArrayDevice(ContainerDevice):
             :type metadataVersion: str (eg: "0.90")
             :keyword minor: the device minor (obsolete?)
             :type minor: int
+
+            .. note::
+
+                An instance of this class whose :attr:`exists` attribute is
+                True and whose parent/member devices are all partitionable is
+                also considered to be partitionable.
+
+            .. note::
+
+                An instance of this class whose :attr:`exists` attribute is
+                True and whose parent/member devices are all disks is also
+                treated like a disk.
+
         """
         # pylint: disable=unused-argument
 
@@ -337,6 +350,13 @@ class MDRaidArrayDevice(ContainerDevice):
             self._totalDevices += 1
             self.memberDevices += 1
 
+        # The new member hasn't been added yet, so account for it explicitly.
+        is_disk = self.isDisk and member.isDisk
+        for p in self.parents:
+            p.format._hidden = is_disk
+
+        member.format._hidden = is_disk
+
     def _removeParent(self, member):
         """ If this is a raid array that is not actually redundant and it
             appears to have formatting and therefore probably data on it,
@@ -478,6 +498,10 @@ class MDRaidArrayDevice(ContainerDevice):
         if self.type == "mdcontainer" or self.type == "mdbiosraidarray":
             return
 
+        if self.isDisk:
+            # treat arrays whose members are disks as partitionable disks
+            return
+
         # We don't really care what the array's state is. If the device
         # file exists, we want to deactivate it. mdraid has too many
         # states.
@@ -567,11 +591,13 @@ class MDRaidArrayDevice(ContainerDevice):
 
     @property
     def partitionable(self):
-        return self.type == "mdbiosraidarray"
+        return (self.type == "mdbiosraidarray" or
+                (self.exists and all(p.partitionable for p in self.parents)))
 
     @property
     def isDisk(self):
-        return self.type == "mdbiosraidarray"
+        return (self.type == "mdbiosraidarray" or
+                (self.exists and all(p.isDisk for p in self.parents)))
 
     def dracutSetupArgs(self):
         return set(["rd.md.uuid=%s" % self.mdadmFormatUUID])
-- 
2.4.3



More information about the anaconda-patches mailing list