xref: /kernel/linux/linux-5.10/fs/xfs/xfs_qm.h (revision 8c2ecf20)
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Copyright (c) 2000-2005 Silicon Graphics, Inc.
4 * All Rights Reserved.
5 */
6#ifndef __XFS_QM_H__
7#define __XFS_QM_H__
8
9#include "xfs_dquot_item.h"
10#include "xfs_dquot.h"
11
12struct xfs_inode;
13
14extern struct kmem_zone	*xfs_qm_dqtrxzone;
15
16/*
17 * Number of bmaps that we ask from bmapi when doing a quotacheck.
18 * We make this restriction to keep the memory usage to a minimum.
19 */
20#define XFS_DQITER_MAP_SIZE	10
21
22#define XFS_IS_DQUOT_UNINITIALIZED(dqp) ( \
23	!dqp->q_blk.hardlimit && \
24	!dqp->q_blk.softlimit && \
25	!dqp->q_rtb.hardlimit && \
26	!dqp->q_rtb.softlimit && \
27	!dqp->q_ino.hardlimit && \
28	!dqp->q_ino.softlimit && \
29	!dqp->q_blk.count && \
30	!dqp->q_rtb.count && \
31	!dqp->q_ino.count)
32
33struct xfs_quota_limits {
34	xfs_qcnt_t		hard;	/* default hard limit */
35	xfs_qcnt_t		soft;	/* default soft limit */
36	time64_t		time;	/* limit for timers */
37	xfs_qwarncnt_t		warn;	/* limit for warnings */
38};
39
40/* Defaults for each quota type: time limits, warn limits, usage limits */
41struct xfs_def_quota {
42	struct xfs_quota_limits	blk;
43	struct xfs_quota_limits	ino;
44	struct xfs_quota_limits	rtb;
45};
46
47/*
48 * Various quota information for individual filesystems.
49 * The mount structure keeps a pointer to this.
50 */
51struct xfs_quotainfo {
52	struct radix_tree_root	qi_uquota_tree;
53	struct radix_tree_root	qi_gquota_tree;
54	struct radix_tree_root	qi_pquota_tree;
55	struct mutex		qi_tree_lock;
56	struct xfs_inode	*qi_uquotaip;	/* user quota inode */
57	struct xfs_inode	*qi_gquotaip;	/* group quota inode */
58	struct xfs_inode	*qi_pquotaip;	/* project quota inode */
59	struct list_lru		qi_lru;
60	int			qi_dquots;
61	struct mutex		qi_quotaofflock;/* to serialize quotaoff */
62	xfs_filblks_t		qi_dqchunklen;	/* # BBs in a chunk of dqs */
63	uint			qi_dqperchunk;	/* # ondisk dq in above chunk */
64	struct xfs_def_quota	qi_usr_default;
65	struct xfs_def_quota	qi_grp_default;
66	struct xfs_def_quota	qi_prj_default;
67	struct shrinker		qi_shrinker;
68
69	/* Minimum and maximum quota expiration timestamp values. */
70	time64_t		qi_expiry_min;
71	time64_t		qi_expiry_max;
72};
73
74static inline struct radix_tree_root *
75xfs_dquot_tree(
76	struct xfs_quotainfo	*qi,
77	xfs_dqtype_t		type)
78{
79	switch (type) {
80	case XFS_DQTYPE_USER:
81		return &qi->qi_uquota_tree;
82	case XFS_DQTYPE_GROUP:
83		return &qi->qi_gquota_tree;
84	case XFS_DQTYPE_PROJ:
85		return &qi->qi_pquota_tree;
86	default:
87		ASSERT(0);
88	}
89	return NULL;
90}
91
92static inline struct xfs_inode *
93xfs_quota_inode(struct xfs_mount *mp, xfs_dqtype_t type)
94{
95	switch (type) {
96	case XFS_DQTYPE_USER:
97		return mp->m_quotainfo->qi_uquotaip;
98	case XFS_DQTYPE_GROUP:
99		return mp->m_quotainfo->qi_gquotaip;
100	case XFS_DQTYPE_PROJ:
101		return mp->m_quotainfo->qi_pquotaip;
102	default:
103		ASSERT(0);
104	}
105	return NULL;
106}
107
108extern void	xfs_trans_mod_dquot(struct xfs_trans *tp, struct xfs_dquot *dqp,
109				    uint field, int64_t delta);
110extern void	xfs_trans_dqjoin(struct xfs_trans *, struct xfs_dquot *);
111extern void	xfs_trans_log_dquot(struct xfs_trans *, struct xfs_dquot *);
112
113/*
114 * We keep the usr, grp, and prj dquots separately so that locking will be
115 * easier to do at commit time. All transactions that we know of at this point
116 * affect no more than two dquots of one type. Hence, the TRANS_MAXDQS value.
117 */
118enum {
119	XFS_QM_TRANS_USR = 0,
120	XFS_QM_TRANS_GRP,
121	XFS_QM_TRANS_PRJ,
122	XFS_QM_TRANS_DQTYPES
123};
124#define XFS_QM_TRANS_MAXDQS		2
125struct xfs_dquot_acct {
126	struct xfs_dqtrx	dqs[XFS_QM_TRANS_DQTYPES][XFS_QM_TRANS_MAXDQS];
127};
128
129/*
130 * Users are allowed to have a usage exceeding their softlimit for
131 * a period this long.
132 */
133#define XFS_QM_BTIMELIMIT	(7 * 24*60*60)          /* 1 week */
134#define XFS_QM_RTBTIMELIMIT	(7 * 24*60*60)          /* 1 week */
135#define XFS_QM_ITIMELIMIT	(7 * 24*60*60)          /* 1 week */
136
137#define XFS_QM_BWARNLIMIT	5
138#define XFS_QM_IWARNLIMIT	5
139#define XFS_QM_RTBWARNLIMIT	5
140
141extern void		xfs_qm_destroy_quotainfo(struct xfs_mount *);
142
143/* dquot stuff */
144extern void		xfs_qm_dqpurge_all(struct xfs_mount *, uint);
145extern void		xfs_qm_dqrele_all_inodes(struct xfs_mount *, uint);
146
147/* quota ops */
148extern int		xfs_qm_scall_trunc_qfiles(struct xfs_mount *, uint);
149extern int		xfs_qm_scall_getquota(struct xfs_mount *mp,
150					xfs_dqid_t id,
151					xfs_dqtype_t type,
152					struct qc_dqblk *dst);
153extern int		xfs_qm_scall_getquota_next(struct xfs_mount *mp,
154					xfs_dqid_t *id,
155					xfs_dqtype_t type,
156					struct qc_dqblk *dst);
157extern int		xfs_qm_scall_setqlim(struct xfs_mount *mp,
158					xfs_dqid_t id,
159					xfs_dqtype_t type,
160					struct qc_dqblk *newlim);
161extern int		xfs_qm_scall_quotaon(struct xfs_mount *, uint);
162extern int		xfs_qm_scall_quotaoff(struct xfs_mount *, uint);
163
164static inline struct xfs_def_quota *
165xfs_get_defquota(struct xfs_quotainfo *qi, xfs_dqtype_t type)
166{
167	switch (type) {
168	case XFS_DQTYPE_USER:
169		return &qi->qi_usr_default;
170	case XFS_DQTYPE_GROUP:
171		return &qi->qi_grp_default;
172	case XFS_DQTYPE_PROJ:
173		return &qi->qi_prj_default;
174	default:
175		ASSERT(0);
176		return NULL;
177	}
178}
179
180#endif /* __XFS_QM_H__ */
181