Re: [PATCH] md/raid1: fix write behind issues introduced by bio_clone_bioset_partial

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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



[Index of Archives]     [Linux RAID Wiki]     [ATA RAID]     [Linux SCSI Target Infrastructure]     [Linux Block]     [Linux IDE]     [Linux SCSI]     [Linux Hams]     [Device Mapper]     [Device Mapper Cryptographics]     [Kernel]     [Linux Admin]     [Linux Net]     [GFS]     [RPM]     [git]     [Yosemite Forum]


  Powered by Linux