Lines Matching refs:qd
111 struct gfs2_quota_data *qd = container_of(rcu, struct gfs2_quota_data, qd_rcu); in gfs2_qd_dealloc() local
112 kmem_cache_free(gfs2_quotad_cachep, qd); in gfs2_qd_dealloc()
117 struct gfs2_quota_data *qd; in gfs2_qd_dispose() local
121 qd = list_entry(list->next, struct gfs2_quota_data, qd_lru); in gfs2_qd_dispose()
122 sdp = qd->qd_gl->gl_name.ln_sbd; in gfs2_qd_dispose()
124 list_del(&qd->qd_lru); in gfs2_qd_dispose()
128 list_del(&qd->qd_list); in gfs2_qd_dispose()
131 spin_lock_bucket(qd->qd_hash); in gfs2_qd_dispose()
132 hlist_bl_del_rcu(&qd->qd_hlist); in gfs2_qd_dispose()
133 spin_unlock_bucket(qd->qd_hash); in gfs2_qd_dispose()
135 gfs2_assert_warn(sdp, !qd->qd_change); in gfs2_qd_dispose()
136 gfs2_assert_warn(sdp, !qd->qd_slot_count); in gfs2_qd_dispose()
137 gfs2_assert_warn(sdp, !qd->qd_bh_count); in gfs2_qd_dispose()
139 gfs2_glock_put(qd->qd_gl); in gfs2_qd_dispose()
143 call_rcu(&qd->qd_rcu, gfs2_qd_dealloc); in gfs2_qd_dispose()
152 struct gfs2_quota_data *qd = list_entry(item, struct gfs2_quota_data, qd_lru); in gfs2_qd_isolate() local
154 if (!spin_trylock(&qd->qd_lockref.lock)) in gfs2_qd_isolate()
157 if (qd->qd_lockref.count == 0) { in gfs2_qd_isolate()
158 lockref_mark_dead(&qd->qd_lockref); in gfs2_qd_isolate()
159 list_lru_isolate_move(lru, &qd->qd_lru, dispose); in gfs2_qd_isolate()
162 spin_unlock(&qd->qd_lockref.lock); in gfs2_qd_isolate()
197 static u64 qd2index(struct gfs2_quota_data *qd) in qd2index() argument
199 struct kqid qid = qd->qd_id; in qd2index()
204 static u64 qd2offset(struct gfs2_quota_data *qd) in qd2offset() argument
208 offset = qd2index(qd); in qd2offset()
216 struct gfs2_quota_data *qd; in qd_alloc() local
219 qd = kmem_cache_zalloc(gfs2_quotad_cachep, GFP_NOFS); in qd_alloc()
220 if (!qd) in qd_alloc()
223 qd->qd_sbd = sdp; in qd_alloc()
224 qd->qd_lockref.count = 1; in qd_alloc()
225 spin_lock_init(&qd->qd_lockref.lock); in qd_alloc()
226 qd->qd_id = qid; in qd_alloc()
227 qd->qd_slot = -1; in qd_alloc()
228 INIT_LIST_HEAD(&qd->qd_lru); in qd_alloc()
229 qd->qd_hash = hash; in qd_alloc()
231 error = gfs2_glock_get(sdp, qd2index(qd), in qd_alloc()
232 &gfs2_quota_glops, CREATE, &qd->qd_gl); in qd_alloc()
236 return qd; in qd_alloc()
239 kmem_cache_free(gfs2_quotad_cachep, qd); in qd_alloc()
247 struct gfs2_quota_data *qd; in gfs2_qd_search_bucket() local
250 hlist_bl_for_each_entry_rcu(qd, h, &qd_hash_table[hash], qd_hlist) { in gfs2_qd_search_bucket()
251 if (!qid_eq(qd->qd_id, qid)) in gfs2_qd_search_bucket()
253 if (qd->qd_sbd != sdp) in gfs2_qd_search_bucket()
255 if (lockref_get_not_dead(&qd->qd_lockref)) { in gfs2_qd_search_bucket()
256 list_lru_del(&gfs2_qd_lru, &qd->qd_lru); in gfs2_qd_search_bucket()
257 return qd; in gfs2_qd_search_bucket()
268 struct gfs2_quota_data *qd, *new_qd; in qd_get() local
272 *qdp = qd = gfs2_qd_search_bucket(hash, sdp, qid); in qd_get()
275 if (qd) in qd_get()
284 *qdp = qd = gfs2_qd_search_bucket(hash, sdp, qid); in qd_get()
285 if (qd == NULL) { in qd_get()
294 if (qd) { in qd_get()
303 static void qd_hold(struct gfs2_quota_data *qd) in qd_hold() argument
305 struct gfs2_sbd *sdp = qd->qd_gl->gl_name.ln_sbd; in qd_hold()
306 gfs2_assert(sdp, !__lockref_is_dead(&qd->qd_lockref)); in qd_hold()
307 lockref_get(&qd->qd_lockref); in qd_hold()
310 static void qd_put(struct gfs2_quota_data *qd) in qd_put() argument
312 if (lockref_put_or_lock(&qd->qd_lockref)) in qd_put()
315 qd->qd_lockref.count = 0; in qd_put()
316 list_lru_add(&gfs2_qd_lru, &qd->qd_lru); in qd_put()
317 spin_unlock(&qd->qd_lockref.lock); in qd_put()
321 static int slot_get(struct gfs2_quota_data *qd) in slot_get() argument
323 struct gfs2_sbd *sdp = qd->qd_sbd; in slot_get()
328 if (qd->qd_slot_count != 0) in slot_get()
335 qd->qd_slot = bit; in slot_get()
338 qd->qd_slot_count++; in slot_get()
345 static void slot_hold(struct gfs2_quota_data *qd) in slot_hold() argument
347 struct gfs2_sbd *sdp = qd->qd_sbd; in slot_hold()
350 gfs2_assert(sdp, qd->qd_slot_count); in slot_hold()
351 qd->qd_slot_count++; in slot_hold()
355 static void slot_put(struct gfs2_quota_data *qd) in slot_put() argument
357 struct gfs2_sbd *sdp = qd->qd_sbd; in slot_put()
360 gfs2_assert(sdp, qd->qd_slot_count); in slot_put()
361 if (!--qd->qd_slot_count) { in slot_put()
362 BUG_ON(!test_and_clear_bit(qd->qd_slot, sdp->sd_quota_bitmap)); in slot_put()
363 qd->qd_slot = -1; in slot_put()
368 static int bh_get(struct gfs2_quota_data *qd) in bh_get() argument
370 struct gfs2_sbd *sdp = qd->qd_gl->gl_name.ln_sbd; in bh_get()
379 if (qd->qd_bh_count++) { in bh_get()
384 block = qd->qd_slot / sdp->sd_qc_per_block; in bh_get()
385 offset = qd->qd_slot % sdp->sd_qc_per_block; in bh_get()
398 qd->qd_bh = bh; in bh_get()
399 qd->qd_bh_qc = (struct gfs2_quota_change *) in bh_get()
410 qd->qd_bh_count--; in bh_get()
415 static void bh_put(struct gfs2_quota_data *qd) in bh_put() argument
417 struct gfs2_sbd *sdp = qd->qd_gl->gl_name.ln_sbd; in bh_put()
420 gfs2_assert(sdp, qd->qd_bh_count); in bh_put()
421 if (!--qd->qd_bh_count) { in bh_put()
422 brelse(qd->qd_bh); in bh_put()
423 qd->qd_bh = NULL; in bh_put()
424 qd->qd_bh_qc = NULL; in bh_put()
429 static int qd_check_sync(struct gfs2_sbd *sdp, struct gfs2_quota_data *qd, in qd_check_sync() argument
432 if (test_bit(QDF_LOCKED, &qd->qd_flags) || in qd_check_sync()
433 !test_bit(QDF_CHANGE, &qd->qd_flags) || in qd_check_sync()
434 (sync_gen && (qd->qd_sync_gen >= *sync_gen))) in qd_check_sync()
437 if (!lockref_get_not_dead(&qd->qd_lockref)) in qd_check_sync()
440 list_move_tail(&qd->qd_list, &sdp->sd_quota_list); in qd_check_sync()
441 set_bit(QDF_LOCKED, &qd->qd_flags); in qd_check_sync()
442 qd->qd_change_sync = qd->qd_change; in qd_check_sync()
443 slot_hold(qd); in qd_check_sync()
449 struct gfs2_quota_data *qd = NULL; in qd_fish() local
460 list_for_each_entry(qd, &sdp->sd_quota_list, qd_list) { in qd_fish()
461 found = qd_check_sync(sdp, qd, &sdp->sd_quota_sync_gen); in qd_fish()
467 qd = NULL; in qd_fish()
471 if (qd) { in qd_fish()
472 gfs2_assert_warn(sdp, qd->qd_change_sync); in qd_fish()
473 error = bh_get(qd); in qd_fish()
475 clear_bit(QDF_LOCKED, &qd->qd_flags); in qd_fish()
476 slot_put(qd); in qd_fish()
477 qd_put(qd); in qd_fish()
482 *qdp = qd; in qd_fish()
487 static void qd_unlock(struct gfs2_quota_data *qd) in qd_unlock() argument
489 gfs2_assert_warn(qd->qd_gl->gl_name.ln_sbd, in qd_unlock()
490 test_bit(QDF_LOCKED, &qd->qd_flags)); in qd_unlock()
491 clear_bit(QDF_LOCKED, &qd->qd_flags); in qd_unlock()
492 bh_put(qd); in qd_unlock()
493 slot_put(qd); in qd_unlock()
494 qd_put(qd); in qd_unlock()
523 static void qdsb_put(struct gfs2_quota_data *qd) in qdsb_put() argument
525 bh_put(qd); in qdsb_put()
526 slot_put(qd); in qdsb_put()
527 qd_put(qd); in qdsb_put()
533 struct gfs2_quota_data **qd; in gfs2_quota_hold() local
542 qd = ip->i_res->rs_qa_qd; in gfs2_quota_hold()
551 error = qdsb_get(sdp, make_kqid_uid(ip->i_inode.i_uid), qd); in gfs2_quota_hold()
555 qd++; in gfs2_quota_hold()
557 error = qdsb_get(sdp, make_kqid_gid(ip->i_inode.i_gid), qd); in gfs2_quota_hold()
561 qd++; in gfs2_quota_hold()
565 error = qdsb_get(sdp, make_kqid_uid(uid), qd); in gfs2_quota_hold()
569 qd++; in gfs2_quota_hold()
574 error = qdsb_get(sdp, make_kqid_gid(gid), qd); in gfs2_quota_hold()
578 qd++; in gfs2_quota_hold()
615 static void do_qc(struct gfs2_quota_data *qd, s64 change) in do_qc() argument
617 struct gfs2_sbd *sdp = qd->qd_gl->gl_name.ln_sbd; in do_qc()
619 struct gfs2_quota_change *qc = qd->qd_bh_qc; in do_qc()
623 gfs2_trans_add_meta(ip->i_gl, qd->qd_bh); in do_qc()
625 if (!test_bit(QDF_CHANGE, &qd->qd_flags)) { in do_qc()
628 if (qd->qd_id.type == USRQUOTA) in do_qc()
630 qc->qc_id = cpu_to_be32(from_kqid(&init_user_ns, qd->qd_id)); in do_qc()
637 qd->qd_change = x; in do_qc()
641 gfs2_assert_warn(sdp, test_bit(QDF_CHANGE, &qd->qd_flags)); in do_qc()
642 clear_bit(QDF_CHANGE, &qd->qd_flags); in do_qc()
645 slot_put(qd); in do_qc()
646 qd_put(qd); in do_qc()
647 } else if (!test_and_set_bit(QDF_CHANGE, &qd->qd_flags)) { in do_qc()
648 qd_hold(qd); in do_qc()
649 slot_hold(qd); in do_qc()
653 clear_bit(QDF_QMSG_QUIET, &qd->qd_flags); in do_qc()
778 s64 change, struct gfs2_quota_data *qd, in gfs2_adjust_quota() argument
803 qd->qd_qb.qb_value = q.qu_value; in gfs2_adjust_quota()
807 qd->qd_qb.qb_warn = q.qu_warn; in gfs2_adjust_quota()
811 qd->qd_qb.qb_limit = q.qu_limit; in gfs2_adjust_quota()
815 qd->qd_qb.qb_value = q.qu_value; in gfs2_adjust_quota()
826 set_bit(QDF_REFRESH, &qd->qd_flags); in gfs2_adjust_quota()
840 struct gfs2_quota_data *qd; in do_sync() local
902 qd = qda[x]; in do_sync()
903 offset = qd2offset(qd); in do_sync()
904 error = gfs2_adjust_quota(ip, offset, qd->qd_change_sync, qd, NULL); in do_sync()
908 do_qc(qd, -qd->qd_change_sync); in do_sync()
909 set_bit(QDF_REFRESH, &qd->qd_flags); in do_sync()
929 static int update_qd(struct gfs2_sbd *sdp, struct gfs2_quota_data *qd) in update_qd() argument
938 pos = qd2offset(qd); in update_qd()
943 qlvb = (struct gfs2_quota_lvb *)qd->qd_gl->gl_lksb.sb_lvbptr; in update_qd()
949 qd->qd_qb = *qlvb; in update_qd()
954 static int do_glock(struct gfs2_quota_data *qd, int force_refresh, in do_glock() argument
957 struct gfs2_sbd *sdp = qd->qd_gl->gl_name.ln_sbd; in do_glock()
963 error = gfs2_glock_nq_init(qd->qd_gl, LM_ST_SHARED, 0, q_gh); in do_glock()
967 if (test_and_clear_bit(QDF_REFRESH, &qd->qd_flags)) in do_glock()
970 qd->qd_qb = *(struct gfs2_quota_lvb *)qd->qd_gl->gl_lksb.sb_lvbptr; in do_glock()
972 if (force_refresh || qd->qd_qb.qb_magic != cpu_to_be32(GFS2_MAGIC)) { in do_glock()
974 error = gfs2_glock_nq_init(qd->qd_gl, LM_ST_EXCLUSIVE, in do_glock()
983 error = update_qd(sdp, qd); in do_glock()
1005 struct gfs2_quota_data *qd; in gfs2_quota_lock() local
1021 qd = ip->i_res->rs_qa_qd[x]; in gfs2_quota_lock()
1022 error = do_glock(qd, NO_FORCE, &ip->i_res->rs_qa_qd_ghs[x]); in gfs2_quota_lock()
1038 static int need_sync(struct gfs2_quota_data *qd) in need_sync() argument
1040 struct gfs2_sbd *sdp = qd->qd_gl->gl_name.ln_sbd; in need_sync()
1046 if (!qd->qd_qb.qb_limit) in need_sync()
1050 value = qd->qd_change; in need_sync()
1060 else if ((s64)be64_to_cpu(qd->qd_qb.qb_value) >= in need_sync()
1061 (s64)be64_to_cpu(qd->qd_qb.qb_limit)) in need_sync()
1066 value += (s64)be64_to_cpu(qd->qd_qb.qb_value); in need_sync()
1067 if (value < (s64)be64_to_cpu(qd->qd_qb.qb_limit)) in need_sync()
1086 struct gfs2_quota_data *qd; in gfs2_quota_unlock() local
1089 qd = ip->i_res->rs_qa_qd[x]; in gfs2_quota_unlock()
1090 sync = need_sync(qd); in gfs2_quota_unlock()
1097 found = qd_check_sync(sdp, qd, NULL); in gfs2_quota_unlock()
1103 gfs2_assert_warn(sdp, qd->qd_change_sync); in gfs2_quota_unlock()
1104 if (bh_get(qd)) { in gfs2_quota_unlock()
1105 clear_bit(QDF_LOCKED, &qd->qd_flags); in gfs2_quota_unlock()
1106 slot_put(qd); in gfs2_quota_unlock()
1107 qd_put(qd); in gfs2_quota_unlock()
1111 qda[count++] = qd; in gfs2_quota_unlock()
1126 static int print_message(struct gfs2_quota_data *qd, char *type) in print_message() argument
1128 struct gfs2_sbd *sdp = qd->qd_gl->gl_name.ln_sbd; in print_message()
1132 (qd->qd_id.type == USRQUOTA) ? "user" : "group", in print_message()
1133 from_kqid(&init_user_ns, qd->qd_id)); in print_message()
1159 struct gfs2_quota_data *qd; in gfs2_quota_check() local
1172 qd = ip->i_res->rs_qa_qd[x]; in gfs2_quota_check()
1174 if (!(qid_eq(qd->qd_id, make_kqid_uid(uid)) || in gfs2_quota_check()
1175 qid_eq(qd->qd_id, make_kqid_gid(gid)))) in gfs2_quota_check()
1178 warn = (s64)be64_to_cpu(qd->qd_qb.qb_warn); in gfs2_quota_check()
1179 limit = (s64)be64_to_cpu(qd->qd_qb.qb_limit); in gfs2_quota_check()
1180 value = (s64)be64_to_cpu(qd->qd_qb.qb_value); in gfs2_quota_check()
1182 value += qd->qd_change; in gfs2_quota_check()
1193 &qd->qd_flags)) { in gfs2_quota_check()
1194 print_message(qd, "exceeded"); in gfs2_quota_check()
1195 quota_send_warning(qd->qd_id, in gfs2_quota_check()
1203 time_after_eq(jiffies, qd->qd_last_warn + in gfs2_quota_check()
1206 quota_send_warning(qd->qd_id, in gfs2_quota_check()
1208 error = print_message(qd, "warning"); in gfs2_quota_check()
1209 qd->qd_last_warn = jiffies; in gfs2_quota_check()
1218 struct gfs2_quota_data *qd; in gfs2_quota_change() local
1227 qd = ip->i_res->rs_qa_qd[x]; in gfs2_quota_change()
1229 if (qid_eq(qd->qd_id, make_kqid_uid(uid)) || in gfs2_quota_change()
1230 qid_eq(qd->qd_id, make_kqid_gid(gid))) { in gfs2_quota_change()
1231 do_qc(qd, change); in gfs2_quota_change()
1284 struct gfs2_quota_data *qd; in gfs2_quota_refresh() local
1288 error = qd_get(sdp, qid, &qd); in gfs2_quota_refresh()
1292 error = do_glock(qd, FORCE, &q_gh); in gfs2_quota_refresh()
1296 qd_put(qd); in gfs2_quota_refresh()
1350 struct gfs2_quota_data *qd; in gfs2_quota_init() local
1362 qd = qd_alloc(hash, sdp, qc_id); in gfs2_quota_init()
1363 if (qd == NULL) { in gfs2_quota_init()
1368 set_bit(QDF_CHANGE, &qd->qd_flags); in gfs2_quota_init()
1369 qd->qd_change = qc_change; in gfs2_quota_init()
1370 qd->qd_slot = slot; in gfs2_quota_init()
1371 qd->qd_slot_count = 1; in gfs2_quota_init()
1375 list_add(&qd->qd_list, &sdp->sd_quota_list); in gfs2_quota_init()
1380 hlist_bl_add_head_rcu(&qd->qd_hlist, &qd_hash_table[hash]); in gfs2_quota_init()
1404 struct gfs2_quota_data *qd; in gfs2_quota_cleanup() local
1408 qd = list_entry(head->prev, struct gfs2_quota_data, qd_list); in gfs2_quota_cleanup()
1410 list_del(&qd->qd_list); in gfs2_quota_cleanup()
1413 list_lru_del(&gfs2_qd_lru, &qd->qd_lru); in gfs2_quota_cleanup()
1417 spin_lock_bucket(qd->qd_hash); in gfs2_quota_cleanup()
1418 hlist_bl_del_rcu(&qd->qd_hlist); in gfs2_quota_cleanup()
1419 spin_unlock_bucket(qd->qd_hash); in gfs2_quota_cleanup()
1421 gfs2_assert_warn(sdp, !qd->qd_change); in gfs2_quota_cleanup()
1422 gfs2_assert_warn(sdp, !qd->qd_slot_count); in gfs2_quota_cleanup()
1423 gfs2_assert_warn(sdp, !qd->qd_bh_count); in gfs2_quota_cleanup()
1425 gfs2_glock_put(qd->qd_gl); in gfs2_quota_cleanup()
1426 call_rcu(&qd->qd_rcu, gfs2_qd_dealloc); in gfs2_quota_cleanup()
1577 struct gfs2_quota_data *qd; in gfs2_get_dqblk() local
1590 error = qd_get(sdp, qid, &qd); in gfs2_get_dqblk()
1593 error = do_glock(qd, FORCE, &q_gh); in gfs2_get_dqblk()
1597 qlvb = (struct gfs2_quota_lvb *)qd->qd_gl->gl_lksb.sb_lvbptr; in gfs2_get_dqblk()
1604 qd_put(qd); in gfs2_get_dqblk()
1616 struct gfs2_quota_data *qd; in gfs2_set_dqblk() local
1634 error = qd_get(sdp, qid, &qd); in gfs2_set_dqblk()
1643 error = gfs2_glock_nq_init(qd->qd_gl, LM_ST_EXCLUSIVE, 0, &q_gh); in gfs2_set_dqblk()
1651 error = update_qd(sdp, qd); in gfs2_set_dqblk()
1657 ((fdq->d_spc_softlimit >> sdp->sd_sb.sb_bsize_shift) == be64_to_cpu(qd->qd_qb.qb_warn))) in gfs2_set_dqblk()
1661 ((fdq->d_spc_hardlimit >> sdp->sd_sb.sb_bsize_shift) == be64_to_cpu(qd->qd_qb.qb_limit))) in gfs2_set_dqblk()
1665 ((fdq->d_space >> sdp->sd_sb.sb_bsize_shift) == be64_to_cpu(qd->qd_qb.qb_value))) in gfs2_set_dqblk()
1671 offset = qd2offset(qd); in gfs2_set_dqblk()
1694 error = gfs2_adjust_quota(ip, offset, 0, qd, fdq); in gfs2_set_dqblk()
1696 clear_bit(QDF_QMSG_QUIET, &qd->qd_flags); in gfs2_set_dqblk()
1709 qd_put(qd); in gfs2_set_dqblk()