From d70fc13054f2ae6f290b3e0a186bbf638a17a03c Mon Sep 17 00:00:00 2001 From: Sergey Cheremencev Date: Fri, 15 Dec 2023 21:57:02 +0300 Subject: [PATCH] EX-7849 quota: notify newest lqe in qmt_set_id_notify It is possible that lqe_locate may call lqe_find inside qmt_pool_lqes_lookup_spec and insert the 2nd lqe into lqs_hash during processing the previous one. Do not add the 1st lqe to be processed by qmt_reba_thread in qmt_id_lock_notify, as this lqe will be freed in the end of lqe_locate_find due to the race with the 2nd that is already exist in lqs_hash. This fix should potentially fix the following assertion: (qmt_lock.c:950:qmt_id_lock_glimpse()) ASSERTION( lqe->lqe_gl ) failed: (qmt_lock.c:950:qmt_id_lock_glimpse()) LBUG Lustre-change: https://review.whamcloud.com/53637 Lustre-commit: 2832874970232fb5e1deedbf89b7a482518e6886 Test-Parameters: trivial testlist=sanity-quota,racer Test-Parameters: trivial testlist=sanity-quota,racer Test-Parameters: trivial testlist=sanity-quota,racer Test-Parameters: trivial testlist=sanity-quota,racer Test-Parameters: trivial testlist=sanity-quota,racer Test-Parameters: trivial testlist=sanity-quota,racer Test-Parameters: trivial testlist=sanity-quota,racer Test-Parameters: trivial testlist=sanity-quota,racer Fixes: 09f9fb3211 ("LU-11023 quota: quota pools for OSTs") Signed-off-by: Sergey Cheremencev Change-Id: I179edb06ec8c784636f566ffeba0035c6758a55b Reviewed-on: https://review.whamcloud.com/c/ex/lustre-release/+/53496 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Andreas Dilger --- lustre/quota/qmt_handler.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/lustre/quota/qmt_handler.c b/lustre/quota/qmt_handler.c index 0b7fde6..1a9a974 100644 --- a/lustre/quota/qmt_handler.c +++ b/lustre/quota/qmt_handler.c @@ -110,17 +110,18 @@ static void qmt_set_id_notify(const struct lu_env *env, struct qmt_device *qmt, struct lquota_entry *lqe_gl; int rc; - lqe_gl = lqe->lqe_is_global ? lqe : NULL; + if (lqe->lqe_is_global && !lqe->lqe_enforced) + RETURN_EXIT; + rc = qmt_pool_lqes_lookup_spec(env, qmt, lqe_rtype(lqe), lqe_qtype(lqe), &lqe->lqe_id); if (rc) GOTO(lqes_fini, rc); - if (!lqe_gl && qti_lqes_glbl(env)->lqe_is_global) - lqe_gl = qti_lqes_glbl(env); - - if (!lqe_gl) - GOTO(lqes_fini, rc); + lqe_gl = qti_lqes_glbl(env); + /* If global lqe is not enforced, it is not added to qti_lqes array */ + if (!lqe_gl->lqe_is_global) + GOTO(lqes_fini, 0); mutex_lock(&lqe_gl->lqe_glbl_data_lock); if (lqe_gl->lqe_glbl_data) -- 1.8.3.1