diff options
| -rw-r--r-- | drivers/md/raid1.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index fd3a2a14b587..4a6ca1cb2e78 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c | |||
| @@ -1953,11 +1953,15 @@ static int process_checks(struct r1bio *r1_bio) | |||
| 1953 | for (i = 0; i < conf->raid_disks * 2; i++) { | 1953 | for (i = 0; i < conf->raid_disks * 2; i++) { |
| 1954 | int j; | 1954 | int j; |
| 1955 | int size; | 1955 | int size; |
| 1956 | int uptodate; | ||
| 1956 | struct bio *b = r1_bio->bios[i]; | 1957 | struct bio *b = r1_bio->bios[i]; |
| 1957 | if (b->bi_end_io != end_sync_read) | 1958 | if (b->bi_end_io != end_sync_read) |
| 1958 | continue; | 1959 | continue; |
| 1959 | /* fixup the bio for reuse */ | 1960 | /* fixup the bio for reuse, but preserve BIO_UPTODATE */ |
| 1961 | uptodate = test_bit(BIO_UPTODATE, &b->bi_flags); | ||
| 1960 | bio_reset(b); | 1962 | bio_reset(b); |
| 1963 | if (!uptodate) | ||
| 1964 | clear_bit(BIO_UPTODATE, &b->bi_flags); | ||
| 1961 | b->bi_vcnt = vcnt; | 1965 | b->bi_vcnt = vcnt; |
| 1962 | b->bi_iter.bi_size = r1_bio->sectors << 9; | 1966 | b->bi_iter.bi_size = r1_bio->sectors << 9; |
| 1963 | b->bi_iter.bi_sector = r1_bio->sector + | 1967 | b->bi_iter.bi_sector = r1_bio->sector + |
| @@ -1990,11 +1994,14 @@ static int process_checks(struct r1bio *r1_bio) | |||
| 1990 | int j; | 1994 | int j; |
| 1991 | struct bio *pbio = r1_bio->bios[primary]; | 1995 | struct bio *pbio = r1_bio->bios[primary]; |
| 1992 | struct bio *sbio = r1_bio->bios[i]; | 1996 | struct bio *sbio = r1_bio->bios[i]; |
| 1997 | int uptodate = test_bit(BIO_UPTODATE, &sbio->bi_flags); | ||
| 1993 | 1998 | ||
| 1994 | if (sbio->bi_end_io != end_sync_read) | 1999 | if (sbio->bi_end_io != end_sync_read) |
| 1995 | continue; | 2000 | continue; |
| 2001 | /* Now we can 'fixup' the BIO_UPTODATE flag */ | ||
| 2002 | set_bit(BIO_UPTODATE, &sbio->bi_flags); | ||
| 1996 | 2003 | ||
| 1997 | if (test_bit(BIO_UPTODATE, &sbio->bi_flags)) { | 2004 | if (uptodate) { |
| 1998 | for (j = vcnt; j-- ; ) { | 2005 | for (j = vcnt; j-- ; ) { |
| 1999 | struct page *p, *s; | 2006 | struct page *p, *s; |
| 2000 | p = pbio->bi_io_vec[j].bv_page; | 2007 | p = pbio->bi_io_vec[j].bv_page; |
| @@ -2009,7 +2016,7 @@ static int process_checks(struct r1bio *r1_bio) | |||
| 2009 | if (j >= 0) | 2016 | if (j >= 0) |
| 2010 | atomic64_add(r1_bio->sectors, &mddev->resync_mismatches); | 2017 | atomic64_add(r1_bio->sectors, &mddev->resync_mismatches); |
| 2011 | if (j < 0 || (test_bit(MD_RECOVERY_CHECK, &mddev->recovery) | 2018 | if (j < 0 || (test_bit(MD_RECOVERY_CHECK, &mddev->recovery) |
| 2012 | && test_bit(BIO_UPTODATE, &sbio->bi_flags))) { | 2019 | && uptodate)) { |
| 2013 | /* No need to write to this device. */ | 2020 | /* No need to write to this device. */ |
| 2014 | sbio->bi_end_io = NULL; | 2021 | sbio->bi_end_io = NULL; |
| 2015 | rdev_dec_pending(conf->mirrors[i].rdev, mddev); | 2022 | rdev_dec_pending(conf->mirrors[i].rdev, mddev); |
