Whamcloud - gitweb
LU-13756 quota: up_read leak in qmt_pool_lookup 06/45106/7
authorSergey Cheremencev <sergey.cheremencev@hpe.com>
Thu, 30 Sep 2021 15:58:16 +0000 (18:58 +0300)
committerOleg Drokin <green@whamcloud.com>
Mon, 13 Dec 2021 03:54:00 +0000 (03:54 +0000)
qmt_pool_lock is not released if qti_pools_add fails in
qmt_pool_lookup.

Change-Id: Ic2adb44468d51af7aefcbb91279260ae6f85d67a
Signed-off-by: Sergey Cheremencev <sergey.cheremencev@hpe.com>
Reviewed-on: https://review.whamcloud.com/45106
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Vladimir Saveliev <vlaidimir.saveliev@hpe.com>
Reviewed-by: Andrew Perepechko <andrew.perepechko@hpe.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/quota/qmt_pool.c

index 5f9d98a..37bb488 100644 (file)
@@ -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 idx, bool add)
 {
        struct qmt_pool_info    *pos, *pool;
-       int rc;
+       int rc = 0;
        ENTRY;
 
        down_read(&qmt->qmt_pool_lock);
        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)
                if (idx >= 0 && !qmt_sarr_check_idx(pos, idx)) {
                        rc = qti_pools_add(env, pos);
                        if (rc)
-                               GOTO(out_err, rc);
+                               break;
                        continue;
                }
 
                        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)
                        if (add) {
                                rc = qti_pools_add(env, pos);
                                if (rc)
-                                       GOTO(out_err, rc);
+                                       break;
                        } else {
                                qpi_getref(pool);
                        }
                        } 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);
 
        }
        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];
 
        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);
 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);
 }
 
 /*
 }
 
 /*