Commit 9f2d2899 authored by NeilBrown's avatar NeilBrown Committed by Greg Kroah-Hartman

md/raid1: restore ability for check and repair to fix read errors.

commit 1877db75 upstream.

commit 30bc9b53
    md/raid1: fix bio handling problems in process_checks()

Move the bio_reset() to a point before where BIO_UPTODATE is checked,
so that check now always report that the bio is uptodate, even if it is not.

This causes process_check() to sometimes treat read-errors as
successful matches so the good data isn't written out.

This patch preserves the flag until it is needed.

Bug was introduced in 3.11, but backported to 3.10-stable (as it fixed
an even worse bug).  So suitable for any -stable since 3.10.
Reported-and-tested-by: default avatarMichael Tokarev <mjt@tls.msk.ru>
Fixed: 30bc9b53Signed-off-by: default avatarNeilBrown <neilb@suse.de>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent dbd51587
...@@ -1854,11 +1854,15 @@ static int process_checks(struct r1bio *r1_bio) ...@@ -1854,11 +1854,15 @@ static int process_checks(struct r1bio *r1_bio)
for (i = 0; i < conf->raid_disks * 2; i++) { for (i = 0; i < conf->raid_disks * 2; i++) {
int j; int j;
int size; int size;
int uptodate;
struct bio *b = r1_bio->bios[i]; struct bio *b = r1_bio->bios[i];
if (b->bi_end_io != end_sync_read) if (b->bi_end_io != end_sync_read)
continue; continue;
/* fixup the bio for reuse */ /* fixup the bio for reuse, but preserve BIO_UPTODATE */
uptodate = test_bit(BIO_UPTODATE, &b->bi_flags);
bio_reset(b); bio_reset(b);
if (!uptodate)
clear_bit(BIO_UPTODATE, &b->bi_flags);
b->bi_vcnt = vcnt; b->bi_vcnt = vcnt;
b->bi_size = r1_bio->sectors << 9; b->bi_size = r1_bio->sectors << 9;
b->bi_sector = r1_bio->sector + b->bi_sector = r1_bio->sector +
...@@ -1891,11 +1895,14 @@ static int process_checks(struct r1bio *r1_bio) ...@@ -1891,11 +1895,14 @@ static int process_checks(struct r1bio *r1_bio)
int j; int j;
struct bio *pbio = r1_bio->bios[primary]; struct bio *pbio = r1_bio->bios[primary];
struct bio *sbio = r1_bio->bios[i]; struct bio *sbio = r1_bio->bios[i];
int uptodate = test_bit(BIO_UPTODATE, &sbio->bi_flags);
if (sbio->bi_end_io != end_sync_read) if (sbio->bi_end_io != end_sync_read)
continue; continue;
/* Now we can 'fixup' the BIO_UPTODATE flag */
set_bit(BIO_UPTODATE, &sbio->bi_flags);
if (test_bit(BIO_UPTODATE, &sbio->bi_flags)) { if (uptodate) {
for (j = vcnt; j-- ; ) { for (j = vcnt; j-- ; ) {
struct page *p, *s; struct page *p, *s;
p = pbio->bi_io_vec[j].bv_page; p = pbio->bi_io_vec[j].bv_page;
...@@ -1910,7 +1917,7 @@ static int process_checks(struct r1bio *r1_bio) ...@@ -1910,7 +1917,7 @@ static int process_checks(struct r1bio *r1_bio)
if (j >= 0) if (j >= 0)
atomic64_add(r1_bio->sectors, &mddev->resync_mismatches); atomic64_add(r1_bio->sectors, &mddev->resync_mismatches);
if (j < 0 || (test_bit(MD_RECOVERY_CHECK, &mddev->recovery) if (j < 0 || (test_bit(MD_RECOVERY_CHECK, &mddev->recovery)
&& test_bit(BIO_UPTODATE, &sbio->bi_flags))) { && uptodate)) {
/* No need to write to this device. */ /* No need to write to this device. */
sbio->bi_end_io = NULL; sbio->bi_end_io = NULL;
rdev_dec_pending(conf->mirrors[i].rdev, mddev); rdev_dec_pending(conf->mirrors[i].rdev, mddev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment