void qmt_free_lqe_gd(struct lqe_glbl_data *lgd)
{
+ if (unlikely(!lgd))
+ return;
+
OBD_FREE(lgd->lqeg_arr,
sizeof(struct lqe_glbl_entry) * lgd->lqeg_num_alloc);
OBD_FREE(lgd, sizeof(struct lqe_glbl_data));
if (res->lr_name.name[LUSTRE_RES_ID_QUOTA_SEQ_OFF] != 0) {
struct lquota_entry *lqe = res->lr_lvb_data;
- struct lqe_glbl_data *lgd = lqe->lqe_glbl_data;
+ struct lqe_glbl_data *lgd;
mutex_lock(&lqe->lqe_glbl_data_lock);
+ lgd = lqe->lqe_glbl_data;
lqe->lqe_glbl_data = NULL;
- qmt_free_lqe_gd(lgd);
mutex_unlock(&lqe->lqe_glbl_data_lock);
+ qmt_free_lqe_gd(lgd);
/* release lqe reference */
lqe_putref(lqe);
/* Find all lqes with lqe_id to reseed lgd array */
rc = qmt_pool_lqes_lookup_spec(env, qmt, lqe_rtype(lqe),
lqe_qtype(lqe), &lqe->lqe_id);
- if (!rc && qti_lqes_glbl(env)->lqe_glbl_data) {
- qmt_seed_glbe(env,
- qti_lqes_glbl(env)->lqe_glbl_data);
- qmt_id_lock_notify(qmt, qti_lqes_glbl(env));
+ if (!rc) {
+ struct lquota_entry *lqeg = qti_lqes_glbl(env);
+
+ mutex_lock(&lqeg->lqe_glbl_data_lock);
+ if (lqeg->lqe_glbl_data)
+ qmt_seed_glbe(env, lqeg->lqe_glbl_data);
+ mutex_unlock(&lqeg->lqe_glbl_data_lock);
+ qmt_id_lock_notify(qmt, lqeg);
}
qti_lqes_fini(env);
}