|
@@ -1284,6 +1284,7 @@ static void sync_request_write(mddev_t *mddev, r1bio_t *r1_bio)
|
|
|
rdev_dec_pending(conf->mirrors[i].rdev, mddev);
|
|
|
} else {
|
|
|
/* fixup the bio for reuse */
|
|
|
+ int size;
|
|
|
sbio->bi_vcnt = vcnt;
|
|
|
sbio->bi_size = r1_bio->sectors << 9;
|
|
|
sbio->bi_idx = 0;
|
|
@@ -1297,10 +1298,20 @@ static void sync_request_write(mddev_t *mddev, r1bio_t *r1_bio)
|
|
|
sbio->bi_sector = r1_bio->sector +
|
|
|
conf->mirrors[i].rdev->data_offset;
|
|
|
sbio->bi_bdev = conf->mirrors[i].rdev->bdev;
|
|
|
- for (j = 0; j < vcnt ; j++)
|
|
|
- memcpy(page_address(sbio->bi_io_vec[j].bv_page),
|
|
|
+ size = sbio->bi_size;
|
|
|
+ for (j = 0; j < vcnt ; j++) {
|
|
|
+ struct bio_vec *bi;
|
|
|
+ bi = &sbio->bi_io_vec[j];
|
|
|
+ bi->bv_offset = 0;
|
|
|
+ if (size > PAGE_SIZE)
|
|
|
+ bi->bv_len = PAGE_SIZE;
|
|
|
+ else
|
|
|
+ bi->bv_len = size;
|
|
|
+ size -= PAGE_SIZE;
|
|
|
+ memcpy(page_address(bi->bv_page),
|
|
|
page_address(pbio->bi_io_vec[j].bv_page),
|
|
|
PAGE_SIZE);
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
}
|