Hi, Please discard this patch as it's from a wrong work branch. The patch is not complete. I'll resubmit. Long > -----Original Message----- > From: longli@xxxxxxxxxxxxxxxxx <longli@xxxxxxxxxxxxxxxxx> > Sent: Thursday, June 3, 2021 11:47 AM > To: linux-block@xxxxxxxxxxxxxxx > Cc: Long Li <longli@xxxxxxxxxxxxx>; Jens Axboe <axboe@xxxxxxxxx>; > Johannes Thumshirn <johannes.thumshirn@xxxxxxx>; Pavel Begunkov > <asml.silence@xxxxxxxxx>; Ming Lei <ming.lei@xxxxxxxxxx>; Tejun Heo > <tj@xxxxxxxxxx>; Matthew Wilcox (Oracle) <willy@xxxxxxxxxxxxx>; Jeffle Xu > <jefflexu@xxxxxxxxxxxxxxxxx>; linux-kernel@xxxxxxxxxxxxxxx; > stable@xxxxxxxxxxxxxxx > Subject: [PATCH] block: return the correct first bvec when checking for gaps > > From: Long Li <longli@xxxxxxxxxxxxx> > > After commit 07173c3ec276 ("block: enable multipage bvecs"), a bvec can > have multiple pages. But bio_will_gap() still assumes one page bvec while > checking for merging. This causes data corruption on drivers relying on the > correct merging on virt_boundary_mask. > > Fix this by returning the bvec for multi-page bvec. > > Cc: Jens Axboe <axboe@xxxxxxxxx> > Cc: Johannes Thumshirn <johannes.thumshirn@xxxxxxx> > Cc: Pavel Begunkov <asml.silence@xxxxxxxxx> > Cc: Ming Lei <ming.lei@xxxxxxxxxx> > Cc: Tejun Heo <tj@xxxxxxxxxx> > Cc: "Matthew Wilcox (Oracle)" <willy@xxxxxxxxxxxxx> > Cc: Jeffle Xu <jefflexu@xxxxxxxxxxxxxxxxx> > Cc: linux-kernel@xxxxxxxxxxxxxxx > Cc: stable@xxxxxxxxxxxxxxx > Fixes: 07173c3ec276 ("block: enable multipage bvecs") > Signed-off-by: Long Li <longli@xxxxxxxxxxxxx> > --- > include/linux/bio.h | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/include/linux/bio.h b/include/linux/bio.h index > a0b4cfdf62a4..e89242a53bbc 100644 > --- a/include/linux/bio.h > +++ b/include/linux/bio.h > @@ -271,7 +271,7 @@ static inline void bio_clear_flag(struct bio *bio, > unsigned int bit) > > static inline void bio_get_first_bvec(struct bio *bio, struct bio_vec *bv) { > - *bv = bio_iovec(bio); > + *bv = mp_bvec_iter_bvec(bio->bi_io_vec, bio->bi_iter); > } > > static inline void bio_get_last_bvec(struct bio *bio, struct bio_vec *bv) > -- > 2.17.1