From cc19f004b5e5562660e7e225253883e159b89396 Mon Sep 17 00:00:00 2001 From: Mike Accetta Date: Sat, 16 Jun 2007 10:16:07 -0700 Subject: [PATCH] --- yaml --- r: 57843 b: refs/heads/master c: ed45666271f4fafa95b9d8ad44050e9a9bd2376e h: refs/heads/master i: 57841: f48c6084c9cfca92fc0500add967deda14a3f296 57839: 58638fa3b056379acddd68b66c172fd4ea9c3ec1 v: v3 --- [refs] | 2 +- trunk/drivers/md/raid1.c | 21 ++++++++++++++------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/[refs] b/[refs] index 0a9bedd0425e..041412310471 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: af03b8e4e81c3789e597632268940edd11ffe870 +refs/heads/master: ed45666271f4fafa95b9d8ad44050e9a9bd2376e diff --git a/trunk/drivers/md/raid1.c b/trunk/drivers/md/raid1.c index 3a95cc5e029c..46677d7d9980 100644 --- a/trunk/drivers/md/raid1.c +++ b/trunk/drivers/md/raid1.c @@ -1240,17 +1240,24 @@ static void sync_request_write(mddev_t *mddev, r1bio_t *r1_bio) } r1_bio->read_disk = primary; for (i=0; iraid_disks; i++) - if (r1_bio->bios[i]->bi_end_io == end_sync_read && - test_bit(BIO_UPTODATE, &r1_bio->bios[i]->bi_flags)) { + if (r1_bio->bios[i]->bi_end_io == end_sync_read) { int j; int vcnt = r1_bio->sectors >> (PAGE_SHIFT- 9); struct bio *pbio = r1_bio->bios[primary]; struct bio *sbio = r1_bio->bios[i]; - for (j = vcnt; j-- ; ) - if (memcmp(page_address(pbio->bi_io_vec[j].bv_page), - page_address(sbio->bi_io_vec[j].bv_page), - PAGE_SIZE)) - break; + + if (test_bit(BIO_UPTODATE, &sbio->bi_flags)) { + for (j = vcnt; j-- ; ) { + struct page *p, *s; + p = pbio->bi_io_vec[j].bv_page; + s = sbio->bi_io_vec[j].bv_page; + if (memcmp(page_address(p), + page_address(s), + PAGE_SIZE)) + break; + } + } else + j = 0; if (j >= 0) mddev->resync_mismatches += r1_bio->sectors; if (j < 0 || test_bit(MD_RECOVERY_CHECK, &mddev->recovery)) {