Thread (5 messages) 5 messages, 3 authors, 2013-08-05

RE: [PATCH] imsm: fix checking completion of RAID10 resync

From: Dorau, Lukasz <hidden>
Date: 2013-08-01 08:46:58

On Wednesday, July 31, 2013 1:23 AM NeilBrown [off-list ref] wrote:
On Tue, 30 Jul 2013 15:59:25 +0200 Pawel Baldysiak
[off-list ref] wrote:
quoted
If one creates RAID10 with IMSM metadata the is_resync_complete
function returns '1' just when initial resync reaches 50%

IMSM version of the is_resync_complete function has been added
that handles the case of IMSM RAID10 correctly.


Signed-off-by: Pawel Baldysiak <redacted>
---
 super-intel.c |   20 ++++++++++++++++++--
 1 file changed, 18 insertions(+), 2 deletions(-)
diff --git a/super-intel.c b/super-intel.c
index 4df33f4..0371713 100644
--- a/super-intel.c
+++ b/super-intel.c
@@ -1021,6 +1021,22 @@ static int is_failed(struct imsm_disk *disk)
 	return (disk->status & FAILED_DISK) == FAILED_DISK;
 }

+/* IMSM version of is_resync_complete helper routine
+ * to determine resync completion
+ * since MaxSector is a moving target
+ */
+static int imsm_is_resync_complete(struct mdinfo *array)
+{
+	if (array->array.level != 10) {
+		if (array->resync_start >= array->component_size)
+			return 1;
+	} else {
+		if (array->resync_start >= 2*array->component_size)
+			return 1;
+	}
+	return 0;
+}
+
 /* try to determine how much space is reserved for metadata from
  * the last get_extents() entry on the smallest active disk,
  * otherwise fallback to the default
@@ -7119,12 +7135,12 @@ static int imsm_set_array_state(struct
active_array *a, int consistent)
quoted
 		handle_missing(super, dev);

 	if (consistent == 2 &&
-	    (!is_resync_complete(&a->info) ||
+	    (!imsm_is_resync_complete(&a->info) ||
 	     map_state != IMSM_T_STATE_NORMAL ||
 	     dev->vol.migr_state))
 		consistent = 0;

-	if (is_resync_complete(&a->info)) {
+	if (imsm_is_resync_complete(&a->info)) {
 		/* complete intialization / resync,
 		 * recovery and interrupted recovery is completed in
 		 * ->set_disk

Thanks.
However the bug is not specific to intel, so should be fixed in common code.
And "2*" is not really very general.

The following patch should fix it properly.  If you can confirm that it fixes
the problem for you I would appreciate it.
Hi

Since Pawel is out of office I am responding instead of him.
Your patch does not work for IMSM now, because ncopies is equal 0 and mdmon crashes after dividing by zero - see details below:
quoted hunk ↗ jump to hunk
Thanks,
NeilBrown

From 71d68ff62f945254240575cd836f5f2a09ced5d2 Mon Sep 17 00:00:00 2001
From: NeilBrown <redacted>
Date: Wed, 31 Jul 2013 09:18:57 +1000
Subject: [PATCH] Fix is_resync_complete for RAID10

For RAID10, 'sync' numbers go up to the array size rather than the
component size.  is_resync_complete() needs to allow for this.

Reported-by: Pawel Baldysiak <redacted>
Signed-off-by: NeilBrown <redacted>
diff --git a/mdmon.h b/mdmon.h
index 60fda38..5a8e120 100644
--- a/mdmon.h
+++ b/mdmon.h
@@ -91,7 +91,21 @@ extern int monitor_loop_cnt;
  */
 static inline int is_resync_complete(struct mdinfo *array)
 {
-	if (array->resync_start >= array->component_size)
-		return 1;
-	return 0;
+	unsigned long long sync_size = 0;
+	int ncopies, l;
+	switch(array->array.level) {
+	case 1:
+	case 4:
+	case 5:
+	case 6:
+		sync_size = array->component_size;
+		break;
+	case 10:
+		l = array->array.layout;
+		ncopies = (l & 0xff) * ((l >> 8) && 0xff);
+		sync_size = array->component_size * array->array.raid_disks;
At this point of code the following variables equal
(I have created RAID10 volume of size z=10G):

array->array.layout = 0 
ncopies = 0 
array->component_size = 20971520 
array->array.raid_disks = 4 
sync_size = 83886080
array->resync_start = 0

I will check why array->array.layout is equal 0.

Regards,
Lukasz
+		sync_size /= ncopies;
+		break;
+	}
+	return array->resync_start >= sync_size;
 }
  
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help