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:
parent
d8924477b7
commit
b276dd33c7
|
@ -833,7 +833,16 @@ static struct extent *get_extents(struct intel_super *super, struct dl *dl)
|
||||||
struct extent *rv, *e;
|
struct extent *rv, *e;
|
||||||
int i;
|
int i;
|
||||||
int memberships = count_memberships(dl, super);
|
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));
|
rv = malloc(sizeof(struct extent) * (memberships + 1));
|
||||||
if (!rv)
|
if (!rv)
|
||||||
|
|
Loading…
Reference in New Issue