md/raid10: Allow skipping recovery when clean arrays are assembled
authorMartin Wilck <mwilck@arcor.de>
Wed, 24 Apr 2013 01:42:42 +0000 (11:42 +1000)
committerNeilBrown <neilb@suse.de>
Wed, 24 Apr 2013 01:42:42 +0000 (11:42 +1000)
When an array is assembled incrementally with mdadm -I -R
and the array switches to "active" mode, md starts a recovery.

If the array was clean, the "fullsync" flag will be 0. Skip
the full recovery in this case, as RAID1 does (the code was
actually copied from the sync_request() method of RAID1).

Signed-off-by: Martin Wilck <mwilck@arcor.de>
Signed-off-by: NeilBrown <neilb@suse.de>
drivers/md/raid10.c

index 77b562d18a90c4d27d9a5c43e82518e174ed84c7..2372926dc559a0e3b77b96bec99d743041a8160b 100644 (file)
@@ -2913,6 +2913,22 @@ static sector_t sync_request(struct mddev *mddev, sector_t sector_nr,
                if (init_resync(conf))
                        return 0;
 
+       /*
+        * Allow skipping a full rebuild for incremental assembly
+        * of a clean array, like RAID1 does.
+        */
+       if (mddev->bitmap == NULL &&
+           mddev->recovery_cp == MaxSector &&
+           !test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery) &&
+           conf->fullsync == 0) {
+               *skipped = 1;
+               max_sector = mddev->dev_sectors;
+               if (test_bit(MD_RECOVERY_SYNC, &mddev->recovery) ||
+                   test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery))
+                       max_sector = mddev->resync_max_sectors;
+               return max_sector - sector_nr;
+       }
+
  skipped:
        max_sector = mddev->dev_sectors;
        if (test_bit(MD_RECOVERY_SYNC, &mddev->recovery) ||