[PATCH 03/21] Add a function to estimate required disk space for an md array.

David Lehman dlehman at redhat.com
Thu Aug 9 19:28:22 UTC 2012


---
 pyanaconda/storage/devicelibs/mdraid.py |   46 +++++++++++++++++++++++++++++++
 1 files changed, 46 insertions(+), 0 deletions(-)

diff --git a/pyanaconda/storage/devicelibs/mdraid.py b/pyanaconda/storage/devicelibs/mdraid.py
index e383bdf..4ebc81c 100644
--- a/pyanaconda/storage/devicelibs/mdraid.py
+++ b/pyanaconda/storage/devicelibs/mdraid.py
@@ -124,6 +124,52 @@ def get_raid_max_spares(raidlevel, nummembers):
 
     raise ValueError, "invalid raid level %d" % raidlevel
 
+def get_member_space(size, disks, level=None):
+    space = 0   # size of *each* member device
+
+    # we should find a way to query mdadm for these
+    super_block_size = 2    # MB
+    chunk_size = 512.0 / 1024.0
+
+    if isinstance(level, str):
+        level = raidLevel(level)
+
+    min_members = get_raid_min_members(level)
+    if disks < min_members:
+        raise ValueError("raid%d requires at least %d disks"
+                         % (level, min_members))
+
+    if level == RAID0:
+        # you need the sum of the member sizes to equal your desired capacity
+        space = size / disks
+        space += chunk - (space  % chunk)
+        space += super_block_size
+    elif level == RAID1:
+        # you need each member's size to equal your desired capacity
+        space = size
+        space += chunk - (space % chunk)
+        space += super_block_size
+    elif level in (RAID4, RAID5):
+        # you need the sum of all but one members' sizes to equal your desired
+        # capacity
+        space = size / (disks - 1)
+        space += chunk - (space  % chunk)
+        space += super_block_size
+    elif level == RAID6:
+        # you need the sum of all but two members' sizes to equal your desired
+        # capacity
+        space = size / (disks - 2)
+        space += chunk - (space  % chunk)
+        space += super_block_size
+    elif level == RAID10:
+        # you need the sum of the member sizes to equal twice your desired
+        # capacity
+        space = size / (disks / 2.0)
+        space += chunk - (space  % chunk)
+        space += super_block_size
+
+    return space * disks
+
 def mdadm(args):
     ret = iutil.execWithRedirect("mdadm", args,
                                  stdout = "/dev/tty5",
-- 
1.7.7.6



More information about the anaconda-patches mailing list