X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=block%2Fbio.c;h=9c64edac75d5055896516efc9dc28c43d41f673d;hb=9fa72f250436aadfae7019afb10b8b2596fd73b3;hp=cea6758155878ddb681c6c0a63b92d9951dc7937;hpb=ea531d28a2979d52be83959a6e22cb67d516b3b9;p=mirror_ubuntu-bionic-kernel.git diff --git a/block/bio.c b/block/bio.c index cea675815587..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,7 +1341,8 @@ struct bio *bio_copy_user_iov(struct request_queue *q, if (ret) goto cleanup; } else { - zero_fill_bio(bio); + if (bmd->is_our_pages) + zero_fill_bio(bio); iov_iter_advance(iter, bio->bi_iter.bi_size); }