Lines Matching refs:qd

108 	struct gfs2_quota_data *qd = container_of(rcu, struct gfs2_quota_data, qd_rcu);  in gfs2_qd_dealloc()  local
109 kmem_cache_free(gfs2_quotad_cachep, qd); in gfs2_qd_dealloc()
114 struct gfs2_quota_data *qd; in gfs2_qd_dispose() local
118 qd = list_first_entry(list, struct gfs2_quota_data, qd_lru); in gfs2_qd_dispose()
119 sdp = qd->qd_gl->gl_name.ln_sbd; in gfs2_qd_dispose()
121 list_del(&qd->qd_lru); in gfs2_qd_dispose()
125 list_del(&qd->qd_list); in gfs2_qd_dispose()
128 spin_lock_bucket(qd->qd_hash); in gfs2_qd_dispose()
129 hlist_bl_del_rcu(&qd->qd_hlist); in gfs2_qd_dispose()
130 spin_unlock_bucket(qd->qd_hash); in gfs2_qd_dispose()
132 gfs2_assert_warn(sdp, !qd->qd_change); in gfs2_qd_dispose()
133 gfs2_assert_warn(sdp, !qd->qd_slot_count); in gfs2_qd_dispose()
134 gfs2_assert_warn(sdp, !qd->qd_bh_count); in gfs2_qd_dispose()
136 gfs2_glock_put(qd->qd_gl); in gfs2_qd_dispose()
140 call_rcu(&qd->qd_rcu, gfs2_qd_dealloc); in gfs2_qd_dispose()
149 struct gfs2_quota_data *qd = list_entry(item, struct gfs2_quota_data, qd_lru); in gfs2_qd_isolate() local
151 if (!spin_trylock(&qd->qd_lockref.lock)) in gfs2_qd_isolate()
154 if (qd->qd_lockref.count == 0) { in gfs2_qd_isolate()
155 lockref_mark_dead(&qd->qd_lockref); in gfs2_qd_isolate()
156 list_lru_isolate_move(lru, &qd->qd_lru, dispose); in gfs2_qd_isolate()
159 spin_unlock(&qd->qd_lockref.lock); in gfs2_qd_isolate()
194 static u64 qd2index(struct gfs2_quota_data *qd) in qd2index() argument
196 struct kqid qid = qd->qd_id; in qd2index()
201 static u64 qd2offset(struct gfs2_quota_data *qd) in qd2offset() argument
205 offset = qd2index(qd); in qd2offset()
213 struct gfs2_quota_data *qd; in qd_alloc() local
216 qd = kmem_cache_zalloc(gfs2_quotad_cachep, GFP_NOFS); in qd_alloc()
217 if (!qd) in qd_alloc()
220 qd->qd_sbd = sdp; in qd_alloc()
221 qd->qd_lockref.count = 1; in qd_alloc()
222 spin_lock_init(&qd->qd_lockref.lock); in qd_alloc()
223 qd->qd_id = qid; in qd_alloc()
224 qd->qd_slot = -1; in qd_alloc()
225 INIT_LIST_HEAD(&qd->qd_lru); in qd_alloc()
226 qd->qd_hash = hash; in qd_alloc()
228 error = gfs2_glock_get(sdp, qd2index(qd), in qd_alloc()
229 &gfs2_quota_glops, CREATE, &qd->qd_gl); in qd_alloc()
233 return qd; in qd_alloc()
236 kmem_cache_free(gfs2_quotad_cachep, qd); in qd_alloc()
244 struct gfs2_quota_data *qd; in gfs2_qd_search_bucket() local
247 hlist_bl_for_each_entry_rcu(qd, h, &qd_hash_table[hash], qd_hlist) { in gfs2_qd_search_bucket()
248 if (!qid_eq(qd->qd_id, qid)) in gfs2_qd_search_bucket()
250 if (qd->qd_sbd != sdp) in gfs2_qd_search_bucket()
252 if (lockref_get_not_dead(&qd->qd_lockref)) { in gfs2_qd_search_bucket()
253 list_lru_del(&gfs2_qd_lru, &qd->qd_lru); in gfs2_qd_search_bucket()
254 return qd; in gfs2_qd_search_bucket()
265 struct gfs2_quota_data *qd, *new_qd; in qd_get() local
269 *qdp = qd = gfs2_qd_search_bucket(hash, sdp, qid); in qd_get()
272 if (qd) in qd_get()
281 *qdp = qd = gfs2_qd_search_bucket(hash, sdp, qid); in qd_get()
282 if (qd == NULL) { in qd_get()
291 if (qd) { in qd_get()
300 static void qd_hold(struct gfs2_quota_data *qd) in qd_hold() argument
302 struct gfs2_sbd *sdp = qd->qd_gl->gl_name.ln_sbd; in qd_hold()
303 gfs2_assert(sdp, !__lockref_is_dead(&qd->qd_lockref)); in qd_hold()
304 lockref_get(&qd->qd_lockref); in qd_hold()
307 static void qd_put(struct gfs2_quota_data *qd) in qd_put() argument
309 if (lockref_put_or_lock(&qd->qd_lockref)) in qd_put()
312 qd->qd_lockref.count = 0; in qd_put()
313 list_lru_add(&gfs2_qd_lru, &qd->qd_lru); in qd_put()
314 spin_unlock(&qd->qd_lockref.lock); in qd_put()
318 static int slot_get(struct gfs2_quota_data *qd) in slot_get() argument
320 struct gfs2_sbd *sdp = qd->qd_sbd; in slot_get()
325 if (qd->qd_slot_count != 0) in slot_get()
332 qd->qd_slot = bit; in slot_get()
335 qd->qd_slot_count++; in slot_get()
342 static void slot_hold(struct gfs2_quota_data *qd) in slot_hold() argument
344 struct gfs2_sbd *sdp = qd->qd_sbd; in slot_hold()
347 gfs2_assert(sdp, qd->qd_slot_count); in slot_hold()
348 qd->qd_slot_count++; in slot_hold()
352 static void slot_put(struct gfs2_quota_data *qd) in slot_put() argument
354 struct gfs2_sbd *sdp = qd->qd_sbd; in slot_put()
357 gfs2_assert(sdp, qd->qd_slot_count); in slot_put()
358 if (!--qd->qd_slot_count) { in slot_put()
359 BUG_ON(!test_and_clear_bit(qd->qd_slot, sdp->sd_quota_bitmap)); in slot_put()
360 qd->qd_slot = -1; in slot_put()
365 static int bh_get(struct gfs2_quota_data *qd) in bh_get() argument
367 struct gfs2_sbd *sdp = qd->qd_gl->gl_name.ln_sbd; in bh_get()
376 if (qd->qd_bh_count++) { in bh_get()
381 block = qd->qd_slot / sdp->sd_qc_per_block; in bh_get()
382 offset = qd->qd_slot % sdp->sd_qc_per_block; in bh_get()
395 qd->qd_bh = bh; in bh_get()
396 qd->qd_bh_qc = (struct gfs2_quota_change *) in bh_get()
407 qd->qd_bh_count--; in bh_get()
412 static void bh_put(struct gfs2_quota_data *qd) in bh_put() argument
414 struct gfs2_sbd *sdp = qd->qd_gl->gl_name.ln_sbd; in bh_put()
417 gfs2_assert(sdp, qd->qd_bh_count); in bh_put()
418 if (!--qd->qd_bh_count) { in bh_put()
419 brelse(qd->qd_bh); in bh_put()
420 qd->qd_bh = NULL; in bh_put()
421 qd->qd_bh_qc = NULL; in bh_put()
426 static int qd_check_sync(struct gfs2_sbd *sdp, struct gfs2_quota_data *qd, in qd_check_sync() argument
429 if (test_bit(QDF_LOCKED, &qd->qd_flags) || in qd_check_sync()
430 !test_bit(QDF_CHANGE, &qd->qd_flags) || in qd_check_sync()
431 (sync_gen && (qd->qd_sync_gen >= *sync_gen))) in qd_check_sync()
434 if (!lockref_get_not_dead(&qd->qd_lockref)) in qd_check_sync()
437 list_move_tail(&qd->qd_list, &sdp->sd_quota_list); in qd_check_sync()
438 set_bit(QDF_LOCKED, &qd->qd_flags); in qd_check_sync()
439 qd->qd_change_sync = qd->qd_change; in qd_check_sync()
440 slot_hold(qd); in qd_check_sync()
446 struct gfs2_quota_data *qd = NULL; in qd_fish() local
457 list_for_each_entry(qd, &sdp->sd_quota_list, qd_list) { in qd_fish()
458 found = qd_check_sync(sdp, qd, &sdp->sd_quota_sync_gen); in qd_fish()
464 qd = NULL; in qd_fish()
468 if (qd) { in qd_fish()
469 gfs2_assert_warn(sdp, qd->qd_change_sync); in qd_fish()
470 error = bh_get(qd); in qd_fish()
472 clear_bit(QDF_LOCKED, &qd->qd_flags); in qd_fish()
473 slot_put(qd); in qd_fish()
474 qd_put(qd); in qd_fish()
479 *qdp = qd; in qd_fish()
484 static void qd_unlock(struct gfs2_quota_data *qd) in qd_unlock() argument
486 gfs2_assert_warn(qd->qd_gl->gl_name.ln_sbd, in qd_unlock()
487 test_bit(QDF_LOCKED, &qd->qd_flags)); in qd_unlock()
488 clear_bit(QDF_LOCKED, &qd->qd_flags); in qd_unlock()
489 bh_put(qd); in qd_unlock()
490 slot_put(qd); in qd_unlock()
491 qd_put(qd); in qd_unlock()
520 static void qdsb_put(struct gfs2_quota_data *qd) in qdsb_put() argument
522 bh_put(qd); in qdsb_put()
523 slot_put(qd); in qdsb_put()
524 qd_put(qd); in qdsb_put()
575 struct gfs2_quota_data **qd; in gfs2_quota_hold() local
585 qd = ip->i_qadata->qa_qd; in gfs2_quota_hold()
593 error = qdsb_get(sdp, make_kqid_uid(ip->i_inode.i_uid), qd); in gfs2_quota_hold()
597 qd++; in gfs2_quota_hold()
599 error = qdsb_get(sdp, make_kqid_gid(ip->i_inode.i_gid), qd); in gfs2_quota_hold()
603 qd++; in gfs2_quota_hold()
607 error = qdsb_get(sdp, make_kqid_uid(uid), qd); in gfs2_quota_hold()
611 qd++; in gfs2_quota_hold()
616 error = qdsb_get(sdp, make_kqid_gid(gid), qd); in gfs2_quota_hold()
620 qd++; in gfs2_quota_hold()
660 static void do_qc(struct gfs2_quota_data *qd, s64 change) in do_qc() argument
662 struct gfs2_sbd *sdp = qd->qd_gl->gl_name.ln_sbd; in do_qc()
664 struct gfs2_quota_change *qc = qd->qd_bh_qc; in do_qc()
668 gfs2_trans_add_meta(ip->i_gl, qd->qd_bh); in do_qc()
670 if (!test_bit(QDF_CHANGE, &qd->qd_flags)) { in do_qc()
673 if (qd->qd_id.type == USRQUOTA) in do_qc()
675 qc->qc_id = cpu_to_be32(from_kqid(&init_user_ns, qd->qd_id)); in do_qc()
682 qd->qd_change = x; in do_qc()
686 gfs2_assert_warn(sdp, test_bit(QDF_CHANGE, &qd->qd_flags)); in do_qc()
687 clear_bit(QDF_CHANGE, &qd->qd_flags); in do_qc()
690 slot_put(qd); in do_qc()
691 qd_put(qd); in do_qc()
692 } else if (!test_and_set_bit(QDF_CHANGE, &qd->qd_flags)) { in do_qc()
693 qd_hold(qd); in do_qc()
694 slot_hold(qd); in do_qc()
698 clear_bit(QDF_QMSG_QUIET, &qd->qd_flags); in do_qc()
826 s64 change, struct gfs2_quota_data *qd, in gfs2_adjust_quota() argument
851 qd->qd_qb.qb_value = q.qu_value; in gfs2_adjust_quota()
855 qd->qd_qb.qb_warn = q.qu_warn; in gfs2_adjust_quota()
859 qd->qd_qb.qb_limit = q.qu_limit; in gfs2_adjust_quota()
863 qd->qd_qb.qb_value = q.qu_value; in gfs2_adjust_quota()
874 set_bit(QDF_REFRESH, &qd->qd_flags); in gfs2_adjust_quota()
888 struct gfs2_quota_data *qd; in do_sync() local
952 qd = qda[x]; in do_sync()
953 offset = qd2offset(qd); in do_sync()
954 error = gfs2_adjust_quota(ip, offset, qd->qd_change_sync, qd, NULL); in do_sync()
958 do_qc(qd, -qd->qd_change_sync); in do_sync()
959 set_bit(QDF_REFRESH, &qd->qd_flags); in do_sync()
982 static int update_qd(struct gfs2_sbd *sdp, struct gfs2_quota_data *qd) in update_qd() argument
991 pos = qd2offset(qd); in update_qd()
996 qlvb = (struct gfs2_quota_lvb *)qd->qd_gl->gl_lksb.sb_lvbptr; in update_qd()
1002 qd->qd_qb = *qlvb; in update_qd()
1007 static int do_glock(struct gfs2_quota_data *qd, int force_refresh, in do_glock() argument
1010 struct gfs2_sbd *sdp = qd->qd_gl->gl_name.ln_sbd; in do_glock()
1016 error = gfs2_glock_nq_init(qd->qd_gl, LM_ST_SHARED, 0, q_gh); in do_glock()
1020 if (test_and_clear_bit(QDF_REFRESH, &qd->qd_flags)) in do_glock()
1023 qd->qd_qb = *(struct gfs2_quota_lvb *)qd->qd_gl->gl_lksb.sb_lvbptr; in do_glock()
1025 if (force_refresh || qd->qd_qb.qb_magic != cpu_to_be32(GFS2_MAGIC)) { in do_glock()
1027 error = gfs2_glock_nq_init(qd->qd_gl, LM_ST_EXCLUSIVE, in do_glock()
1036 error = update_qd(sdp, qd); in do_glock()
1058 struct gfs2_quota_data *qd; in gfs2_quota_lock() local
1073 qd = ip->i_qadata->qa_qd[x]; in gfs2_quota_lock()
1074 error = do_glock(qd, NO_FORCE, &ip->i_qadata->qa_qd_ghs[x]); in gfs2_quota_lock()
1090 static int need_sync(struct gfs2_quota_data *qd) in need_sync() argument
1092 struct gfs2_sbd *sdp = qd->qd_gl->gl_name.ln_sbd; in need_sync()
1098 if (!qd->qd_qb.qb_limit) in need_sync()
1102 value = qd->qd_change; in need_sync()
1112 else if ((s64)be64_to_cpu(qd->qd_qb.qb_value) >= in need_sync()
1113 (s64)be64_to_cpu(qd->qd_qb.qb_limit)) in need_sync()
1118 value += (s64)be64_to_cpu(qd->qd_qb.qb_value); in need_sync()
1119 if (value < (s64)be64_to_cpu(qd->qd_qb.qb_limit)) in need_sync()
1138 struct gfs2_quota_data *qd; in gfs2_quota_unlock() local
1141 qd = ip->i_qadata->qa_qd[x]; in gfs2_quota_unlock()
1142 sync = need_sync(qd); in gfs2_quota_unlock()
1149 found = qd_check_sync(sdp, qd, NULL); in gfs2_quota_unlock()
1155 gfs2_assert_warn(sdp, qd->qd_change_sync); in gfs2_quota_unlock()
1156 if (bh_get(qd)) { in gfs2_quota_unlock()
1157 clear_bit(QDF_LOCKED, &qd->qd_flags); in gfs2_quota_unlock()
1158 slot_put(qd); in gfs2_quota_unlock()
1159 qd_put(qd); in gfs2_quota_unlock()
1163 qda[count++] = qd; in gfs2_quota_unlock()
1177 static int print_message(struct gfs2_quota_data *qd, char *type) in print_message() argument
1179 struct gfs2_sbd *sdp = qd->qd_gl->gl_name.ln_sbd; in print_message()
1183 (qd->qd_id.type == USRQUOTA) ? "user" : "group", in print_message()
1184 from_kqid(&init_user_ns, qd->qd_id)); in print_message()
1210 struct gfs2_quota_data *qd; in gfs2_quota_check() local
1220 qd = ip->i_qadata->qa_qd[x]; in gfs2_quota_check()
1222 if (!(qid_eq(qd->qd_id, make_kqid_uid(uid)) || in gfs2_quota_check()
1223 qid_eq(qd->qd_id, make_kqid_gid(gid)))) in gfs2_quota_check()
1226 warn = (s64)be64_to_cpu(qd->qd_qb.qb_warn); in gfs2_quota_check()
1227 limit = (s64)be64_to_cpu(qd->qd_qb.qb_limit); in gfs2_quota_check()
1228 value = (s64)be64_to_cpu(qd->qd_qb.qb_value); in gfs2_quota_check()
1230 value += qd->qd_change; in gfs2_quota_check()
1241 &qd->qd_flags)) { in gfs2_quota_check()
1242 print_message(qd, "exceeded"); in gfs2_quota_check()
1243 quota_send_warning(qd->qd_id, in gfs2_quota_check()
1251 time_after_eq(jiffies, qd->qd_last_warn + in gfs2_quota_check()
1254 quota_send_warning(qd->qd_id, in gfs2_quota_check()
1256 error = print_message(qd, "warning"); in gfs2_quota_check()
1257 qd->qd_last_warn = jiffies; in gfs2_quota_check()
1266 struct gfs2_quota_data *qd; in gfs2_quota_change() local
1280 qd = ip->i_qadata->qa_qd[x]; in gfs2_quota_change()
1282 if (qid_eq(qd->qd_id, make_kqid_uid(uid)) || in gfs2_quota_change()
1283 qid_eq(qd->qd_id, make_kqid_gid(gid))) { in gfs2_quota_change()
1284 do_qc(qd, change); in gfs2_quota_change()
1337 struct gfs2_quota_data *qd; in gfs2_quota_refresh() local
1341 error = qd_get(sdp, qid, &qd); in gfs2_quota_refresh()
1345 error = do_glock(qd, FORCE, &q_gh); in gfs2_quota_refresh()
1349 qd_put(qd); in gfs2_quota_refresh()
1403 struct gfs2_quota_data *qd; in gfs2_quota_init() local
1415 qd = qd_alloc(hash, sdp, qc_id); in gfs2_quota_init()
1416 if (qd == NULL) { in gfs2_quota_init()
1421 set_bit(QDF_CHANGE, &qd->qd_flags); in gfs2_quota_init()
1422 qd->qd_change = qc_change; in gfs2_quota_init()
1423 qd->qd_slot = slot; in gfs2_quota_init()
1424 qd->qd_slot_count = 1; in gfs2_quota_init()
1428 list_add(&qd->qd_list, &sdp->sd_quota_list); in gfs2_quota_init()
1433 hlist_bl_add_head_rcu(&qd->qd_hlist, &qd_hash_table[hash]); in gfs2_quota_init()
1457 struct gfs2_quota_data *qd; in gfs2_quota_cleanup() local
1461 qd = list_last_entry(head, struct gfs2_quota_data, qd_list); in gfs2_quota_cleanup()
1463 list_del(&qd->qd_list); in gfs2_quota_cleanup()
1466 list_lru_del(&gfs2_qd_lru, &qd->qd_lru); in gfs2_quota_cleanup()
1470 spin_lock_bucket(qd->qd_hash); in gfs2_quota_cleanup()
1471 hlist_bl_del_rcu(&qd->qd_hlist); in gfs2_quota_cleanup()
1472 spin_unlock_bucket(qd->qd_hash); in gfs2_quota_cleanup()
1474 gfs2_assert_warn(sdp, !qd->qd_change); in gfs2_quota_cleanup()
1475 gfs2_assert_warn(sdp, !qd->qd_slot_count); in gfs2_quota_cleanup()
1476 gfs2_assert_warn(sdp, !qd->qd_bh_count); in gfs2_quota_cleanup()
1478 gfs2_glock_put(qd->qd_gl); in gfs2_quota_cleanup()
1479 call_rcu(&qd->qd_rcu, gfs2_qd_dealloc); in gfs2_quota_cleanup()
1636 struct gfs2_quota_data *qd; in gfs2_get_dqblk() local
1649 error = qd_get(sdp, qid, &qd); in gfs2_get_dqblk()
1652 error = do_glock(qd, FORCE, &q_gh); in gfs2_get_dqblk()
1656 qlvb = (struct gfs2_quota_lvb *)qd->qd_gl->gl_lksb.sb_lvbptr; in gfs2_get_dqblk()
1663 qd_put(qd); in gfs2_get_dqblk()
1675 struct gfs2_quota_data *qd; in gfs2_set_dqblk() local
1693 error = qd_get(sdp, qid, &qd); in gfs2_set_dqblk()
1702 error = gfs2_glock_nq_init(qd->qd_gl, LM_ST_EXCLUSIVE, 0, &q_gh); in gfs2_set_dqblk()
1710 error = update_qd(sdp, qd); in gfs2_set_dqblk()
1716 ((fdq->d_spc_softlimit >> sdp->sd_sb.sb_bsize_shift) == be64_to_cpu(qd->qd_qb.qb_warn))) in gfs2_set_dqblk()
1720 ((fdq->d_spc_hardlimit >> sdp->sd_sb.sb_bsize_shift) == be64_to_cpu(qd->qd_qb.qb_limit))) in gfs2_set_dqblk()
1724 ((fdq->d_space >> sdp->sd_sb.sb_bsize_shift) == be64_to_cpu(qd->qd_qb.qb_value))) in gfs2_set_dqblk()
1730 offset = qd2offset(qd); in gfs2_set_dqblk()
1753 error = gfs2_adjust_quota(ip, offset, 0, qd, fdq); in gfs2_set_dqblk()
1755 clear_bit(QDF_QMSG_QUIET, &qd->qd_flags); in gfs2_set_dqblk()
1769 qd_put(qd); in gfs2_set_dqblk()