[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