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>
This commit is contained in:
Dan Williams 2011-08-25 19:14:24 -07:00 committed by NeilBrown
parent d8924477b7
commit b276dd33c7
1 changed files with 10 additions and 1 deletions

View File

@ -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)