1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18#ifndef __XFS_QUOTA_H__
19#define __XFS_QUOTA_H__
20
21struct xfs_trans;
22
23
24
25
26#define XFS_DQUOT_MAGIC 0x4451
27#define XFS_DQUOT_VERSION (u_int8_t)0x01
28
29
30
31
32
33typedef __uint32_t xfs_dqid_t;
34
35
36
37
38
39
40typedef __uint64_t xfs_qcnt_t;
41typedef __uint16_t xfs_qwarncnt_t;
42
43
44
45
46
47
48
49typedef struct xfs_disk_dquot {
50 __be16 d_magic;
51 __u8 d_version;
52 __u8 d_flags;
53 __be32 d_id;
54 __be64 d_blk_hardlimit;
55 __be64 d_blk_softlimit;
56 __be64 d_ino_hardlimit;
57 __be64 d_ino_softlimit;
58 __be64 d_bcount;
59 __be64 d_icount;
60 __be32 d_itimer;
61
62 __be32 d_btimer;
63 __be16 d_iwarns;
64 __be16 d_bwarns;
65 __be32 d_pad0;
66 __be64 d_rtb_hardlimit;
67 __be64 d_rtb_softlimit;
68 __be64 d_rtbcount;
69 __be32 d_rtbtimer;
70 __be16 d_rtbwarns;
71 __be16 d_pad;
72} xfs_disk_dquot_t;
73
74
75
76
77
78typedef struct xfs_dqblk {
79 xfs_disk_dquot_t dd_diskdq;
80 char dd_fill[32];
81} xfs_dqblk_t;
82
83
84
85
86#define XFS_DQ_USER 0x0001
87#define XFS_DQ_PROJ 0x0002
88#define XFS_DQ_GROUP 0x0004
89#define XFS_DQ_DIRTY 0x0008
90#define XFS_DQ_WANT 0x0010
91#define XFS_DQ_INACTIVE 0x0020
92
93#define XFS_DQ_ALLTYPES (XFS_DQ_USER|XFS_DQ_PROJ|XFS_DQ_GROUP)
94
95
96
97
98
99#define XFS_DQUOT_LOGRES(mp) (sizeof(xfs_disk_dquot_t) * 3)
100
101
102
103
104
105
106
107
108
109
110
111
112typedef struct xfs_dq_logformat {
113 __uint16_t qlf_type;
114 __uint16_t qlf_size;
115 xfs_dqid_t qlf_id;
116 __int64_t qlf_blkno;
117 __int32_t qlf_len;
118 __uint32_t qlf_boffset;
119} xfs_dq_logformat_t;
120
121
122
123
124
125
126
127
128
129typedef struct xfs_qoff_logformat {
130 unsigned short qf_type;
131 unsigned short qf_size;
132 unsigned int qf_flags;
133 char qf_pad[12];
134} xfs_qoff_logformat_t;
135
136
137
138
139
140#define XFS_UQUOTA_ACCT 0x0001
141#define XFS_UQUOTA_ENFD 0x0002
142#define XFS_UQUOTA_CHKD 0x0004
143#define XFS_PQUOTA_ACCT 0x0008
144#define XFS_OQUOTA_ENFD 0x0010
145#define XFS_OQUOTA_CHKD 0x0020
146#define XFS_GQUOTA_ACCT 0x0040
147
148
149
150
151#define XFS_ALL_QUOTA_ACCT \
152 (XFS_UQUOTA_ACCT | XFS_GQUOTA_ACCT | XFS_PQUOTA_ACCT)
153#define XFS_ALL_QUOTA_ENFD (XFS_UQUOTA_ENFD | XFS_OQUOTA_ENFD)
154#define XFS_ALL_QUOTA_CHKD (XFS_UQUOTA_CHKD | XFS_OQUOTA_CHKD)
155
156#define XFS_IS_QUOTA_RUNNING(mp) ((mp)->m_qflags & XFS_ALL_QUOTA_ACCT)
157#define XFS_IS_UQUOTA_RUNNING(mp) ((mp)->m_qflags & XFS_UQUOTA_ACCT)
158#define XFS_IS_PQUOTA_RUNNING(mp) ((mp)->m_qflags & XFS_PQUOTA_ACCT)
159#define XFS_IS_GQUOTA_RUNNING(mp) ((mp)->m_qflags & XFS_GQUOTA_ACCT)
160#define XFS_IS_UQUOTA_ENFORCED(mp) ((mp)->m_qflags & XFS_UQUOTA_ENFD)
161#define XFS_IS_OQUOTA_ENFORCED(mp) ((mp)->m_qflags & XFS_OQUOTA_ENFD)
162
163
164
165
166
167
168#define XFS_UQUOTA_ACTIVE 0x0100
169#define XFS_PQUOTA_ACTIVE 0x0200
170#define XFS_GQUOTA_ACTIVE 0x0400
171
172
173
174
175
176#define XFS_IS_QUOTA_ON(mp) ((mp)->m_qflags & (XFS_UQUOTA_ACTIVE | \
177 XFS_GQUOTA_ACTIVE | \
178 XFS_PQUOTA_ACTIVE))
179#define XFS_IS_OQUOTA_ON(mp) ((mp)->m_qflags & (XFS_GQUOTA_ACTIVE | \
180 XFS_PQUOTA_ACTIVE))
181#define XFS_IS_UQUOTA_ON(mp) ((mp)->m_qflags & XFS_UQUOTA_ACTIVE)
182#define XFS_IS_GQUOTA_ON(mp) ((mp)->m_qflags & XFS_GQUOTA_ACTIVE)
183#define XFS_IS_PQUOTA_ON(mp) ((mp)->m_qflags & XFS_PQUOTA_ACTIVE)
184
185
186
187
188
189
190#define XFS_QMOPT_DQALLOC 0x0000002
191#define XFS_QMOPT_UQUOTA 0x0000004
192#define XFS_QMOPT_PQUOTA 0x0000008
193#define XFS_QMOPT_FORCE_RES 0x0000010
194#define XFS_QMOPT_DQSUSER 0x0000020
195#define XFS_QMOPT_SBVERSION 0x0000040
196#define XFS_QMOPT_QUOTAOFF 0x0000080
197#define XFS_QMOPT_UMOUNTING 0x0000100
198#define XFS_QMOPT_DOLOG 0x0000200
199#define XFS_QMOPT_DOWARN 0x0000400
200#define XFS_QMOPT_DQREPAIR 0x0001000
201#define XFS_QMOPT_GQUOTA 0x0002000
202#define XFS_QMOPT_ENOSPC 0x0004000
203
204
205
206
207
208#define XFS_QMOPT_RES_REGBLKS 0x0010000
209#define XFS_QMOPT_RES_RTBLKS 0x0020000
210#define XFS_QMOPT_BCOUNT 0x0040000
211#define XFS_QMOPT_ICOUNT 0x0080000
212#define XFS_QMOPT_RTBCOUNT 0x0100000
213#define XFS_QMOPT_DELBCOUNT 0x0200000
214#define XFS_QMOPT_DELRTBCOUNT 0x0400000
215#define XFS_QMOPT_RES_INOS 0x0800000
216
217
218
219
220#define XFS_QMOPT_SYNC 0x1000000
221#define XFS_QMOPT_ASYNC 0x2000000
222#define XFS_QMOPT_DELWRI 0x4000000
223
224
225
226
227#define XFS_QMOPT_INHERIT 0x8000000
228
229
230
231
232#define XFS_TRANS_DQ_RES_BLKS XFS_QMOPT_RES_REGBLKS
233#define XFS_TRANS_DQ_RES_RTBLKS XFS_QMOPT_RES_RTBLKS
234#define XFS_TRANS_DQ_RES_INOS XFS_QMOPT_RES_INOS
235#define XFS_TRANS_DQ_BCOUNT XFS_QMOPT_BCOUNT
236#define XFS_TRANS_DQ_DELBCOUNT XFS_QMOPT_DELBCOUNT
237#define XFS_TRANS_DQ_ICOUNT XFS_QMOPT_ICOUNT
238#define XFS_TRANS_DQ_RTBCOUNT XFS_QMOPT_RTBCOUNT
239#define XFS_TRANS_DQ_DELRTBCOUNT XFS_QMOPT_DELRTBCOUNT
240
241
242#define XFS_QMOPT_QUOTALL \
243 (XFS_QMOPT_UQUOTA | XFS_QMOPT_PQUOTA | XFS_QMOPT_GQUOTA)
244#define XFS_QMOPT_RESBLK_MASK (XFS_QMOPT_RES_REGBLKS | XFS_QMOPT_RES_RTBLKS)
245
246#ifdef __KERNEL__
247
248
249
250
251
252
253
254
255
256#define XFS_NOT_DQATTACHED(mp, ip) ((XFS_IS_UQUOTA_ON(mp) &&\
257 (ip)->i_udquot == NULL) || \
258 (XFS_IS_OQUOTA_ON(mp) && \
259 (ip)->i_gdquot == NULL))
260
261#define XFS_QM_NEED_QUOTACHECK(mp) \
262 ((XFS_IS_UQUOTA_ON(mp) && \
263 (mp->m_sb.sb_qflags & XFS_UQUOTA_CHKD) == 0) || \
264 (XFS_IS_GQUOTA_ON(mp) && \
265 ((mp->m_sb.sb_qflags & XFS_OQUOTA_CHKD) == 0 || \
266 (mp->m_sb.sb_qflags & XFS_PQUOTA_ACCT))) || \
267 (XFS_IS_PQUOTA_ON(mp) && \
268 ((mp->m_sb.sb_qflags & XFS_OQUOTA_CHKD) == 0 || \
269 (mp->m_sb.sb_qflags & XFS_GQUOTA_ACCT))))
270
271#define XFS_MOUNT_QUOTA_SET1 (XFS_UQUOTA_ACCT|XFS_UQUOTA_ENFD|\
272 XFS_UQUOTA_CHKD|XFS_PQUOTA_ACCT|\
273 XFS_OQUOTA_ENFD|XFS_OQUOTA_CHKD)
274
275#define XFS_MOUNT_QUOTA_SET2 (XFS_UQUOTA_ACCT|XFS_UQUOTA_ENFD|\
276 XFS_UQUOTA_CHKD|XFS_GQUOTA_ACCT|\
277 XFS_OQUOTA_ENFD|XFS_OQUOTA_CHKD)
278
279#define XFS_MOUNT_QUOTA_ALL (XFS_UQUOTA_ACCT|XFS_UQUOTA_ENFD|\
280 XFS_UQUOTA_CHKD|XFS_PQUOTA_ACCT|\
281 XFS_OQUOTA_ENFD|XFS_OQUOTA_CHKD|\
282 XFS_GQUOTA_ACCT)
283
284
285
286
287
288
289typedef struct xfs_dqtrx {
290 struct xfs_dquot *qt_dquot;
291 ulong qt_blk_res;
292 ulong qt_blk_res_used;
293 ulong qt_ino_res;
294 ulong qt_ino_res_used;
295 long qt_bcount_delta;
296 long qt_delbcnt_delta;
297 long qt_icount_delta;
298 ulong qt_rtblk_res;
299 ulong qt_rtblk_res_used;
300 long qt_rtbcount_delta;
301 long qt_delrtb_delta;
302} xfs_dqtrx_t;
303
304#ifdef CONFIG_XFS_QUOTA
305extern void xfs_trans_dup_dqinfo(struct xfs_trans *, struct xfs_trans *);
306extern void xfs_trans_free_dqinfo(struct xfs_trans *);
307extern void xfs_trans_mod_dquot_byino(struct xfs_trans *, struct xfs_inode *,
308 uint, long);
309extern void xfs_trans_apply_dquot_deltas(struct xfs_trans *);
310extern void xfs_trans_unreserve_and_mod_dquots(struct xfs_trans *);
311extern int xfs_trans_reserve_quota_nblks(struct xfs_trans *,
312 struct xfs_inode *, long, long, uint);
313extern int xfs_trans_reserve_quota_bydquots(struct xfs_trans *,
314 struct xfs_mount *, struct xfs_dquot *,
315 struct xfs_dquot *, long, long, uint);
316
317extern int xfs_qm_vop_dqalloc(struct xfs_inode *, uid_t, gid_t, prid_t, uint,
318 struct xfs_dquot **, struct xfs_dquot **);
319extern void xfs_qm_vop_create_dqattach(struct xfs_trans *, struct xfs_inode *,
320 struct xfs_dquot *, struct xfs_dquot *);
321extern int xfs_qm_vop_rename_dqattach(struct xfs_inode **);
322extern struct xfs_dquot *xfs_qm_vop_chown(struct xfs_trans *,
323 struct xfs_inode *, struct xfs_dquot **, struct xfs_dquot *);
324extern int xfs_qm_vop_chown_reserve(struct xfs_trans *, struct xfs_inode *,
325 struct xfs_dquot *, struct xfs_dquot *, uint);
326extern int xfs_qm_dqattach(struct xfs_inode *, uint);
327extern int xfs_qm_dqattach_locked(struct xfs_inode *, uint);
328extern void xfs_qm_dqdetach(struct xfs_inode *);
329extern void xfs_qm_dqrele(struct xfs_dquot *);
330extern void xfs_qm_statvfs(struct xfs_inode *, struct kstatfs *);
331extern int xfs_qm_sync(struct xfs_mount *, int);
332extern int xfs_qm_newmount(struct xfs_mount *, uint *, uint *);
333extern void xfs_qm_mount_quotas(struct xfs_mount *);
334extern void xfs_qm_unmount(struct xfs_mount *);
335extern void xfs_qm_unmount_quotas(struct xfs_mount *);
336
337#else
338static inline int
339xfs_qm_vop_dqalloc(struct xfs_inode *ip, uid_t uid, gid_t gid, prid_t prid,
340 uint flags, struct xfs_dquot **udqp, struct xfs_dquot **gdqp)
341{
342 *udqp = NULL;
343 *gdqp = NULL;
344 return 0;
345}
346#define xfs_trans_dup_dqinfo(tp, tp2)
347#define xfs_trans_free_dqinfo(tp)
348#define xfs_trans_mod_dquot_byino(tp, ip, fields, delta)
349#define xfs_trans_apply_dquot_deltas(tp)
350#define xfs_trans_unreserve_and_mod_dquots(tp)
351#define xfs_trans_reserve_quota_nblks(tp, ip, nblks, ninos, flags) (0)
352#define xfs_trans_reserve_quota_bydquots(tp, mp, u, g, nb, ni, fl) (0)
353#define xfs_qm_vop_create_dqattach(tp, ip, u, g)
354#define xfs_qm_vop_rename_dqattach(it) (0)
355#define xfs_qm_vop_chown(tp, ip, old, new) (NULL)
356#define xfs_qm_vop_chown_reserve(tp, ip, u, g, fl) (0)
357#define xfs_qm_dqattach(ip, fl) (0)
358#define xfs_qm_dqattach_locked(ip, fl) (0)
359#define xfs_qm_dqdetach(ip)
360#define xfs_qm_dqrele(d)
361#define xfs_qm_statvfs(ip, s)
362#define xfs_qm_sync(mp, fl) (0)
363#define xfs_qm_newmount(mp, a, b) (0)
364#define xfs_qm_mount_quotas(mp)
365#define xfs_qm_unmount(mp)
366#define xfs_qm_unmount_quotas(mp) (0)
367#endif
368
369#define xfs_trans_unreserve_quota_nblks(tp, ip, nblks, ninos, flags) \
370 xfs_trans_reserve_quota_nblks(tp, ip, -(nblks), -(ninos), flags)
371#define xfs_trans_reserve_quota(tp, mp, ud, gd, nb, ni, f) \
372 xfs_trans_reserve_quota_bydquots(tp, mp, ud, gd, nb, ni, \
373 f | XFS_QMOPT_RES_REGBLKS)
374
375extern int xfs_qm_dqcheck(xfs_disk_dquot_t *, xfs_dqid_t, uint, uint, char *);
376extern int xfs_mount_reset_sbqflags(struct xfs_mount *);
377
378#endif
379#endif
380