| From 695bc1dcb12fb35158d844d324fde398f153b4bc Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 24 Jun 2020 18:21:39 +0800 |
| Subject: block: release bip in a right way in error path |
| |
| From: Chengguang Xu <cgxu519@mykernel.net> |
| |
| [ Upstream commit 0b8eb629a700c0ef15a437758db8255f8444e76c ] |
| |
| Release bip using kfree() in error path when that was allocated |
| by kmalloc(). |
| |
| Signed-off-by: Chengguang Xu <cgxu519@mykernel.net> |
| Reviewed-by: Christoph Hellwig <hch@lst.de> |
| Acked-by: Martin K. Petersen <martin.petersen@oracle.com> |
| Signed-off-by: Jens Axboe <axboe@kernel.dk> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| block/bio-integrity.c | 23 ++++++++++++++--------- |
| 1 file changed, 14 insertions(+), 9 deletions(-) |
| |
| diff --git a/block/bio-integrity.c b/block/bio-integrity.c |
| index ae07dd78e9518..c9dc2b17ce251 100644 |
| --- a/block/bio-integrity.c |
| +++ b/block/bio-integrity.c |
| @@ -24,6 +24,18 @@ void blk_flush_integrity(void) |
| flush_workqueue(kintegrityd_wq); |
| } |
| |
| +void __bio_integrity_free(struct bio_set *bs, struct bio_integrity_payload *bip) |
| +{ |
| + if (bs && mempool_initialized(&bs->bio_integrity_pool)) { |
| + if (bip->bip_vec) |
| + bvec_free(&bs->bvec_integrity_pool, bip->bip_vec, |
| + bip->bip_slab); |
| + mempool_free(bip, &bs->bio_integrity_pool); |
| + } else { |
| + kfree(bip); |
| + } |
| +} |
| + |
| /** |
| * bio_integrity_alloc - Allocate integrity payload and attach it to bio |
| * @bio: bio to attach integrity metadata to |
| @@ -75,7 +87,7 @@ struct bio_integrity_payload *bio_integrity_alloc(struct bio *bio, |
| |
| return bip; |
| err: |
| - mempool_free(bip, &bs->bio_integrity_pool); |
| + __bio_integrity_free(bs, bip); |
| return ERR_PTR(-ENOMEM); |
| } |
| EXPORT_SYMBOL(bio_integrity_alloc); |
| @@ -96,14 +108,7 @@ void bio_integrity_free(struct bio *bio) |
| kfree(page_address(bip->bip_vec->bv_page) + |
| bip->bip_vec->bv_offset); |
| |
| - if (bs && mempool_initialized(&bs->bio_integrity_pool)) { |
| - bvec_free(&bs->bvec_integrity_pool, bip->bip_vec, bip->bip_slab); |
| - |
| - mempool_free(bip, &bs->bio_integrity_pool); |
| - } else { |
| - kfree(bip); |
| - } |
| - |
| + __bio_integrity_free(bs, bip); |
| bio->bi_integrity = NULL; |
| bio->bi_opf &= ~REQ_INTEGRITY; |
| } |
| -- |
| 2.25.1 |
| |