hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/fs/xfs/xfs_dquot.h
....@@ -27,37 +27,66 @@
2727 XFS_QLOWSP_MAX
2828 };
2929
30
+struct xfs_dquot_res {
31
+ /* Total resources allocated and reserved. */
32
+ xfs_qcnt_t reserved;
33
+
34
+ /* Total resources allocated. */
35
+ xfs_qcnt_t count;
36
+
37
+ /* Absolute and preferred limits. */
38
+ xfs_qcnt_t hardlimit;
39
+ xfs_qcnt_t softlimit;
40
+
41
+ /*
42
+ * For root dquots, this is the default grace period, in seconds.
43
+ * Otherwise, this is when the quota grace period expires,
44
+ * in seconds since the Unix epoch.
45
+ */
46
+ time64_t timer;
47
+
48
+ /*
49
+ * For root dquots, this is the maximum number of warnings that will
50
+ * be issued for this quota type. Otherwise, this is the number of
51
+ * warnings issued against this quota. Note that none of this is
52
+ * implemented.
53
+ */
54
+ xfs_qwarncnt_t warnings;
55
+};
56
+
3057 /*
3158 * The incore dquot structure
3259 */
33
-typedef struct xfs_dquot {
34
- uint dq_flags; /* various flags (XFS_DQ_*) */
35
- struct list_head q_lru; /* global free list of dquots */
36
- struct xfs_mount*q_mount; /* filesystem this relates to */
37
- struct xfs_trans*q_transp; /* trans this belongs to currently */
38
- uint q_nrefs; /* # active refs from inodes */
39
- xfs_daddr_t q_blkno; /* blkno of dquot buffer */
40
- int q_bufoffset; /* off of dq in buffer (# dquots) */
41
- xfs_fileoff_t q_fileoffset; /* offset in quotas file */
60
+struct xfs_dquot {
61
+ struct list_head q_lru;
62
+ struct xfs_mount *q_mount;
63
+ xfs_dqtype_t q_type;
64
+ uint16_t q_flags;
65
+ xfs_dqid_t q_id;
66
+ uint q_nrefs;
67
+ int q_bufoffset;
68
+ xfs_daddr_t q_blkno;
69
+ xfs_fileoff_t q_fileoffset;
4270
43
- xfs_disk_dquot_t q_core; /* actual usage & quotas */
44
- xfs_dq_logitem_t q_logitem; /* dquot log item */
45
- xfs_qcnt_t q_res_bcount; /* total regular nblks used+reserved */
46
- xfs_qcnt_t q_res_icount; /* total inos allocd+reserved */
47
- xfs_qcnt_t q_res_rtbcount;/* total realtime blks used+reserved */
48
- xfs_qcnt_t q_prealloc_lo_wmark;/* prealloc throttle wmark */
49
- xfs_qcnt_t q_prealloc_hi_wmark;/* prealloc disabled wmark */
50
- int64_t q_low_space[XFS_QLOWSP_MAX];
51
- struct mutex q_qlock; /* quota lock */
52
- struct completion q_flush; /* flush completion queue */
53
- atomic_t q_pincount; /* dquot pin count */
54
- wait_queue_head_t q_pinwait; /* dquot pinning wait queue */
55
-} xfs_dquot_t;
71
+ struct xfs_dquot_res q_blk; /* regular blocks */
72
+ struct xfs_dquot_res q_ino; /* inodes */
73
+ struct xfs_dquot_res q_rtb; /* realtime blocks */
74
+
75
+ struct xfs_dq_logitem q_logitem;
76
+
77
+ xfs_qcnt_t q_prealloc_lo_wmark;
78
+ xfs_qcnt_t q_prealloc_hi_wmark;
79
+ int64_t q_low_space[XFS_QLOWSP_MAX];
80
+ struct mutex q_qlock;
81
+ struct completion q_flush;
82
+ atomic_t q_pincount;
83
+ struct wait_queue_head q_pinwait;
84
+};
5685
5786 /*
5887 * Lock hierarchy for q_qlock:
5988 * XFS_QLOCK_NORMAL is the implicit default,
60
- * XFS_QLOCK_NESTED is the dquot with the higher id in xfs_dqlock2
89
+ * XFS_QLOCK_NESTED is the dquot with the higher id in xfs_dqlock2
6190 */
6291 enum {
6392 XFS_QLOCK_NORMAL = 0,
....@@ -65,21 +94,21 @@
6594 };
6695
6796 /*
68
- * Manage the q_flush completion queue embedded in the dquot. This completion
97
+ * Manage the q_flush completion queue embedded in the dquot. This completion
6998 * queue synchronizes processes attempting to flush the in-core dquot back to
7099 * disk.
71100 */
72
-static inline void xfs_dqflock(xfs_dquot_t *dqp)
101
+static inline void xfs_dqflock(struct xfs_dquot *dqp)
73102 {
74103 wait_for_completion(&dqp->q_flush);
75104 }
76105
77
-static inline bool xfs_dqflock_nowait(xfs_dquot_t *dqp)
106
+static inline bool xfs_dqflock_nowait(struct xfs_dquot *dqp)
78107 {
79108 return try_wait_for_completion(&dqp->q_flush);
80109 }
81110
82
-static inline void xfs_dqfunlock(xfs_dquot_t *dqp)
111
+static inline void xfs_dqfunlock(struct xfs_dquot *dqp)
83112 {
84113 complete(&dqp->q_flush);
85114 }
....@@ -99,32 +128,57 @@
99128 mutex_unlock(&dqp->q_qlock);
100129 }
101130
102
-static inline int xfs_this_quota_on(struct xfs_mount *mp, int type)
131
+static inline int
132
+xfs_dquot_type(const struct xfs_dquot *dqp)
103133 {
104
- switch (type & XFS_DQ_ALLTYPES) {
105
- case XFS_DQ_USER:
134
+ return dqp->q_type & XFS_DQTYPE_REC_MASK;
135
+}
136
+
137
+static inline int xfs_this_quota_on(struct xfs_mount *mp, xfs_dqtype_t type)
138
+{
139
+ switch (type) {
140
+ case XFS_DQTYPE_USER:
106141 return XFS_IS_UQUOTA_ON(mp);
107
- case XFS_DQ_GROUP:
142
+ case XFS_DQTYPE_GROUP:
108143 return XFS_IS_GQUOTA_ON(mp);
109
- case XFS_DQ_PROJ:
144
+ case XFS_DQTYPE_PROJ:
110145 return XFS_IS_PQUOTA_ON(mp);
111146 default:
112147 return 0;
113148 }
114149 }
115150
116
-static inline xfs_dquot_t *xfs_inode_dquot(struct xfs_inode *ip, int type)
151
+static inline struct xfs_dquot *xfs_inode_dquot(
152
+ struct xfs_inode *ip,
153
+ xfs_dqtype_t type)
117154 {
118
- switch (type & XFS_DQ_ALLTYPES) {
119
- case XFS_DQ_USER:
155
+ switch (type) {
156
+ case XFS_DQTYPE_USER:
120157 return ip->i_udquot;
121
- case XFS_DQ_GROUP:
158
+ case XFS_DQTYPE_GROUP:
122159 return ip->i_gdquot;
123
- case XFS_DQ_PROJ:
160
+ case XFS_DQTYPE_PROJ:
124161 return ip->i_pdquot;
125162 default:
126163 return NULL;
127164 }
165
+}
166
+
167
+/* Decide if the dquot's limits are actually being enforced. */
168
+static inline bool
169
+xfs_dquot_is_enforced(
170
+ const struct xfs_dquot *dqp)
171
+{
172
+ switch (xfs_dquot_type(dqp)) {
173
+ case XFS_DQTYPE_USER:
174
+ return XFS_IS_UQUOTA_ENFORCED(dqp->q_mount);
175
+ case XFS_DQTYPE_GROUP:
176
+ return XFS_IS_GQUOTA_ENFORCED(dqp->q_mount);
177
+ case XFS_DQTYPE_PROJ:
178
+ return XFS_IS_PQUOTA_ENFORCED(dqp->q_mount);
179
+ }
180
+ ASSERT(0);
181
+ return false;
128182 }
129183
130184 /*
....@@ -135,44 +189,40 @@
135189 {
136190 int64_t freesp;
137191
138
- freesp = be64_to_cpu(dqp->q_core.d_blk_hardlimit) - dqp->q_res_bcount;
192
+ freesp = dqp->q_blk.hardlimit - dqp->q_blk.reserved;
139193 if (freesp < dqp->q_low_space[XFS_QLOWSP_1_PCNT])
140194 return true;
141195
142196 return false;
143197 }
144198
199
+void xfs_dquot_to_disk(struct xfs_disk_dquot *ddqp, struct xfs_dquot *dqp);
200
+
145201 #define XFS_DQ_IS_LOCKED(dqp) (mutex_is_locked(&((dqp)->q_qlock)))
146
-#define XFS_DQ_IS_DIRTY(dqp) ((dqp)->dq_flags & XFS_DQ_DIRTY)
147
-#define XFS_QM_ISUDQ(dqp) ((dqp)->dq_flags & XFS_DQ_USER)
148
-#define XFS_QM_ISPDQ(dqp) ((dqp)->dq_flags & XFS_DQ_PROJ)
149
-#define XFS_QM_ISGDQ(dqp) ((dqp)->dq_flags & XFS_DQ_GROUP)
202
+#define XFS_DQ_IS_DIRTY(dqp) ((dqp)->q_flags & XFS_DQFLAG_DIRTY)
150203
151
-extern void xfs_qm_dqdestroy(xfs_dquot_t *);
152
-extern int xfs_qm_dqflush(struct xfs_dquot *, struct xfs_buf **);
153
-extern void xfs_qm_dqunpin_wait(xfs_dquot_t *);
154
-extern void xfs_qm_adjust_dqtimers(xfs_mount_t *,
155
- xfs_disk_dquot_t *);
156
-extern void xfs_qm_adjust_dqlimits(struct xfs_mount *,
157
- struct xfs_dquot *);
158
-extern xfs_dqid_t xfs_qm_id_for_quotatype(struct xfs_inode *ip,
159
- uint type);
160
-extern int xfs_qm_dqget(struct xfs_mount *mp, xfs_dqid_t id,
161
- uint type, bool can_alloc,
162
- struct xfs_dquot **dqpp);
163
-extern int xfs_qm_dqget_inode(struct xfs_inode *ip, uint type,
164
- bool can_alloc,
165
- struct xfs_dquot **dqpp);
166
-extern int xfs_qm_dqget_next(struct xfs_mount *mp, xfs_dqid_t id,
167
- uint type, struct xfs_dquot **dqpp);
168
-extern int xfs_qm_dqget_uncached(struct xfs_mount *mp,
169
- xfs_dqid_t id, uint type,
170
- struct xfs_dquot **dqpp);
171
-extern void xfs_qm_dqput(xfs_dquot_t *);
204
+void xfs_qm_dqdestroy(struct xfs_dquot *dqp);
205
+int xfs_qm_dqflush(struct xfs_dquot *dqp, struct xfs_buf **bpp);
206
+void xfs_qm_dqunpin_wait(struct xfs_dquot *dqp);
207
+void xfs_qm_adjust_dqtimers(struct xfs_dquot *d);
208
+void xfs_qm_adjust_dqlimits(struct xfs_dquot *d);
209
+xfs_dqid_t xfs_qm_id_for_quotatype(struct xfs_inode *ip,
210
+ xfs_dqtype_t type);
211
+int xfs_qm_dqget(struct xfs_mount *mp, xfs_dqid_t id,
212
+ xfs_dqtype_t type, bool can_alloc,
213
+ struct xfs_dquot **dqpp);
214
+int xfs_qm_dqget_inode(struct xfs_inode *ip, xfs_dqtype_t type,
215
+ bool can_alloc, struct xfs_dquot **dqpp);
216
+int xfs_qm_dqget_next(struct xfs_mount *mp, xfs_dqid_t id,
217
+ xfs_dqtype_t type, struct xfs_dquot **dqpp);
218
+int xfs_qm_dqget_uncached(struct xfs_mount *mp,
219
+ xfs_dqid_t id, xfs_dqtype_t type,
220
+ struct xfs_dquot **dqpp);
221
+void xfs_qm_dqput(struct xfs_dquot *dqp);
172222
173
-extern void xfs_dqlock2(struct xfs_dquot *, struct xfs_dquot *);
223
+void xfs_dqlock2(struct xfs_dquot *, struct xfs_dquot *);
174224
175
-extern void xfs_dquot_set_prealloc_limits(struct xfs_dquot *);
225
+void xfs_dquot_set_prealloc_limits(struct xfs_dquot *);
176226
177227 static inline struct xfs_dquot *xfs_qm_dqhold(struct xfs_dquot *dqp)
178228 {
....@@ -182,9 +232,12 @@
182232 return dqp;
183233 }
184234
185
-typedef int (*xfs_qm_dqiterate_fn)(struct xfs_dquot *dq, uint dqtype,
186
- void *priv);
187
-int xfs_qm_dqiterate(struct xfs_mount *mp, uint dqtype,
235
+typedef int (*xfs_qm_dqiterate_fn)(struct xfs_dquot *dq,
236
+ xfs_dqtype_t type, void *priv);
237
+int xfs_qm_dqiterate(struct xfs_mount *mp, xfs_dqtype_t type,
188238 xfs_qm_dqiterate_fn iter_fn, void *priv);
189239
240
+time64_t xfs_dquot_set_timeout(struct xfs_mount *mp, time64_t timeout);
241
+time64_t xfs_dquot_set_grace_period(time64_t grace);
242
+
190243 #endif /* __XFS_DQUOT_H__ */