mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-24 01:41:39 +00:00
md/raid1: fix write behind issues introduced by bio_clone_bioset_partial
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. Reviewed-by: Ming Lei <tom.leiming@gmail.com> Signed-off-by: Shaohua Li <shli@fb.com>
This commit is contained in:
parent
aff8da09f2
commit
1ec492232e
1 changed files with 11 additions and 4 deletions
|
@ -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) {
|
||||
|
|
Loading…
Reference in a new issue