]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Fix is_resync_complete for RAID10
authorNeilBrown <neilb@suse.de>
Tue, 30 Jul 2013 23:18:57 +0000 (09:18 +1000)
committerNeilBrown <neilb@suse.de>
Tue, 30 Jul 2013 23:22:18 +0000 (09:22 +1000)
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 <pawel.baldysiak@intel.com>
Signed-off-by: NeilBrown <neilb@suse.de>
mdmon.h

diff --git a/mdmon.h b/mdmon.h
index 60fda38d9ee8dbbc78eb3699a135609ed943a325..5a8e1209822c3ff2ca3fe5ab95796ff085973766 100644 (file)
--- 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;
+               sync_size /= ncopies;
+               break;
+       }
+       return array->resync_start >= sync_size;
 }