|
@@ -1240,17 +1240,24 @@ static void sync_request_write(mddev_t *mddev, r1bio_t *r1_bio)
|
|
|
}
|
|
|
r1_bio->read_disk = primary;
|
|
|
for (i=0; i<mddev->raid_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)) {
|