[PATCH 2/6] Fix container member set management for md arrays. (#889101)

David Lehman dlehman at redhat.com
Fri Dec 21 19:57:47 UTC 2012


---
 pyanaconda/storage/__init__.py |   30 +++++++++++++++++++++++-------
 pyanaconda/storage/devices.py  |   16 ++++++++++++++++
 2 files changed, 39 insertions(+), 7 deletions(-)

diff --git a/pyanaconda/storage/__init__.py b/pyanaconda/storage/__init__.py
index 6bebf6c..883d773 100644
--- a/pyanaconda/storage/__init__.py
+++ b/pyanaconda/storage/__init__.py
@@ -1861,6 +1861,9 @@ class Storage(object):
 
         if container:
             members = container.parents[:]
+        elif members:
+            # mdarray
+            container = device
 
         # The basis for whether we are modifying a member set versus creating
         # one must be the member list, as container will be None when modifying
@@ -1892,12 +1895,15 @@ class Storage(object):
         for member in members[:]:
             if any([d in remove_disks for d in member.disks]):
                 if isinstance(member, LUKSDevice):
-                    container.removeMember(member)
+                    if container:
+                        container.removeMember(member)
                     self.destroyDevice(member)
                     members.remove(member)
                     member = member.slave
                 else:
-                    container.removeMember(member)
+                    if container:
+                        container.removeMember(member)
+
                     members.remove(member)
 
                 self.destroyDevice(member)
@@ -1906,19 +1912,24 @@ class Storage(object):
             if isinstance(member, LUKSDevice):
                 if not factory.encrypted:
                     # encryption was toggled for the member devices
-                    container.removeMember(member)
+                    if container:
+                        container.removeMember(member)
+
                     self.destroyDevice(member)
                     members.remove(member)
 
                     self.formatDevice(member.slave,
                                       getFormat(factory.member_format))
                     members.append(member.slave)
-                    container.addMember(member.slave)
+                    if container:
+                        container.addMember(member.slave)
 
                 member = member.slave
             elif factory.encrypted:
                 # encryption was toggled for the member devices
-                container.removeMember(member)
+                if container:
+                    container.removeMember(member)
+
                 members.remove(member)
                 self.formatDevice(member, getFormat("luks"))
                 luks_member = LUKSDevice("luks-%s" % member.name,
@@ -1926,7 +1937,8 @@ class Storage(object):
                                     format=getFormat(factory.member_format))
                 self.createDevice(luks_member)
                 members.append(luks_member)
-                container.addMember(luks_member)
+                if container:
+                    container.addMember(luks_member)
 
             member.req_base_size = base_size
             member.req_size = member.req_base_size
@@ -2148,7 +2160,7 @@ class Storage(object):
 
         members = []
         if device and device.type == "mdarray":
-            members = device.parents
+            members = device.parents[:]
 
         try:
             parents = self.setContainerMembers(container, factory,
@@ -3502,6 +3514,10 @@ class MDFactory(DeviceFactory):
         return get_member_space(self.size, len(self.disks),
                                 level=self.raid_level)
 
+    def container_size_func(self, container, device=None):
+        return get_member_space(self.size, len(container.parents),
+                                level=self.raid_level)
+
     def new_device(self, *args, **kwargs):
         kwargs["level"] = self.raid_level
         kwargs["totalDevices"] = len(kwargs.get("parents"))
diff --git a/pyanaconda/storage/devices.py b/pyanaconda/storage/devices.py
index f4aabcd..9f796ff 100644
--- a/pyanaconda/storage/devices.py
+++ b/pyanaconda/storage/devices.py
@@ -2974,6 +2974,22 @@ class MDRaidArrayDevice(StorageDevice):
         self.devices.remove(device)
         device.removeChild()
 
+    def addMember(self, member):
+        if member in self.parents:
+            raise ValueError("member is already part of this array")
+
+        # for the time being we will not allow adding members to existing arrays
+        if self.exists:
+            raise DeviceError("cannot add member to existing array", self.name)
+
+        self.parents.append(member)
+        member.addChild()
+        self.memberDevices += 1
+
+    def removeMember(self, member):
+        self._removeDevice(member)
+        self.memberDevices -= 1
+
     @property
     def status(self):
         """ This device's status.
-- 
1.7.7.6



More information about the anaconda-patches mailing list