From: Sergey Cheremencev Date: Thu, 30 Sep 2021 15:58:16 +0000 (+0300) Subject: LU-13756 quota: up_read leak in qmt_pool_lookup X-Git-Tag: 2.14.56~10 X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=commitdiff_plain;h=d16b3141119a3b75276914ad3601e0dd27579b2b LU-13756 quota: up_read leak in qmt_pool_lookup qmt_pool_lock is not released if qti_pools_add fails in qmt_pool_lookup. Change-Id: Ic2adb44468d51af7aefcbb91279260ae6f85d67a Signed-off-by: Sergey Cheremencev Reviewed-on: https://review.whamcloud.com/45106 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Vladimir Saveliev Reviewed-by: Andrew Perepechko Reviewed-by: Oleg Drokin --- diff --git a/lustre/quota/qmt_pool.c b/lustre/quota/qmt_pool.c index 5f9d98a..37bb488 100644 --- a/lustre/quota/qmt_pool.c +++ b/lustre/quota/qmt_pool.c @@ -383,7 +383,7 @@ struct qmt_pool_info *qmt_pool_lookup(const struct lu_env *env, int idx, bool add) { struct qmt_pool_info *pos, *pool; - int rc; + int rc = 0; ENTRY; down_read(&qmt->qmt_pool_lock); @@ -409,7 +409,7 @@ struct qmt_pool_info *qmt_pool_lookup(const struct lu_env *env, if (idx >= 0 && !qmt_sarr_check_idx(pos, idx)) { rc = qti_pools_add(env, pos); if (rc) - GOTO(out_err, rc); + break; continue; } @@ -419,7 +419,7 @@ struct qmt_pool_info *qmt_pool_lookup(const struct lu_env *env, if (add) { rc = qti_pools_add(env, pos); if (rc) - GOTO(out_err, rc); + break; } else { qpi_getref(pool); } @@ -428,6 +428,9 @@ struct qmt_pool_info *qmt_pool_lookup(const struct lu_env *env, } up_read(&qmt->qmt_pool_lock); + if (rc) + GOTO(out_err, rc); + if (idx >= 0 && qti_pools_cnt(env)) pool = qti_pools_env(env)[0]; @@ -435,7 +438,7 @@ struct qmt_pool_info *qmt_pool_lookup(const struct lu_env *env, out_err: CERROR("%s: cannot add pool %s: err = %d\n", qmt->qmt_svname, pos->qpi_name, rc); - RETURN(ERR_PTR(rc)); + return ERR_PTR(rc); } /*