From 2b67581c30a2046dcc83d01b4f856b5075599c0c Mon Sep 17 00:00:00 2001 From: David Lehman Date: Tue, 12 Mar 2013 14:29:35 -0500 Subject: [PATCH 3/5] Move mdadm superblock size calculation into devicelibs.mdraid. --- blivet/devicelibs/mdraid.py | 26 +++++++++++++++++++++++++- blivet/devices.py | 26 ++------------------------ 2 files changed, 27 insertions(+), 25 deletions(-) diff --git a/blivet/devicelibs/mdraid.py b/blivet/devicelibs/mdraid.py index fee83f1..1fc5d46 100644 --- a/blivet/devicelibs/mdraid.py +++ b/blivet/devicelibs/mdraid.py @@ -134,6 +134,30 @@ def get_raid_max_spares(raidlevel, nummembers): raise MDRaidError("invalid raid level %d" % raidlevel) +def get_raid_superblock_size(size, version=None): + """ mdadm has different amounts of space reserved for its use depending + on the metadata type and size of the array. + + 0.9 use 2.0 MB + 1.0 use 2.0 MB + 1.1 or 1.2 use the formula lifted from mdadm/super1.c to calculate it + based on the array size. + """ + # mdadm 3.2.4 made a major change in the amount of space used for 1.1 and 1.2 + # in order to reserve space for reshaping. See commit 508a7f16 in the + # upstream mdadm repository. + headroom = MD_SUPERBLOCK_SIZE + if version is None or version in ["default", "1.1", "1.2"]: + # MDADM: We try to leave 0.1% at the start for reshape + # MDADM: operations, but limit this to 128Meg (0.1% of 10Gig) + # MDADM: which is plenty for efficient reshapes + # NOTE: In the mdadm code this is in 512b sectors. Converted to use MB + headroom = 128 + while headroom << 10 > size: + headroom >>= 1 + log.info("Using %sMB superBlockSize" % (headroom)) + return headroom + def get_member_space(size, disks, level=None): space = 0 # size of *each* member device @@ -164,7 +188,7 @@ def get_member_space(size, disks, level=None): # capacity space = size / (disks / 2.0) - space += MD_SUPERBLOCK_SIZE + space += get_raid_superblock_size(size) return space * disks diff --git a/blivet/devices.py b/blivet/devices.py index f091378..afce027 100644 --- a/blivet/devices.py +++ b/blivet/devices.py @@ -2734,30 +2734,8 @@ class MDRaidArrayDevice(StorageDevice): @property def superBlockSize(self): - """ mdadm has different amounts of space reserved for its use depending - on the metadata type and size of the array. - - 0.9 use 2.0 MB - 1.0 use 2.0 MB - 1.1 or 1.2 use the formula lifted from mdadm/super1.c to calculate it - based on the array size. - """ - # mdadm 3.2.4 made a major change in the amount of space used for 1.1 and 1.2 - # in order to reserve space for reshaping. See commit 508a7f16 in the - # upstream mdadm repository. - if self.metadataVersion not in ["default", "1.1", "1.2"]: - headroom = 2.0 - else: - array_size = self.rawArraySize - # MDADM: We try to leave 0.1% at the start for reshape - # MDADM: operations, but limit this to 128Meg (0.1% of 10Gig) - # MDADM: which is plenty for efficient reshapes - # NOTE: In the mdadm code this is in 512b sectors. Converted to use MB - headroom = 128 - while headroom << 10 > array_size: - headroom >>= 1 - log.info("Using %sMB superBlockSize" % (headroom)) - return headroom + return mdraid.get_raid_superblock_size(self.rawArraySize, + version=self.metadataVersion) @property def smallestMember(self): -- 1.8.1.4