diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index 8901f0c8c775ad655566b75d54d22f65179ef8a0..d4e8796b45693222f3446f8d3edd131adb81a0c5 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -1472,8 +1472,8 @@ static void raid1_write_request(struct mddev *mddev, struct bio *bio) !waitqueue_active(&bitmap->behind_wait)) { mbio = bio_clone_bioset_partial(bio, GFP_NOIO, mddev->bio_set, - offset, - max_sectors); + offset << 9, + max_sectors << 9); alloc_behind_pages(mbio, r1_bio); } @@ -1485,8 +1485,15 @@ static void raid1_write_request(struct mddev *mddev, struct bio *bio) } if (!mbio) { - mbio = bio_clone_fast(bio, GFP_NOIO, mddev->bio_set); - bio_trim(mbio, offset, max_sectors); + if (r1_bio->behind_bvecs) + mbio = bio_clone_bioset_partial(bio, GFP_NOIO, + mddev->bio_set, + offset << 9, + max_sectors << 9); + else { + mbio = bio_clone_fast(bio, GFP_NOIO, mddev->bio_set); + bio_trim(mbio, offset, max_sectors); + } } if (r1_bio->behind_bvecs) {