X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=block%2Fbio.c;h=9c64edac75d5055896516efc9dc28c43d41f673d;hb=9fa72f250436aadfae7019afb10b8b2596fd73b3;hp=095da59a303cf5b13469a9b8c3386c9f42ffd985;hpb=484da3855c79092b53e1e4e89e536c98c531b0d2;p=mirror_ubuntu-bionic-kernel.git diff --git a/block/bio.c b/block/bio.c index 095da59a303c..9c64edac75d5 100644 --- a/block/bio.c +++ b/block/bio.c @@ -156,7 +156,7 @@ out: unsigned int bvec_nr_vecs(unsigned short idx) { - return bvec_slabs[idx].nr_vecs; + return bvec_slabs[--idx].nr_vecs; } void bvec_free(mempool_t *pool, struct bio_vec *bv, unsigned int idx) @@ -1316,8 +1316,11 @@ struct bio *bio_copy_user_iov(struct request_queue *q, } } - if (bio_add_pc_page(q, bio, page, bytes, offset) < bytes) + if (bio_add_pc_page(q, bio, page, bytes, offset) < bytes) { + if (!map_data) + __free_page(page); break; + } len -= bytes; offset = 0; @@ -1338,6 +1341,8 @@ struct bio *bio_copy_user_iov(struct request_queue *q, if (ret) goto cleanup; } else { + if (bmd->is_our_pages) + zero_fill_bio(bio); iov_iter_advance(iter, bio->bi_iter.bi_size); }