md/raid10: Don't try to recovery unmatched (and unused) chunks.
authorNeilBrown <neilb@suse.de>
Tue, 3 Jul 2012 00:37:30 +0000 (10:37 +1000)
committerNeilBrown <neilb@suse.de>
Tue, 3 Jul 2012 00:37:30 +0000 (10:37 +1000)
If a RAID10 has an odd number of chunks - as might happen when there
are an odd number of devices - the last chunk has no pair and so is
not mirrored.  We don't store data there, but when recovering the last
device in an array we retry to recover that last chunk from a
non-existent location.  This results in an error, and the recovery
aborts.

When we get to that last chunk we should just stop - there is nothing
more to do anyway.

This bug has been present since the introduction of RAID10, so the
patch is appropriate for any -stable kernel.

Cc: stable@vger.kernel.org
Reported-by: Christian Balzer <chibi@gol.com>
Tested-by: Christian Balzer <chibi@gol.com>
Signed-off-by: NeilBrown <neilb@suse.de>
drivers/md/raid10.c

index 99ae6068e456992ef2b16c98e01d5c2ee0362128..bcf6ea8acc9fbc0ef1d71e2354d1b01d714e2703 100644 (file)
@@ -2890,6 +2890,12 @@ static sector_t sync_request(struct mddev *mddev, sector_t sector_nr,
                        /* want to reconstruct this device */
                        rb2 = r10_bio;
                        sect = raid10_find_virt(conf, sector_nr, i);
+                       if (sect >= mddev->resync_max_sectors) {
+                               /* last stripe is not complete - don't
+                                * try to recover this sector.
+                                */
+                               continue;
+                       }
                        /* Unless we are doing a full sync, or a replacement
                         * we only need to recover the block if it is set in
                         * the bitmap