On Wed, Feb 22, 2017 at 7:32 AM, Shaohua Li <shli@xxxxxx> wrote: > There are two issues, introduced by commit 8e58e32(md/raid1: use > bio_clone_bioset_partial() in case of write behind): > - bio_clone_bioset_partial() uses bytes instead of sectors as parameters > - in writebehind mode, we return bio if all !writemostly disk bios finish, > which could happen before writemostly disk bios run. So all > writemostly disk bios should have their bvec. Here we just make sure > all bios are cloned instead of fast cloned. > > Cc: Ming Lei <tom.leiming@xxxxxxxxx> > Signed-off-by: Shaohua Li <shli@xxxxxx> > --- > drivers/md/raid1.c | 15 +++++++++++---- > 1 file changed, 11 insertions(+), 4 deletions(-) > > diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c > index e1ee446..33526b4 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); This is my fault, :-( > 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); > + } This is correct. Reviewed-by: Ming Lei <tom.leiming@xxxxxxxxx> Thanks, Ming Lei -- To unsubscribe from this list: send the line "unsubscribe linux-raid" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html