block: release bip in a right way in error path
[ 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>
This commit is contained in:
parent
b1b252d8d9
commit
074ae0cd84
@ -24,6 +24,18 @@ void blk_flush_integrity(void)
|
|||||||
flush_workqueue(kintegrityd_wq);
|
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_integrity_alloc - Allocate integrity payload and attach it to bio
|
||||||
* @bio: bio to attach integrity metadata to
|
* @bio: bio to attach integrity metadata to
|
||||||
@ -75,7 +87,7 @@ struct bio_integrity_payload *bio_integrity_alloc(struct bio *bio,
|
|||||||
|
|
||||||
return bip;
|
return bip;
|
||||||
err:
|
err:
|
||||||
mempool_free(bip, &bs->bio_integrity_pool);
|
__bio_integrity_free(bs, bip);
|
||||||
return ERR_PTR(-ENOMEM);
|
return ERR_PTR(-ENOMEM);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(bio_integrity_alloc);
|
EXPORT_SYMBOL(bio_integrity_alloc);
|
||||||
@ -96,14 +108,7 @@ void bio_integrity_free(struct bio *bio)
|
|||||||
kfree(page_address(bip->bip_vec->bv_page) +
|
kfree(page_address(bip->bip_vec->bv_page) +
|
||||||
bip->bip_vec->bv_offset);
|
bip->bip_vec->bv_offset);
|
||||||
|
|
||||||
if (bs && mempool_initialized(&bs->bio_integrity_pool)) {
|
__bio_integrity_free(bs, bip);
|
||||||
bvec_free(&bs->bvec_integrity_pool, bip->bip_vec, bip->bip_slab);
|
|
||||||
|
|
||||||
mempool_free(bip, &bs->bio_integrity_pool);
|
|
||||||
} else {
|
|
||||||
kfree(bip);
|
|
||||||
}
|
|
||||||
|
|
||||||
bio->bi_integrity = NULL;
|
bio->bi_integrity = NULL;
|
||||||
bio->bi_opf &= ~REQ_INTEGRITY;
|
bio->bi_opf &= ~REQ_INTEGRITY;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user