Lines Matching refs:qd
81 /* Lock order: qd_lock -> bucket lock -> qd->lockref.lock -> lru lock */
111 struct gfs2_quota_data *qd = container_of(rcu, struct gfs2_quota_data, qd_rcu);
112 struct gfs2_sbd *sdp = qd->qd_sbd;
114 kmem_cache_free(gfs2_quotad_cachep, qd);
119 static void gfs2_qd_dispose(struct gfs2_quota_data *qd)
121 struct gfs2_sbd *sdp = qd->qd_sbd;
124 list_del(&qd->qd_list);
127 spin_lock_bucket(qd->qd_hash);
128 hlist_bl_del_rcu(&qd->qd_hlist);
129 spin_unlock_bucket(qd->qd_hash);
132 gfs2_assert_warn(sdp, !qd->qd_change);
133 gfs2_assert_warn(sdp, !qd->qd_slot_ref);
134 gfs2_assert_warn(sdp, !qd->qd_bh_count);
137 gfs2_glock_put(qd->qd_gl);
138 call_rcu(&qd->qd_rcu, gfs2_qd_dealloc);
143 struct gfs2_quota_data *qd;
146 qd = list_first_entry(list, struct gfs2_quota_data, qd_lru);
147 list_del(&qd->qd_lru);
149 gfs2_qd_dispose(qd);
158 struct gfs2_quota_data *qd =
162 if (!spin_trylock(&qd->qd_lockref.lock))
166 if (qd->qd_lockref.count == 0) {
167 lockref_mark_dead(&qd->qd_lockref);
168 list_lru_isolate_move(lru, &qd->qd_lru, dispose);
172 spin_unlock(&qd->qd_lockref.lock);
207 static u64 qd2index(struct gfs2_quota_data *qd)
209 struct kqid qid = qd->qd_id;
214 static u64 qd2offset(struct gfs2_quota_data *qd)
216 return qd2index(qd) * sizeof(struct gfs2_quota);
221 struct gfs2_quota_data *qd;
224 qd = kmem_cache_zalloc(gfs2_quotad_cachep, GFP_NOFS);
225 if (!qd)
228 qd->qd_sbd = sdp;
229 qd->qd_lockref.count = 0;
230 spin_lock_init(&qd->qd_lockref.lock);
231 qd->qd_id = qid;
232 qd->qd_slot = -1;
233 INIT_LIST_HEAD(&qd->qd_lru);
234 qd->qd_hash = hash;
236 error = gfs2_glock_get(sdp, qd2index(qd),
237 &gfs2_quota_glops, CREATE, &qd->qd_gl);
241 return qd;
244 kmem_cache_free(gfs2_quotad_cachep, qd);
252 struct gfs2_quota_data *qd;
255 hlist_bl_for_each_entry_rcu(qd, h, &qd_hash_table[hash], qd_hlist) {
256 if (!qid_eq(qd->qd_id, qid))
258 if (qd->qd_sbd != sdp)
260 if (lockref_get_not_dead(&qd->qd_lockref)) {
261 list_lru_del(&gfs2_qd_lru, &qd->qd_lru);
262 return qd;
273 struct gfs2_quota_data *qd, *new_qd;
277 *qdp = qd = gfs2_qd_search_bucket(hash, sdp, qid);
280 if (qd)
289 *qdp = qd = gfs2_qd_search_bucket(hash, sdp, qid);
290 if (qd == NULL) {
300 if (qd) {
309 static void qd_hold(struct gfs2_quota_data *qd)
311 struct gfs2_sbd *sdp = qd->qd_sbd;
312 gfs2_assert(sdp, !__lockref_is_dead(&qd->qd_lockref));
313 lockref_get(&qd->qd_lockref);
316 static void qd_put(struct gfs2_quota_data *qd)
320 if (lockref_put_or_lock(&qd->qd_lockref))
323 BUG_ON(__lockref_is_dead(&qd->qd_lockref));
324 sdp = qd->qd_sbd;
326 lockref_mark_dead(&qd->qd_lockref);
327 spin_unlock(&qd->qd_lockref.lock);
329 gfs2_qd_dispose(qd);
333 qd->qd_lockref.count = 0;
334 list_lru_add(&gfs2_qd_lru, &qd->qd_lru);
335 spin_unlock(&qd->qd_lockref.lock);
338 static int slot_get(struct gfs2_quota_data *qd)
340 struct gfs2_sbd *sdp = qd->qd_sbd;
345 if (qd->qd_slot_ref == 0) {
353 qd->qd_slot = bit;
355 qd->qd_slot_ref++;
361 static void slot_hold(struct gfs2_quota_data *qd)
363 struct gfs2_sbd *sdp = qd->qd_sbd;
366 gfs2_assert(sdp, qd->qd_slot_ref);
367 qd->qd_slot_ref++;
371 static void slot_put(struct gfs2_quota_data *qd)
373 struct gfs2_sbd *sdp = qd->qd_sbd;
376 gfs2_assert(sdp, qd->qd_slot_ref);
377 if (!--qd->qd_slot_ref) {
378 BUG_ON(!test_and_clear_bit(qd->qd_slot, sdp->sd_quota_bitmap));
379 qd->qd_slot = -1;
384 static int bh_get(struct gfs2_quota_data *qd)
386 struct gfs2_sbd *sdp = qd->qd_sbd;
396 if (qd->qd_bh_count++) {
401 block = qd->qd_slot / sdp->sd_qc_per_block;
402 offset = qd->qd_slot % sdp->sd_qc_per_block;
421 qd->qd_bh = bh;
422 qd->qd_bh_qc = (struct gfs2_quota_change *)
433 qd->qd_bh_count--;
438 static void bh_put(struct gfs2_quota_data *qd)
440 struct gfs2_sbd *sdp = qd->qd_sbd;
443 gfs2_assert(sdp, qd->qd_bh_count);
444 if (!--qd->qd_bh_count) {
445 brelse(qd->qd_bh);
446 qd->qd_bh = NULL;
447 qd->qd_bh_qc = NULL;
452 static int qd_check_sync(struct gfs2_sbd *sdp, struct gfs2_quota_data *qd,
455 if (test_bit(QDF_LOCKED, &qd->qd_flags) ||
456 !test_bit(QDF_CHANGE, &qd->qd_flags) ||
457 (sync_gen && (qd->qd_sync_gen >= *sync_gen)))
462 * We should not sync it, but we still have a qd reference and slot
465 if (!qd->qd_change && test_and_clear_bit(QDF_CHANGE, &qd->qd_flags)) {
466 slot_put(qd);
467 qd_put(qd);
471 if (!lockref_get_not_dead(&qd->qd_lockref))
474 list_move_tail(&qd->qd_list, &sdp->sd_quota_list);
475 set_bit(QDF_LOCKED, &qd->qd_flags);
476 qd->qd_change_sync = qd->qd_change;
477 slot_hold(qd);
481 static int qd_bh_get_or_undo(struct gfs2_sbd *sdp, struct gfs2_quota_data *qd)
485 error = bh_get(qd);
489 clear_bit(QDF_LOCKED, &qd->qd_flags);
490 slot_put(qd);
491 qd_put(qd);
497 struct gfs2_quota_data *qd = NULL, *iter;
509 qd = iter;
516 if (qd) {
517 error = qd_bh_get_or_undo(sdp, qd);
520 *qdp = qd;
526 static void qdsb_put(struct gfs2_quota_data *qd)
528 bh_put(qd);
529 slot_put(qd);
530 qd_put(qd);
533 static void qd_unlock(struct gfs2_quota_data *qd)
535 gfs2_assert_warn(qd->qd_sbd, test_bit(QDF_LOCKED, &qd->qd_flags));
536 clear_bit(QDF_LOCKED, &qd->qd_flags);
537 qdsb_put(qd);
614 struct gfs2_quota_data **qd;
624 qd = ip->i_qadata->qa_qd;
633 error = qdsb_get(sdp, make_kqid_uid(ip->i_inode.i_uid), qd);
637 qd++;
639 error = qdsb_get(sdp, make_kqid_gid(ip->i_inode.i_gid), qd);
643 qd++;
647 error = qdsb_get(sdp, make_kqid_uid(uid), qd);
651 qd++;
656 error = qdsb_get(sdp, make_kqid_gid(gid), qd);
660 qd++;
700 static void do_qc(struct gfs2_quota_data *qd, s64 change, int qc_type)
702 struct gfs2_sbd *sdp = qd->qd_sbd;
704 struct gfs2_quota_change *qc = qd->qd_bh_qc;
708 gfs2_trans_add_meta(ip->i_gl, qd->qd_bh);
710 if (!test_bit(QDF_CHANGE, &qd->qd_flags)) {
713 if (qd->qd_id.type == USRQUOTA)
715 qc->qc_id = cpu_to_be32(from_kqid(&init_user_ns, qd->qd_id));
722 qd->qd_change = x;
726 if (!test_and_set_bit(QDF_CHANGE, &qd->qd_flags)) {
727 qd_hold(qd);
728 slot_hold(qd);
731 gfs2_assert_warn(sdp, test_bit(QDF_CHANGE, &qd->qd_flags));
732 clear_bit(QDF_CHANGE, &qd->qd_flags);
735 slot_put(qd);
736 qd_put(qd);
740 clear_bit(QDF_QMSG_QUIET, &qd->qd_flags);
845 * @qd: The quota data
855 s64 change, struct gfs2_quota_data *qd,
879 qd->qd_qb.qb_value = q.qu_value;
883 qd->qd_qb.qb_warn = q.qu_warn;
887 qd->qd_qb.qb_limit = q.qu_limit;
891 qd->qd_qb.qb_value = q.qu_value;
902 set_bit(QDF_REFRESH, &qd->qd_flags);
916 struct gfs2_quota_data *qd;
974 qd = qda[x];
975 offset = qd2offset(qd);
976 error = gfs2_adjust_quota(sdp, offset, qd->qd_change_sync, qd,
981 do_qc(qd, -qd->qd_change_sync, QC_SYNC);
982 set_bit(QDF_REFRESH, &qd->qd_flags);
1005 static int update_qd(struct gfs2_sbd *sdp, struct gfs2_quota_data *qd)
1014 pos = qd2offset(qd);
1019 qlvb = (struct gfs2_quota_lvb *)qd->qd_gl->gl_lksb.sb_lvbptr;
1025 qd->qd_qb = *qlvb;
1030 static int do_glock(struct gfs2_quota_data *qd, int force_refresh,
1033 struct gfs2_sbd *sdp = qd->qd_sbd;
1038 gfs2_assert_warn(sdp, sdp == qd->qd_gl->gl_name.ln_sbd);
1040 error = gfs2_glock_nq_init(qd->qd_gl, LM_ST_SHARED, 0, q_gh);
1044 if (test_and_clear_bit(QDF_REFRESH, &qd->qd_flags))
1047 qd->qd_qb = *(struct gfs2_quota_lvb *)qd->qd_gl->gl_lksb.sb_lvbptr;
1049 if (force_refresh || qd->qd_qb.qb_magic != cpu_to_be32(GFS2_MAGIC)) {
1051 error = gfs2_glock_nq_init(qd->qd_gl, LM_ST_EXCLUSIVE,
1060 error = update_qd(sdp, qd);
1082 struct gfs2_quota_data *qd;
1098 qd = ip->i_qadata->qa_qd[x];
1099 error = do_glock(qd, NO_FORCE, &ip->i_qadata->qa_qd_ghs[x]);
1115 static bool need_sync(struct gfs2_quota_data *qd)
1117 struct gfs2_sbd *sdp = qd->qd_sbd;
1122 if (!qd->qd_qb.qb_limit)
1126 value = qd->qd_change;
1136 else if ((s64)be64_to_cpu(qd->qd_qb.qb_value) >=
1137 (s64)be64_to_cpu(qd->qd_qb.qb_limit))
1142 value += (s64)be64_to_cpu(qd->qd_qb.qb_value);
1143 if (value < (s64)be64_to_cpu(qd->qd_qb.qb_limit))
1162 struct gfs2_quota_data *qd;
1165 qd = ip->i_qadata->qa_qd[x];
1166 sync = need_sync(qd);
1173 found = qd_check_sync(sdp, qd, NULL);
1179 if (!qd_bh_get_or_undo(sdp, qd))
1180 qda[count++] = qd;
1194 static int print_message(struct gfs2_quota_data *qd, char *type)
1196 struct gfs2_sbd *sdp = qd->qd_sbd;
1201 (qd->qd_id.type == USRQUOTA) ? "user" : "group",
1202 from_kqid(&init_user_ns, qd->qd_id));
1228 struct gfs2_quota_data *qd;
1238 qd = ip->i_qadata->qa_qd[x];
1240 if (!(qid_eq(qd->qd_id, make_kqid_uid(uid)) ||
1241 qid_eq(qd->qd_id, make_kqid_gid(gid))))
1244 warn = (s64)be64_to_cpu(qd->qd_qb.qb_warn);
1245 limit = (s64)be64_to_cpu(qd->qd_qb.qb_limit);
1246 value = (s64)be64_to_cpu(qd->qd_qb.qb_value);
1248 value += qd->qd_change;
1259 &qd->qd_flags)) {
1260 print_message(qd, "exceeded");
1261 quota_send_warning(qd->qd_id,
1269 time_after_eq(jiffies, qd->qd_last_warn +
1272 quota_send_warning(qd->qd_id,
1274 error = print_message(qd, "warning");
1275 qd->qd_last_warn = jiffies;
1284 struct gfs2_quota_data *qd;
1299 qd = ip->i_qadata->qa_qd[x];
1301 if (qid_eq(qd->qd_id, make_kqid_uid(uid)) ||
1302 qid_eq(qd->qd_id, make_kqid_gid(gid))) {
1303 do_qc(qd, change, QC_CHANGE);
1310 struct gfs2_quota_data *qd;
1314 list_for_each_entry(qd, &sdp->sd_quota_list, qd_list) {
1315 if (test_bit(QDF_LOCKED, &qd->qd_flags) ||
1316 !test_bit(QDF_CHANGE, &qd->qd_flags))
1373 struct gfs2_quota_data *qd;
1377 error = qd_get(sdp, qid, &qd);
1381 error = do_glock(qd, FORCE, &q_gh);
1385 qd_put(qd);
1439 struct gfs2_quota_data *qd;
1451 qd = qd_alloc(hash, sdp, qc_id);
1452 if (qd == NULL) {
1457 set_bit(QDF_CHANGE, &qd->qd_flags);
1458 qd->qd_change = qc_change;
1459 qd->qd_slot = slot;
1460 qd->qd_slot_ref = 1;
1464 list_add(&qd->qd_list, &sdp->sd_quota_list);
1469 hlist_bl_add_head_rcu(&qd->qd_hlist, &qd_hash_table[hash]);
1492 struct gfs2_quota_data *qd;
1500 list_for_each_entry(qd, &sdp->sd_quota_list, qd_list) {
1501 spin_lock(&qd->qd_lockref.lock);
1502 if (qd->qd_lockref.count != 0) {
1503 spin_unlock(&qd->qd_lockref.lock);
1506 lockref_mark_dead(&qd->qd_lockref);
1507 spin_unlock(&qd->qd_lockref.lock);
1509 list_lru_del(&gfs2_qd_lru, &qd->qd_lru);
1510 list_add(&qd->qd_lru, &dispose);
1648 struct gfs2_quota_data *qd;
1661 error = qd_get(sdp, qid, &qd);
1664 error = do_glock(qd, FORCE, &q_gh);
1668 qlvb = (struct gfs2_quota_lvb *)qd->qd_gl->gl_lksb.sb_lvbptr;
1675 qd_put(qd);
1687 struct gfs2_quota_data *qd;
1705 error = qd_get(sdp, qid, &qd);
1714 error = gfs2_glock_nq_init(qd->qd_gl, LM_ST_EXCLUSIVE, 0, &q_gh);
1722 error = update_qd(sdp, qd);
1728 ((fdq->d_spc_softlimit >> sdp->sd_sb.sb_bsize_shift) == be64_to_cpu(qd->qd_qb.qb_warn)))
1732 ((fdq->d_spc_hardlimit >> sdp->sd_sb.sb_bsize_shift) == be64_to_cpu(qd->qd_qb.qb_limit)))
1736 ((fdq->d_space >> sdp->sd_sb.sb_bsize_shift) == be64_to_cpu(qd->qd_qb.qb_value)))
1742 offset = qd2offset(qd);
1765 error = gfs2_adjust_quota(sdp, offset, 0, qd, fdq);
1767 clear_bit(QDF_QMSG_QUIET, &qd->qd_flags);
1781 qd_put(qd);