On Fri, May 15, 2020 at 05:19:13PM -0700, Bart Van Assche wrote:
Multiple block drivers use zero_fill_bio() to zero-initialize the data buffer used for read operations. Make sure that all pages are zeroed instead of only the first if one or more multi-page bvecs are used to describe the data buffer.
Cc: Christoph Hellwig hch@lst.de Cc: Ming Lei ming.lei@redhat.com Cc: stable@vger.kernel.org Signed-off-by: Bart Van Assche bvanassche@acm.org
block/bio.c | 27 ++++++++++++++++++++++----- include/linux/bio.h | 1 + 2 files changed, 23 insertions(+), 5 deletions(-)
diff --git a/block/bio.c b/block/bio.c index 1594804fe8bc..48fcafbdae70 100644 --- a/block/bio.c +++ b/block/bio.c @@ -527,17 +527,34 @@ struct bio *bio_alloc_bioset(gfp_t gfp_mask, unsigned int nr_iovecs, } EXPORT_SYMBOL(bio_alloc_bioset); +void zero_fill_bvec(const struct bio_vec *bvec) +{
- struct page *page = bvec->bv_page;
- u32 offset = bvec->bv_offset;
- u32 left = bvec->bv_len;
- while (left) {
u32 len = min_t(u32, left, PAGE_SIZE - offset);
void *kaddr;
kaddr = kmap_atomic(page);
memset(kaddr + offset, 0, len);
flush_dcache_page(page);
kunmap_atomic(kaddr);
page++;
left -= len;
offset = 0;
- }
+} +EXPORT_SYMBOL(zero_fill_bvec);
void zero_fill_bio_iter(struct bio *bio, struct bvec_iter start) {
- unsigned long flags; struct bio_vec bv; struct bvec_iter iter;
__bio_for_each_segment(bv, bio, iter, start) {
The 'bv' from __bio_for_each_segment() is single page bvec, and so far only [__]bio_for_each_bvec iterates over multi-page bvec.
So nothing to be fixed and this patch isn't necessary.
Thanks, Ming