summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Lehman <dlehman@redhat.com>2012-12-20 15:06:48 -0600
committerDavid Lehman <dlehman@redhat.com>2012-12-21 15:20:03 -0600
commitb271e90b1b4cccaa41fa4c8d3db84786aa88c4e8 (patch)
tree3b0c5ac8b163768fa933e742f4aeaccfacbd92e9
parent1a213271c05c2a15c8ec03c25af86dad21c99f86 (diff)
downloadanaconda-b271e90b1b4cccaa41fa4c8d3db84786aa88c4e8.tar.gz
anaconda-b271e90b1b4cccaa41fa4c8d3db84786aa88c4e8.tar.xz
anaconda-b271e90b1b4cccaa41fa4c8d3db84786aa88c4e8.zip
Fix container member set management for md arrays. (#889101)
-rw-r--r--pyanaconda/storage/__init__.py30
-rw-r--r--pyanaconda/storage/devices.py16
2 files changed, 39 insertions, 7 deletions
diff --git a/pyanaconda/storage/__init__.py b/pyanaconda/storage/__init__.py
index 8c7319c87..6999918c1 100644
--- a/pyanaconda/storage/__init__.py
+++ b/pyanaconda/storage/__init__.py
@@ -1871,6 +1871,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
@@ -1902,12 +1905,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)
@@ -1916,19 +1922,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,
@@ -1936,7 +1947,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
@@ -2158,7 +2170,7 @@ class Storage(object):
members = []
if device and device.type == "mdarray":
- members = device.parents
+ members = device.parents[:]
try:
parents = self.setContainerMembers(container, factory,
@@ -3512,6 +3524,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 e9fb54a02..407eb102e 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.