summaryrefslogtreecommitdiff
path: root/super-intel.c
diff options
context:
space:
mode:
authorDan Williams <dan.j.williams@intel.com>2011-08-25 19:14:24 -0700
committerNeilBrown <neilb@suse.de>2011-08-30 10:49:42 +1000
commitb276dd33c74a51598e37fc72e6fb8f5ebd6620f2 (patch)
tree2bd4b442e3124e84a38e2937ac9e73bbefa855cb /super-intel.c
parentd8924477b7fc513a54249b1b0c617adbfb78c7fe (diff)
imsm: fix reserved sectors for spares
Different OROMs reserve different amounts of space for the migration area. When activating a spare minimize the reserved space otherwise a valid spare can be prevented from joining an array with a migration area smaller than IMSM_RESERVED_SECTORS. This may result in an array that cannot be reshaped, but that is less surprising than not being able to rebuild a degraded array. imsm_reserved_sectors() already reports the minimal value which adds to the confusion when trying rebuild an array because mdadm -E indicates that the device has enough space. Cc: Anna Czarnowska <anna.czarnowska@intel.com> Signed-off-by: Dan Williams <dan.j.williams@intel.com> Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'super-intel.c')
-rw-r--r--super-intel.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/super-intel.c b/super-intel.c
index 03471837..193e0d04 100644
--- a/super-intel.c
+++ b/super-intel.c
@@ -833,7 +833,16 @@ static struct extent *get_extents(struct intel_super *super, struct dl *dl)
struct extent *rv, *e;
int i;
int memberships = count_memberships(dl, super);
- __u32 reservation = MPB_SECTOR_CNT + IMSM_RESERVED_SECTORS;
+ __u32 reservation;
+
+ /* trim the reserved area for spares, so they can join any array
+ * regardless of whether the OROM has assigned sectors from the
+ * IMSM_RESERVED_SECTORS region
+ */
+ if (dl->index == -1)
+ reservation = MPB_SECTOR_CNT;
+ else
+ reservation = MPB_SECTOR_CNT + IMSM_RESERVED_SECTORS;
rv = malloc(sizeof(struct extent) * (memberships + 1));
if (!rv)