[blivet:master 14/16] Refine BTRFSVolumeDevice._removeParent() method.
mulhern
amulhern at redhat.com
Tue May 6 16:42:39 UTC 2014
Now that LinearRAID("single") is a RAID level it is possible to eliminate
special cases. Should be semantics preserving as LinearRAID.min_members is
0.
Signed-off-by: mulhern <amulhern at redhat.com>
---
blivet/devices.py | 26 ++++++++++----------------
1 file changed, 10 insertions(+), 16 deletions(-)
diff --git a/blivet/devices.py b/blivet/devices.py
index 8a2d838..89548b2 100644
--- a/blivet/devices.py
+++ b/blivet/devices.py
@@ -4618,22 +4618,16 @@ class BTRFSVolumeDevice(BTRFSDevice, ContainerDevice):
return size
def _removeParent(self, member):
- # btrfs won't let you degrade it
- limits = []
- levels = btrfs.RAID_levels
- if self.dataLevel and self.dataLevel != "single":
- limits.append(levels.raidLevel(self.dataLevel).min_members)
-
- if self.metaDataLevel and self.metaDataLevel != "single":
- limits.append(levels.raidLevel(self.metaDataLevel).min_members)
-
- if limits:
- min_members = min(limits)
-
- if limits and len(self.parents) - 1 < min_members:
- raise errors.DeviceError("cannot remove member due to raid level "
- "constraints")
-
+ """ Raises a DeviceError if the device has a raid level and the
+ resulting number of parents would be fewer than the minimum
+ number required by the raid level.
+ """
+ levels = [btrfs.RAID_levels.raidLevel(l) for l in [self.dataLevel, self.metaDataLevel] if l]
+ if levels:
+ min_level = min((l for l in levels), key=lambda l: l.min_members)
+ min_members = min_level.min_members
+ if len(self.parents) - 1 < min_members:
+ raise errors.DeviceError("device %s requires at least %d membersfor raid level %s" % (self.name, min_members, min_level))
super(BTRFSVolumeDevice, self)._removeParent(member)
def _addSubVolume(self, vol):
--
1.8.3.1
More information about the anaconda-patches
mailing list