Re: [PATCH 1/2] imsm: FIX: Do not allow for spare disk activation during reshape
flat view
From: NeilBrown <hidden>
Date: 2011-10-02 23:31:16
On Thu, 29 Sep 2011 17:45:36 +0200 Adam Kwolek [off-list ref] wrote:
Spare disk activation or starting repair for one array while on second reshape is in progress, will lead to IMSM incompatible situation when 2 arrays in container shares different disks sets. This can cause that 2 processes in container /reshape and rebuild/ are in progress in parallel. This is IMSM incompatible situation also. Block spare disk activation and starting resync if any reshape in container is in progress. Signed-off-by: Adam Kwolek <redacted>
Thanks - applied. (though I changed the while loop into a for loop... I couldn't help myself ;-) NeilBrown
quoted hunk ↗ jump to hunk
--- super-intel.c | 33 +++++++++++++++++++++++++++++---- 1 files changed, 29 insertions(+), 4 deletions(-)diff --git a/super-intel.c b/super-intel.c index 07d47b5..5504c17 100644 --- a/super-intel.c +++ b/super-intel.c@@ -2237,6 +2237,33 @@ static int write_imsm_migr_rec(struct supertype *st) } #endif /* MDASSEMBLE */ +/* spare/missing disks activations are not allowe when + * array/container performs reshape operation, because + * all arrays in container works on the same disks set + */ +int imsm_reshape_blocks_arrays_changes(struct intel_super *super) +{ + int rv = 0; + struct intel_dev *i_dev = super->devlist; + struct imsm_dev *dev; + + /* check whole container + */ + while (i_dev) { + dev = i_dev->dev; + if (dev->vol.migr_state && + dev->vol.migr_type == MIGR_GEN_MIGR) { + /* No repair during any migration in container + */ + rv = 1; + break; + } + i_dev = i_dev->next; + } + + return rv; +} + static void getinfo_super_imsm_volume(struct supertype *st, struct mdinfo *info, char *dmap) { struct intel_super *super = st->sb;@@ -6592,10 +6619,8 @@ static struct mdinfo *imsm_activate_spare(struct active_array *a, dprintf("imsm: activate spare: inst=%d failed=%d (%d) level=%d\n", inst, failed, a->info.array.raid_disks, a->info.array.level); - if (dev->vol.migr_state && - dev->vol.migr_type == MIGR_GEN_MIGR) - /* No repair during migration */ - return NULL; + if (imsm_reshape_blocks_arrays_changes(super)) + return NULL; if (a->info.array.level == 4) /* No repair for takeovered array
Attachments
- signature.asc [application/pgp-signature] 190 bytes