From: Niu Yawei Date: Wed, 16 Apr 2014 04:22:06 +0000 (-0400) Subject: LU-4920 quota: always clear lqe_lockh on lock cancel X-Git-Tag: 2.5.59~78 X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=commitdiff_plain;h=73ef5dcd8bcf32e4127e0011357b8bc39472cdba LU-4920 quota: always clear lqe_lockh on lock cancel In the qsd_id_blocking_ast(), lqe_lockh should always be cleared, otherwise, quota code will mistakenly assume the id lock is still valid. Signed-off-by: Niu Yawei Change-Id: Iac73216d130aebe1b73226d260807f3a9cedc635 Reviewed-on: http://review.whamcloud.com/9965 Tested-by: Jenkins Reviewed-by: Fan Yong Tested-by: Maloo Reviewed-by: Andreas Dilger --- diff --git a/lustre/quota/qsd_lock.c b/lustre/quota/qsd_lock.c index d609830..139ba49 100644 --- a/lustre/quota/qsd_lock.c +++ b/lustre/quota/qsd_lock.c @@ -310,7 +310,6 @@ static int qsd_id_blocking_ast(struct ldlm_lock *lock, struct ldlm_lock_desc *de case LDLM_CB_CANCELING: { struct lu_env *env; struct lquota_entry *lqe; - bool rel = false; LDLM_DEBUG(lock, "canceling global quota lock"); lqe = qsd_id_ast_data_get(lock, true); @@ -319,29 +318,6 @@ static int qsd_id_blocking_ast(struct ldlm_lock *lock, struct ldlm_lock_desc *de LQUOTA_DEBUG(lqe, "losing ID lock"); - /* just local cancel (for stack clean up or eviction), don't - * release quota space in this case */ - if (ldlm_is_local_only(lock)) { - lqe_putref(lqe); - break; - } - - /* allocate environment */ - OBD_ALLOC_PTR(env); - if (env == NULL) { - lqe_putref(lqe); - rc = -ENOMEM; - break; - } - - /* initialize environment */ - rc = lu_env_init(env, LCT_DT_THREAD); - if (rc) { - OBD_FREE_PTR(env); - lqe_putref(lqe); - break; - } - ldlm_lock2handle(lock, &lockh); lqe_write_lock(lqe); if (lustre_handle_equal(&lockh, &lqe->lqe_lockh)) { @@ -349,21 +325,41 @@ static int qsd_id_blocking_ast(struct ldlm_lock *lock, struct ldlm_lock_desc *de qsd_set_qunit(lqe, 0); memset(&lqe->lqe_lockh, 0, sizeof(lqe->lqe_lockh)); qsd_set_edquot(lqe, false); - rel = true; } lqe_write_unlock(lqe); - /* If there is qqacq inflight, the release will be skipped + /* If there is dqacq inflight, the release will be skipped * at this time, and triggered on dqacq completion later, * which means there could be a short window that slave is * holding spare grant wihtout per-ID lock. */ - if (rel) + + /* don't release quota space for local cancel (stack clean + * up or eviction) */ + if (!ldlm_is_local_only(lock)) { + /* allocate environment */ + OBD_ALLOC_PTR(env); + if (env == NULL) { + lqe_putref(lqe); + rc = -ENOMEM; + break; + } + + /* initialize environment */ + rc = lu_env_init(env, LCT_DT_THREAD); + if (rc) { + OBD_FREE_PTR(env); + lqe_putref(lqe); + break; + } + rc = qsd_adjust(env, lqe); + lu_env_fini(env); + OBD_FREE_PTR(env); + } + /* release lqe reference grabbed by qsd_id_ast_data_get() */ lqe_putref(lqe); - lu_env_fini(env); - OBD_FREE_PTR(env); break; } default: