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);
+ edquot, false);
mutex_unlock(&lqe_gl->lqe_glbl_data_lock);
qmt_id_lock_notify(qmt, lqe_gl);
mutex_lock(&lqe_gl->lqe_glbl_data_lock);
if (lqe_gl->lqe_glbl_data)
- qmt_seed_glbe(env, lqe_gl->lqe_glbl_data);
+ qmt_seed_glbe(env, lqe_gl->lqe_glbl_data, false);
mutex_unlock(&lqe_gl->lqe_glbl_data_lock);
qmt_id_lock_notify(qmt, lqe_gl);
}
void qmt_seed_glbe_all(const struct lu_env *env, struct lqe_glbl_data *lgd,
- bool qunit, bool edquot)
+ bool qunit, bool edquot, bool pool_locked)
{
struct rw_semaphore *sem = NULL;
struct qmt_pool_info *qpi;
if (qmt_pool_global(qpi)) {
slaves_cnt = lgd->lqeg_num_alloc;
} else {
- sem = qmt_sarr_rwsem(qpi);
- down_read(sem);
+ if (!pool_locked) {
+ sem = qmt_sarr_rwsem(qpi);
+ down_read(sem);
+ }
+
slaves_cnt = qmt_sarr_count(qpi);
}
}
}
- if (!qmt_pool_global(qpi))
+ if (!pool_locked && !qmt_pool_global(qpi))
up_read(sem);
}
/* TODO: only for debug purposes - remove it later */
qmt_pool_lqes_lookup_spec(env, qmt, pool_type,
lqe_qtype(lqe), &lqe->lqe_id);
- qmt_seed_glbe(env, lgd);
+ qmt_seed_glbe(env, lgd, false);
lqe->lqe_glbl_data = lgd;
qmt_id_lock_notify(qmt, lqe);
mutex_lock(&lqe_gl->lqe_glbl_data_lock);
if (lqe_gl->lqe_glbl_data)
- qmt_seed_glbe(env, lqe_gl->lqe_glbl_data);
+ qmt_seed_glbe(env, lqe_gl->lqe_glbl_data, false);
mutex_unlock(&lqe_gl->lqe_glbl_data_lock);
/* Even if slaves haven't enqueued quota lock yet,
void qmt_setup_lqe_gd(const struct lu_env *, struct qmt_device *,
struct lquota_entry *, struct lqe_glbl_data *, int);
#define qmt_seed_glbe_edquot(env, lqeg) \
- qmt_seed_glbe_all(env, lqeg, false, true)
+ qmt_seed_glbe_all(env, lqeg, false, true, false)
#define qmt_seed_glbe_qunit(env, lqeg) \
- qmt_seed_glbe_all(env, lqeg, true, false)
-#define qmt_seed_glbe(env, lqeg) \
- qmt_seed_glbe_all(env, lqeg, true, true)
+ qmt_seed_glbe_all(env, lqeg, true, false, false)
+#define qmt_seed_glbe(env, lqeg, pool_locked) \
+ qmt_seed_glbe_all(env, lqeg, true, true, pool_locked)
void qmt_seed_glbe_all(const struct lu_env *, struct lqe_glbl_data *,
- bool , bool);
+ bool, bool, bool);
/* qmt_handler.c */
int qmt_set_with_lqe(const struct lu_env *env, struct qmt_device *qmt,
mutex_lock(&lqeg->lqe_glbl_data_lock);
if (lqeg->lqe_glbl_data)
- qmt_seed_glbe(env, lqeg->lqe_glbl_data);
+ qmt_seed_glbe(env,
+ lqeg->lqe_glbl_data, true);
mutex_unlock(&lqeg->lqe_glbl_data_lock);
qmt_id_lock_notify(qmt, lqeg);
}