diff options
author | Christoph Hellwig <hch@lst.de> | 2019-04-11 08:23:28 +0200 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2019-04-12 09:06:37 -0600 |
commit | a10584c3cda9cbb1a1ccd072783bfd625f99e40d (patch) | |
tree | 812ccc3a2f7ea4d998d9c71a60d94a61abe891a2 /block/bio.c | |
parent | 8a96a0e408102fb7aa73d8aa0b5e2219cfd51e55 (diff) | |
download | lwn-a10584c3cda9cbb1a1ccd072783bfd625f99e40d.tar.gz lwn-a10584c3cda9cbb1a1ccd072783bfd625f99e40d.zip |
block: refactor __bio_iov_bvec_add_pages
Return early on error, and add an unlikely annotation for that case.
Reviewed-by: Ming Lei <ming.lei@redhat.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'block/bio.c')
-rw-r--r-- | block/bio.c | 19 |
1 files changed, 9 insertions, 10 deletions
diff --git a/block/bio.c b/block/bio.c index c2592c5d70b9..ad346082a971 100644 --- a/block/bio.c +++ b/block/bio.c @@ -873,20 +873,19 @@ static int __bio_iov_bvec_add_pages(struct bio *bio, struct iov_iter *iter) len = min_t(size_t, bv->bv_len - iter->iov_offset, iter->count); size = bio_add_page(bio, bv->bv_page, len, bv->bv_offset + iter->iov_offset); - if (size == len) { - if (!bio_flagged(bio, BIO_NO_PAGE_REF)) { - struct page *page; - int i; + if (unlikely(size != len)) + return -EINVAL; - mp_bvec_for_each_page(page, bv, i) - get_page(page); - } + if (!bio_flagged(bio, BIO_NO_PAGE_REF)) { + struct page *page; + int i; - iov_iter_advance(iter, size); - return 0; + mp_bvec_for_each_page(page, bv, i) + get_page(page); } - return -EINVAL; + iov_iter_advance(iter, size); + return 0; } #define PAGE_PTRS_PER_BVEC (sizeof(struct bio_vec) / sizeof(struct page *)) |