md/raid1: allow fix_read_error to read from recovering device.
authormajianpeng <majianpeng@gmail.com>
Tue, 22 May 2012 03:55:03 +0000 (13:55 +1000)
committerNeilBrown <neilb@suse.de>
Tue, 22 May 2012 03:55:03 +0000 (13:55 +1000)
When attempting to fix a read error, it is acceptable to read from a
device that is recovering, provided the recovery has got past the
place we are reading from.  This makes the test for "can we read from
here" the same as the test in read_balance.

Signed-off-by: majianpeng <majianpeng@gmail.com>
Signed-off-by: NeilBrown <neilb@suse.de>
drivers/md/raid1.c

index 71a7dc038a82316525609fa285e5416f324d43b5..22cfc6660b188ffa6b2099783560e193b9d5f0f8 100644 (file)
@@ -1859,7 +1859,9 @@ static void fix_read_error(struct r1conf *conf, int read_disk,
 
                        rdev = conf->mirrors[d].rdev;
                        if (rdev &&
-                           test_bit(In_sync, &rdev->flags) &&
+                           (test_bit(In_sync, &rdev->flags) ||
+                            (!test_bit(Faulty, &rdev->flags) &&
+                             rdev->recovery_offset >= sect + s)) &&
                            is_badblock(rdev, sect, s,
                                        &first_bad, &bad_sectors) == 0 &&
                            sync_page_io(rdev, sect, s<<9,