X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;ds=sidebyside;f=lustre%2Fquota%2Fqmt_entry.c;h=92d83b69bf40b986132caf79d8f8ce79d7c49ca4;hb=d4978678b49102226a79a6c8e5d10075d416977d;hp=387806be931cd3bf7031e4d642178f395e9318ed;hpb=e8ecb8775389fb7febd2d0c659f0e80440f0b620;p=fs%2Flustre-release.git diff --git a/lustre/quota/qmt_entry.c b/lustre/quota/qmt_entry.c index 387806b..92d83b6 100644 --- a/lustre/quota/qmt_entry.c +++ b/lustre/quota/qmt_entry.c @@ -44,6 +44,7 @@ static void qmt_lqe_init(struct lquota_entry *lqe, void *arg) lqe->lqe_revoke_time = 0; init_rwsem(&lqe->lqe_sem); + mutex_init(&lqe->lqe_glbl_data_lock); } /* Apply the default quota setting to the specified quota entry @@ -301,8 +302,7 @@ struct thandle *qmt_trans_start(const struct lu_env *env, int qmt_glb_write_lqes(const struct lu_env *env, struct thandle *th, __u32 flags, __u64 *ver) { - int i, rc; - rc = 0; + int i, rc = 0; for (i = 0; i < qti_lqes_cnt(env); i++) { rc = qmt_glb_write(env, th, qti_lqes(env)[i], flags, ver); @@ -354,7 +354,8 @@ int qmt_glb_write(const struct lu_env *env, struct thandle *th, if (lqe->lqe_is_default) { rec->qbr_hardlimit = 0; rec->qbr_softlimit = 0; - rec->qbr_time = LQUOTA_GRACE_FLAG(0, LQUOTA_FLAG_DEFAULT); + rec->qbr_time = LQUOTA_GRACE_FLAG(lqe->lqe_gracetime, + LQUOTA_FLAG_DEFAULT); } else { rec->qbr_hardlimit = lqe->lqe_hardlimit; rec->qbr_softlimit = lqe->lqe_softlimit; @@ -842,8 +843,13 @@ bool qmt_adjust_edquot_qunit_notify(const struct lu_env *env, return need_reseed; } - if (lqe_gl->lqe_glbl_data && need_reseed) { - qmt_seed_glbe_all(env, lqe_gl->lqe_glbl_data, qunit, edquot); + if (need_reseed) { + mutex_lock(&lqe_gl->lqe_glbl_data_lock); + if (lqe_gl->lqe_glbl_data) + qmt_seed_glbe_all(env, lqe_gl->lqe_glbl_data, qunit, + edquot); + mutex_unlock(&lqe_gl->lqe_glbl_data_lock); + qmt_id_lock_notify(qmt, lqe_gl); } return need_reseed; @@ -880,17 +886,23 @@ void qmt_revalidate_lqes(const struct lu_env *env, for (i = 0; i < qti_lqes_cnt(env); i++) need_notify |= qmt_revalidate(env, qti_lqes(env)[i]); + if (!need_notify) + return; + /* There could be no ID lock to the moment of reconciliation. * As a result lqe global data is not initialised yet. It is ok * for release and report requests. */ if (!lqe_gl->lqe_glbl_data && - (req_is_rel(qb_flags) || req_has_rep(qb_flags))) + (req_is_rel(qb_flags) || req_has_rep(qb_flags))) { return; + } - if (need_notify) { + mutex_lock(&lqe_gl->lqe_glbl_data_lock); + if (lqe_gl->lqe_glbl_data) qmt_seed_glbe(env, lqe_gl->lqe_glbl_data); - qmt_id_lock_notify(qmt, lqe_gl); - } + mutex_unlock(&lqe_gl->lqe_glbl_data_lock); + + qmt_id_lock_notify(qmt, lqe_gl); } void qti_lqes_init(const struct lu_env *env) @@ -981,13 +993,15 @@ void qti_lqes_fini(const struct lu_env *env) qti->qti_lqes_cnt = 0; } -int qti_lqes_min_qunit(const struct lu_env *env) +__u64 qti_lqes_min_qunit(const struct lu_env *env) { - int i, min, qunit; + __u64 min, qunit; + int i; for (i = 1, min = qti_lqe_qunit(env, 0); i < qti_lqes_cnt(env); i++) { qunit = qti_lqe_qunit(env, i); - if (qunit < min) + /* if qunit is 0, lqe is not enforced and we can ignore it */ + if (qunit && qunit < min) min = qunit; }