Lines Matching refs:qd

78 /* Lock order: qd_lock -> bucket lock -> qd->lockref.lock -> lru lock */
108 struct gfs2_quota_data *qd = container_of(rcu, struct gfs2_quota_data, qd_rcu);
109 kmem_cache_free(gfs2_quotad_cachep, qd);
114 struct gfs2_quota_data *qd;
118 qd = list_first_entry(list, struct gfs2_quota_data, qd_lru);
119 sdp = qd->qd_gl->gl_name.ln_sbd;
121 list_del(&qd->qd_lru);
125 list_del(&qd->qd_list);
128 spin_lock_bucket(qd->qd_hash);
129 hlist_bl_del_rcu(&qd->qd_hlist);
130 spin_unlock_bucket(qd->qd_hash);
132 gfs2_assert_warn(sdp, !qd->qd_change);
133 gfs2_assert_warn(sdp, !qd->qd_slot_count);
134 gfs2_assert_warn(sdp, !qd->qd_bh_count);
136 gfs2_glock_put(qd->qd_gl);
140 call_rcu(&qd->qd_rcu, gfs2_qd_dealloc);
149 struct gfs2_quota_data *qd = list_entry(item, struct gfs2_quota_data, qd_lru);
151 if (!spin_trylock(&qd->qd_lockref.lock))
154 if (qd->qd_lockref.count == 0) {
155 lockref_mark_dead(&qd->qd_lockref);
156 list_lru_isolate_move(lru, &qd->qd_lru, dispose);
159 spin_unlock(&qd->qd_lockref.lock);
194 static u64 qd2index(struct gfs2_quota_data *qd)
196 struct kqid qid = qd->qd_id;
201 static u64 qd2offset(struct gfs2_quota_data *qd)
205 offset = qd2index(qd);
213 struct gfs2_quota_data *qd;
216 qd = kmem_cache_zalloc(gfs2_quotad_cachep, GFP_NOFS);
217 if (!qd)
220 qd->qd_sbd = sdp;
221 qd->qd_lockref.count = 1;
222 spin_lock_init(&qd->qd_lockref.lock);
223 qd->qd_id = qid;
224 qd->qd_slot = -1;
225 INIT_LIST_HEAD(&qd->qd_lru);
226 qd->qd_hash = hash;
228 error = gfs2_glock_get(sdp, qd2index(qd),
229 &gfs2_quota_glops, CREATE, &qd->qd_gl);
233 return qd;
236 kmem_cache_free(gfs2_quotad_cachep, qd);
244 struct gfs2_quota_data *qd;
247 hlist_bl_for_each_entry_rcu(qd, h, &qd_hash_table[hash], qd_hlist) {
248 if (!qid_eq(qd->qd_id, qid))
250 if (qd->qd_sbd != sdp)
252 if (lockref_get_not_dead(&qd->qd_lockref)) {
253 list_lru_del(&gfs2_qd_lru, &qd->qd_lru);
254 return qd;
265 struct gfs2_quota_data *qd, *new_qd;
269 *qdp = qd = gfs2_qd_search_bucket(hash, sdp, qid);
272 if (qd)
281 *qdp = qd = gfs2_qd_search_bucket(hash, sdp, qid);
282 if (qd == NULL) {
291 if (qd) {
300 static void qd_hold(struct gfs2_quota_data *qd)
302 struct gfs2_sbd *sdp = qd->qd_gl->gl_name.ln_sbd;
303 gfs2_assert(sdp, !__lockref_is_dead(&qd->qd_lockref));
304 lockref_get(&qd->qd_lockref);
307 static void qd_put(struct gfs2_quota_data *qd)
309 if (lockref_put_or_lock(&qd->qd_lockref))
312 qd->qd_lockref.count = 0;
313 list_lru_add(&gfs2_qd_lru, &qd->qd_lru);
314 spin_unlock(&qd->qd_lockref.lock);
318 static int slot_get(struct gfs2_quota_data *qd)
320 struct gfs2_sbd *sdp = qd->qd_sbd;
325 if (qd->qd_slot_count != 0)
332 qd->qd_slot = bit;
335 qd->qd_slot_count++;
342 static void slot_hold(struct gfs2_quota_data *qd)
344 struct gfs2_sbd *sdp = qd->qd_sbd;
347 gfs2_assert(sdp, qd->qd_slot_count);
348 qd->qd_slot_count++;
352 static void slot_put(struct gfs2_quota_data *qd)
354 struct gfs2_sbd *sdp = qd->qd_sbd;
357 gfs2_assert(sdp, qd->qd_slot_count);
358 if (!--qd->qd_slot_count) {
359 BUG_ON(!test_and_clear_bit(qd->qd_slot, sdp->sd_quota_bitmap));
360 qd->qd_slot = -1;
365 static int bh_get(struct gfs2_quota_data *qd)
367 struct gfs2_sbd *sdp = qd->qd_gl->gl_name.ln_sbd;
376 if (qd->qd_bh_count++) {
381 block = qd->qd_slot / sdp->sd_qc_per_block;
382 offset = qd->qd_slot % sdp->sd_qc_per_block;
395 qd->qd_bh = bh;
396 qd->qd_bh_qc = (struct gfs2_quota_change *)
407 qd->qd_bh_count--;
412 static void bh_put(struct gfs2_quota_data *qd)
414 struct gfs2_sbd *sdp = qd->qd_gl->gl_name.ln_sbd;
417 gfs2_assert(sdp, qd->qd_bh_count);
418 if (!--qd->qd_bh_count) {
419 brelse(qd->qd_bh);
420 qd->qd_bh = NULL;
421 qd->qd_bh_qc = NULL;
426 static int qd_check_sync(struct gfs2_sbd *sdp, struct gfs2_quota_data *qd,
429 if (test_bit(QDF_LOCKED, &qd->qd_flags) ||
430 !test_bit(QDF_CHANGE, &qd->qd_flags) ||
431 (sync_gen && (qd->qd_sync_gen >= *sync_gen)))
436 * We should not sync it, but we still have a qd reference and slot
439 if (!qd->qd_change && test_and_clear_bit(QDF_CHANGE, &qd->qd_flags)) {
440 slot_put(qd);
441 qd_put(qd);
445 if (!lockref_get_not_dead(&qd->qd_lockref))
448 list_move_tail(&qd->qd_list, &sdp->sd_quota_list);
449 set_bit(QDF_LOCKED, &qd->qd_flags);
450 qd->qd_change_sync = qd->qd_change;
451 slot_hold(qd);
457 struct gfs2_quota_data *qd = NULL;
468 list_for_each_entry(qd, &sdp->sd_quota_list, qd_list) {
469 found = qd_check_sync(sdp, qd, &sdp->sd_quota_sync_gen);
475 qd = NULL;
479 if (qd) {
480 gfs2_assert_warn(sdp, qd->qd_change_sync);
481 error = bh_get(qd);
483 clear_bit(QDF_LOCKED, &qd->qd_flags);
484 slot_put(qd);
485 qd_put(qd);
490 *qdp = qd;
495 static void qd_unlock(struct gfs2_quota_data *qd)
497 gfs2_assert_warn(qd->qd_gl->gl_name.ln_sbd,
498 test_bit(QDF_LOCKED, &qd->qd_flags));
499 clear_bit(QDF_LOCKED, &qd->qd_flags);
500 bh_put(qd);
501 slot_put(qd);
502 qd_put(qd);
531 static void qdsb_put(struct gfs2_quota_data *qd)
533 bh_put(qd);
534 slot_put(qd);
535 qd_put(qd);
586 struct gfs2_quota_data **qd;
596 qd = ip->i_qadata->qa_qd;
604 error = qdsb_get(sdp, make_kqid_uid(ip->i_inode.i_uid), qd);
608 qd++;
610 error = qdsb_get(sdp, make_kqid_gid(ip->i_inode.i_gid), qd);
614 qd++;
618 error = qdsb_get(sdp, make_kqid_uid(uid), qd);
622 qd++;
627 error = qdsb_get(sdp, make_kqid_gid(gid), qd);
631 qd++;
671 static void do_qc(struct gfs2_quota_data *qd, s64 change)
673 struct gfs2_sbd *sdp = qd->qd_gl->gl_name.ln_sbd;
675 struct gfs2_quota_change *qc = qd->qd_bh_qc;
679 gfs2_trans_add_meta(ip->i_gl, qd->qd_bh);
681 if (!test_bit(QDF_CHANGE, &qd->qd_flags)) {
684 if (qd->qd_id.type == USRQUOTA)
686 qc->qc_id = cpu_to_be32(from_kqid(&init_user_ns, qd->qd_id));
693 qd->qd_change = x;
697 gfs2_assert_warn(sdp, test_bit(QDF_CHANGE, &qd->qd_flags));
698 clear_bit(QDF_CHANGE, &qd->qd_flags);
701 slot_put(qd);
702 qd_put(qd);
703 } else if (!test_and_set_bit(QDF_CHANGE, &qd->qd_flags)) {
704 qd_hold(qd);
705 slot_hold(qd);
709 clear_bit(QDF_QMSG_QUIET, &qd->qd_flags);
827 * @qd: The quota data
837 s64 change, struct gfs2_quota_data *qd,
862 qd->qd_qb.qb_value = q.qu_value;
866 qd->qd_qb.qb_warn = q.qu_warn;
870 qd->qd_qb.qb_limit = q.qu_limit;
874 qd->qd_qb.qb_value = q.qu_value;
885 set_bit(QDF_REFRESH, &qd->qd_flags);
899 struct gfs2_quota_data *qd;
963 qd = qda[x];
964 offset = qd2offset(qd);
965 error = gfs2_adjust_quota(ip, offset, qd->qd_change_sync, qd, NULL);
969 do_qc(qd, -qd->qd_change_sync);
970 set_bit(QDF_REFRESH, &qd->qd_flags);
993 static int update_qd(struct gfs2_sbd *sdp, struct gfs2_quota_data *qd)
1002 pos = qd2offset(qd);
1007 qlvb = (struct gfs2_quota_lvb *)qd->qd_gl->gl_lksb.sb_lvbptr;
1013 qd->qd_qb = *qlvb;
1018 static int do_glock(struct gfs2_quota_data *qd, int force_refresh,
1021 struct gfs2_sbd *sdp = qd->qd_gl->gl_name.ln_sbd;
1027 error = gfs2_glock_nq_init(qd->qd_gl, LM_ST_SHARED, 0, q_gh);
1031 if (test_and_clear_bit(QDF_REFRESH, &qd->qd_flags))
1034 qd->qd_qb = *(struct gfs2_quota_lvb *)qd->qd_gl->gl_lksb.sb_lvbptr;
1036 if (force_refresh || qd->qd_qb.qb_magic != cpu_to_be32(GFS2_MAGIC)) {
1038 error = gfs2_glock_nq_init(qd->qd_gl, LM_ST_EXCLUSIVE,
1047 error = update_qd(sdp, qd);
1069 struct gfs2_quota_data *qd;
1084 qd = ip->i_qadata->qa_qd[x];
1085 error = do_glock(qd, NO_FORCE, &ip->i_qadata->qa_qd_ghs[x]);
1101 static int need_sync(struct gfs2_quota_data *qd)
1103 struct gfs2_sbd *sdp = qd->qd_gl->gl_name.ln_sbd;
1109 if (!qd->qd_qb.qb_limit)
1113 value = qd->qd_change;
1123 else if ((s64)be64_to_cpu(qd->qd_qb.qb_value) >=
1124 (s64)be64_to_cpu(qd->qd_qb.qb_limit))
1129 value += (s64)be64_to_cpu(qd->qd_qb.qb_value);
1130 if (value < (s64)be64_to_cpu(qd->qd_qb.qb_limit))
1149 struct gfs2_quota_data *qd;
1152 qd = ip->i_qadata->qa_qd[x];
1153 sync = need_sync(qd);
1160 found = qd_check_sync(sdp, qd, NULL);
1166 gfs2_assert_warn(sdp, qd->qd_change_sync);
1167 if (bh_get(qd)) {
1168 clear_bit(QDF_LOCKED, &qd->qd_flags);
1169 slot_put(qd);
1170 qd_put(qd);
1174 qda[count++] = qd;
1188 static int print_message(struct gfs2_quota_data *qd, char *type)
1190 struct gfs2_sbd *sdp = qd->qd_gl->gl_name.ln_sbd;
1194 (qd->qd_id.type == USRQUOTA) ? "user" : "group",
1195 from_kqid(&init_user_ns, qd->qd_id));
1221 struct gfs2_quota_data *qd;
1231 qd = ip->i_qadata->qa_qd[x];
1233 if (!(qid_eq(qd->qd_id, make_kqid_uid(uid)) ||
1234 qid_eq(qd->qd_id, make_kqid_gid(gid))))
1237 warn = (s64)be64_to_cpu(qd->qd_qb.qb_warn);
1238 limit = (s64)be64_to_cpu(qd->qd_qb.qb_limit);
1239 value = (s64)be64_to_cpu(qd->qd_qb.qb_value);
1241 value += qd->qd_change;
1252 &qd->qd_flags)) {
1253 print_message(qd, "exceeded");
1254 quota_send_warning(qd->qd_id,
1262 time_after_eq(jiffies, qd->qd_last_warn +
1265 quota_send_warning(qd->qd_id,
1267 error = print_message(qd, "warning");
1268 qd->qd_last_warn = jiffies;
1277 struct gfs2_quota_data *qd;
1291 qd = ip->i_qadata->qa_qd[x];
1293 if (qid_eq(qd->qd_id, make_kqid_uid(uid)) ||
1294 qid_eq(qd->qd_id, make_kqid_gid(gid))) {
1295 do_qc(qd, change);
1348 struct gfs2_quota_data *qd;
1352 error = qd_get(sdp, qid, &qd);
1356 error = do_glock(qd, FORCE, &q_gh);
1360 qd_put(qd);
1414 struct gfs2_quota_data *qd;
1426 qd = qd_alloc(hash, sdp, qc_id);
1427 if (qd == NULL) {
1432 set_bit(QDF_CHANGE, &qd->qd_flags);
1433 qd->qd_change = qc_change;
1434 qd->qd_slot = slot;
1435 qd->qd_slot_count = 1;
1439 list_add(&qd->qd_list, &sdp->sd_quota_list);
1444 hlist_bl_add_head_rcu(&qd->qd_hlist, &qd_hash_table[hash]);
1468 struct gfs2_quota_data *qd;
1472 qd = list_last_entry(head, struct gfs2_quota_data, qd_list);
1474 list_del(&qd->qd_list);
1476 /* Also remove if this qd exists in the reclaim list */
1477 list_lru_del(&gfs2_qd_lru, &qd->qd_lru);
1481 spin_lock_bucket(qd->qd_hash);
1482 hlist_bl_del_rcu(&qd->qd_hlist);
1483 spin_unlock_bucket(qd->qd_hash);
1485 gfs2_assert_warn(sdp, !qd->qd_change);
1486 gfs2_assert_warn(sdp, !qd->qd_slot_count);
1487 gfs2_assert_warn(sdp, !qd->qd_bh_count);
1489 gfs2_glock_put(qd->qd_gl);
1490 call_rcu(&qd->qd_rcu, gfs2_qd_dealloc);
1647 struct gfs2_quota_data *qd;
1660 error = qd_get(sdp, qid, &qd);
1663 error = do_glock(qd, FORCE, &q_gh);
1667 qlvb = (struct gfs2_quota_lvb *)qd->qd_gl->gl_lksb.sb_lvbptr;
1674 qd_put(qd);
1686 struct gfs2_quota_data *qd;
1704 error = qd_get(sdp, qid, &qd);
1713 error = gfs2_glock_nq_init(qd->qd_gl, LM_ST_EXCLUSIVE, 0, &q_gh);
1721 error = update_qd(sdp, qd);
1727 ((fdq->d_spc_softlimit >> sdp->sd_sb.sb_bsize_shift) == be64_to_cpu(qd->qd_qb.qb_warn)))
1731 ((fdq->d_spc_hardlimit >> sdp->sd_sb.sb_bsize_shift) == be64_to_cpu(qd->qd_qb.qb_limit)))
1735 ((fdq->d_space >> sdp->sd_sb.sb_bsize_shift) == be64_to_cpu(qd->qd_qb.qb_value)))
1741 offset = qd2offset(qd);
1764 error = gfs2_adjust_quota(ip, offset, 0, qd, fdq);
1766 clear_bit(QDF_QMSG_QUIET, &qd->qd_flags);
1780 qd_put(qd);