On Tue, Apr 02, 2019 at 09:46:38AM +0800, Ming Lei wrote:
> Commit f6970f83ef79 ("block: don't check if adjacent bvecs in one bio can
> be mergeable") changes bvec merge by only considering two bvecs from
> different bios. However, if the former bio doesn't inlcude any io bvec,
> then the following warning may be triggered:
> 
>  warning: ‘bvec.bv_offset’ may be used uninitialized in this function 
> [-Wmaybe-uninitialized]
> 
> In practice, it shouldn't be triggered.
> 
> Fixes it by adding check on former bio, the check shouldn't add any cost
> given 'bio->bi_iter' can be hit in cache.
> 
> Reported-by: Jens Axboe <[email protected]>
> Fixes: f6970f83ef79 ("block: don't check if adjacent bvecs in one bio can be 
> mergeable")
> Signed-off-by: Ming Lei <[email protected]>
> ---
>  block/blk-merge.c | 8 +++++---
>  1 file changed, 5 insertions(+), 3 deletions(-)
> 
> diff --git a/block/blk-merge.c b/block/blk-merge.c
> index 8f96d683b577..1fc66d03893f 100644
> --- a/block/blk-merge.c
> +++ b/block/blk-merge.c
> @@ -527,7 +527,7 @@ static int __blk_bios_map_sg(struct request_queue *q, 
> struct bio *bio,
>                            struct scatterlist *sglist,
>                            struct scatterlist **sg)
>  {
> -     struct bio_vec bvec, bvprv = { NULL };
> +     struct bio_vec uninitialized_var(bvec), bvprv = { NULL };
>       struct bvec_iter iter;
>       int nsegs = 0;
>       bool new_bio = false;
> @@ -550,8 +550,10 @@ static int __blk_bios_map_sg(struct request_queue *q, 
> struct bio *bio,
>   next_bvec:
>                       new_bio = false;
>               }
> -             bvprv = bvec;
> -             new_bio = true;
> +             if (likely(bio->bi_iter.bi_size)) {
> +                     bvprv = bvec;
> +                     new_bio = true;
> +             }
>       }

Looks __blk_recalc_rq_segments() needs the similar fix too, so please
ignore this one, and I will handle them all in one patch.

Thanks,
Ming

Reply via email to