md/RAID1: Add missing case for attempting to repair known bad blocks.
authorAlexander Lyakas <alex.bolshoy@gmail.com>
Tue, 17 Jul 2012 10:17:55 +0000 (13:17 +0300)
committerNeilBrown <neilb@suse.de>
Tue, 31 Jul 2012 02:01:29 +0000 (12:01 +1000)
When doing resync or repair, attempt to correct bad blocks, according
to WriteErrorSeen policy

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

index d2361b162de59b316fe8fba4d1a2d3808dc416a6..197f62681db562bd38d643a115be92940c46b9a6 100644 (file)
@@ -2445,6 +2445,18 @@ static sector_t sync_request(struct mddev *mddev, sector_t sector_nr, int *skipp
                                bio->bi_rw = READ;
                                bio->bi_end_io = end_sync_read;
                                read_targets++;
+                       } else if (!test_bit(WriteErrorSeen, &rdev->flags) &&
+                               test_bit(MD_RECOVERY_SYNC, &mddev->recovery) &&
+                               !test_bit(MD_RECOVERY_CHECK, &mddev->recovery)) {
+                               /*
+                                * The device is suitable for reading (InSync),
+                                * but has bad block(s) here. Let's try to correct them,
+                                * if we are doing resync or repair. Otherwise, leave
+                                * this device alone for this sync request.
+                                */
+                               bio->bi_rw = WRITE;
+                               bio->bi_end_io = end_sync_write;
+                               write_targets++;
                        }
                }
                if (bio->bi_end_io) {