Free the allocated memory and resource while an error occurs. Cc: Herbert Xu <herb...@gondor.apana.org.au> Cc: David S. Miller" <da...@davemloft.net> Cc: Seth Jennings <sjenn...@redhat.com> Cc: Dan Streetman <ddstr...@ieee.org> Cc: Vitaly Wool <vitaly.w...@konsulko.com> Cc: Andrew Morton <a...@linux-foundation.org> Signed-off-by: Barry Song <song.bao....@hisilicon.com> --- -v1: an incremental patch againest linux-next to fix the issue pointed out by Vitaly
mm/zswap.c | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/mm/zswap.c b/mm/zswap.c index 0d914ba6b4a0..c0a85ef46610 100644 --- a/mm/zswap.c +++ b/mm/zswap.c @@ -428,28 +428,31 @@ static int zswap_cpu_comp_prepare(unsigned int cpu, struct hlist_node *node) struct crypto_acomp *acomp; struct acomp_req *req; struct crypto_acomp_ctx *acomp_ctx; + int ret; if (WARN_ON(*per_cpu_ptr(pool->acomp_ctx, cpu))) return 0; acomp_ctx = kzalloc(sizeof(*acomp_ctx), GFP_KERNEL); - if (IS_ERR_OR_NULL(acomp_ctx)) { - pr_err("Could not initialize acomp_ctx\n"); + if (!acomp_ctx) { + pr_err("Could not allocate acomp_ctx\n"); return -ENOMEM; } acomp = crypto_alloc_acomp(pool->tfm_name, 0, 0); - if (IS_ERR_OR_NULL(acomp)) { + if (IS_ERR(acomp)) { pr_err("could not alloc crypto acomp %s : %ld\n", pool->tfm_name, PTR_ERR(acomp)); - return -ENOMEM; + ret = PTR_ERR(acomp); + goto free_ctx; } acomp_ctx->acomp = acomp; req = acomp_request_alloc(acomp_ctx->acomp); - if (IS_ERR_OR_NULL(req)) { - pr_err("could not alloc crypto acomp %s : %ld\n", - pool->tfm_name, PTR_ERR(acomp)); - return -ENOMEM; + if (!req) { + pr_err("could not alloc crypto acomp_request %s\n", + pool->tfm_name); + ret = -ENOMEM; + goto free_acomp; } acomp_ctx->req = req; @@ -462,6 +465,12 @@ static int zswap_cpu_comp_prepare(unsigned int cpu, struct hlist_node *node) *per_cpu_ptr(pool->acomp_ctx, cpu) = acomp_ctx; return 0; + +free_acomp: + crypto_free_acomp(acomp_ctx->acomp); +free_ctx: + kfree(acomp_ctx); + return ret; } static int zswap_cpu_comp_dead(unsigned int cpu, struct hlist_node *node) -- 2.27.0