|
@@ -1973,6 +1973,7 @@ static int fix_sync_read_error(struct r1bio *r1_bio)
|
|
|
struct mddev *mddev = r1_bio->mddev;
|
|
|
struct r1conf *conf = mddev->private;
|
|
|
struct bio *bio = r1_bio->bios[r1_bio->read_disk];
|
|
|
+ struct page **pages = get_resync_pages(bio)->pages;
|
|
|
sector_t sect = r1_bio->sector;
|
|
|
int sectors = r1_bio->sectors;
|
|
|
int idx = 0;
|
|
@@ -2006,7 +2007,7 @@ static int fix_sync_read_error(struct r1bio *r1_bio)
|
|
|
*/
|
|
|
rdev = conf->mirrors[d].rdev;
|
|
|
if (sync_page_io(rdev, sect, s<<9,
|
|
|
- bio->bi_io_vec[idx].bv_page,
|
|
|
+ pages[idx],
|
|
|
REQ_OP_READ, 0, false)) {
|
|
|
success = 1;
|
|
|
break;
|
|
@@ -2061,7 +2062,7 @@ static int fix_sync_read_error(struct r1bio *r1_bio)
|
|
|
continue;
|
|
|
rdev = conf->mirrors[d].rdev;
|
|
|
if (r1_sync_page_io(rdev, sect, s,
|
|
|
- bio->bi_io_vec[idx].bv_page,
|
|
|
+ pages[idx],
|
|
|
WRITE) == 0) {
|
|
|
r1_bio->bios[d]->bi_end_io = NULL;
|
|
|
rdev_dec_pending(rdev, mddev);
|
|
@@ -2076,7 +2077,7 @@ static int fix_sync_read_error(struct r1bio *r1_bio)
|
|
|
continue;
|
|
|
rdev = conf->mirrors[d].rdev;
|
|
|
if (r1_sync_page_io(rdev, sect, s,
|
|
|
- bio->bi_io_vec[idx].bv_page,
|
|
|
+ pages[idx],
|
|
|
READ) != 0)
|
|
|
atomic_add(s, &rdev->corrected_errors);
|
|
|
}
|
|
@@ -2152,6 +2153,8 @@ static void process_checks(struct r1bio *r1_bio)
|
|
|
struct bio *pbio = r1_bio->bios[primary];
|
|
|
struct bio *sbio = r1_bio->bios[i];
|
|
|
int error = sbio->bi_error;
|
|
|
+ struct page **ppages = get_resync_pages(pbio)->pages;
|
|
|
+ struct page **spages = get_resync_pages(sbio)->pages;
|
|
|
|
|
|
if (sbio->bi_end_io != end_sync_read)
|
|
|
continue;
|
|
@@ -2160,11 +2163,8 @@ static void process_checks(struct r1bio *r1_bio)
|
|
|
|
|
|
if (!error) {
|
|
|
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),
|
|
|
+ if (memcmp(page_address(ppages[j]),
|
|
|
+ page_address(spages[j]),
|
|
|
sbio->bi_io_vec[j].bv_len))
|
|
|
break;
|
|
|
}
|