[PATCH 1/2] imsm: FIX: Do not allow for spare disk activation during reshape

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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 <adam.kwolek@xxxxxxxxx>
---

 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

--
To unsubscribe from this list: send the line "unsubscribe linux-raid" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux RAID Wiki]     [ATA RAID]     [Linux SCSI Target Infrastructure]     [Linux Block]     [Linux IDE]     [Linux SCSI]     [Linux Hams]     [Device Mapper]     [Device Mapper Cryptographics]     [Kernel]     [Linux Admin]     [Linux Net]     [GFS]     [RPM]     [git]     [Yosemite Forum]


  Powered by Linux