diff options
Diffstat (limited to 'fs/xfs/quota/xfs_dquot.h')
-rw-r--r-- | fs/xfs/quota/xfs_dquot.h | 224 |
1 files changed, 224 insertions, 0 deletions
diff --git a/fs/xfs/quota/xfs_dquot.h b/fs/xfs/quota/xfs_dquot.h new file mode 100644 index 000000000000..0c3fe3175baa --- /dev/null +++ b/fs/xfs/quota/xfs_dquot.h | |||
@@ -0,0 +1,224 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2000-2002 Silicon Graphics, Inc. All Rights Reserved. | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify it | ||
5 | * under the terms of version 2 of the GNU General Public License as | ||
6 | * published by the Free Software Foundation. | ||
7 | * | ||
8 | * This program is distributed in the hope that it would be useful, but | ||
9 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | ||
11 | * | ||
12 | * Further, this software is distributed without any warranty that it is | ||
13 | * free of the rightful claim of any third person regarding infringement | ||
14 | * or the like. Any license provided herein, whether implied or | ||
15 | * otherwise, applies only to this software file. Patent licenses, if | ||
16 | * any, provided herein do not apply to combinations of this program with | ||
17 | * other software, or any other product whatsoever. | ||
18 | * | ||
19 | * You should have received a copy of the GNU General Public License along | ||
20 | * with this program; if not, write the Free Software Foundation, Inc., 59 | ||
21 | * Temple Place - Suite 330, Boston MA 02111-1307, USA. | ||
22 | * | ||
23 | * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy, | ||
24 | * Mountain View, CA 94043, or: | ||
25 | * | ||
26 | * http://www.sgi.com | ||
27 | * | ||
28 | * For further information regarding this notice, see: | ||
29 | * | ||
30 | * http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/ | ||
31 | */ | ||
32 | #ifndef __XFS_DQUOT_H__ | ||
33 | #define __XFS_DQUOT_H__ | ||
34 | |||
35 | /* | ||
36 | * Dquots are structures that hold quota information about a user or a group, | ||
37 | * much like inodes are for files. In fact, dquots share many characteristics | ||
38 | * with inodes. However, dquots can also be a centralized resource, relative | ||
39 | * to a collection of inodes. In this respect, dquots share some characteristics | ||
40 | * of the superblock. | ||
41 | * XFS dquots exploit both those in its algorithms. They make every attempt | ||
42 | * to not be a bottleneck when quotas are on and have minimal impact, if any, | ||
43 | * when quotas are off. | ||
44 | */ | ||
45 | |||
46 | /* | ||
47 | * The hash chain headers (hash buckets) | ||
48 | */ | ||
49 | typedef struct xfs_dqhash { | ||
50 | struct xfs_dquot *qh_next; | ||
51 | mutex_t qh_lock; | ||
52 | uint qh_version; /* ever increasing version */ | ||
53 | uint qh_nelems; /* number of dquots on the list */ | ||
54 | } xfs_dqhash_t; | ||
55 | |||
56 | typedef struct xfs_dqlink { | ||
57 | struct xfs_dquot *ql_next; /* forward link */ | ||
58 | struct xfs_dquot **ql_prevp; /* pointer to prev ql_next */ | ||
59 | } xfs_dqlink_t; | ||
60 | |||
61 | struct xfs_mount; | ||
62 | struct xfs_trans; | ||
63 | |||
64 | /* | ||
65 | * This is the marker which is designed to occupy the first few | ||
66 | * bytes of the xfs_dquot_t structure. Even inside this, the freelist pointers | ||
67 | * must come first. | ||
68 | * This serves as the marker ("sentinel") when we have to restart list | ||
69 | * iterations because of locking considerations. | ||
70 | */ | ||
71 | typedef struct xfs_dqmarker { | ||
72 | struct xfs_dquot*dqm_flnext; /* link to freelist: must be first */ | ||
73 | struct xfs_dquot*dqm_flprev; | ||
74 | xfs_dqlink_t dqm_mplist; /* link to mount's list of dquots */ | ||
75 | xfs_dqlink_t dqm_hashlist; /* link to the hash chain */ | ||
76 | uint dqm_flags; /* various flags (XFS_DQ_*) */ | ||
77 | } xfs_dqmarker_t; | ||
78 | |||
79 | /* | ||
80 | * The incore dquot structure | ||
81 | */ | ||
82 | typedef struct xfs_dquot { | ||
83 | xfs_dqmarker_t q_lists; /* list ptrs, q_flags (marker) */ | ||
84 | xfs_dqhash_t *q_hash; /* the hashchain header */ | ||
85 | struct xfs_mount*q_mount; /* filesystem this relates to */ | ||
86 | struct xfs_trans*q_transp; /* trans this belongs to currently */ | ||
87 | uint q_nrefs; /* # active refs from inodes */ | ||
88 | xfs_daddr_t q_blkno; /* blkno of dquot buffer */ | ||
89 | int q_bufoffset; /* off of dq in buffer (# dquots) */ | ||
90 | xfs_fileoff_t q_fileoffset; /* offset in quotas file */ | ||
91 | |||
92 | struct xfs_dquot*q_gdquot; /* group dquot, hint only */ | ||
93 | xfs_disk_dquot_t q_core; /* actual usage & quotas */ | ||
94 | xfs_dq_logitem_t q_logitem; /* dquot log item */ | ||
95 | xfs_qcnt_t q_res_bcount; /* total regular nblks used+reserved */ | ||
96 | xfs_qcnt_t q_res_icount; /* total inos allocd+reserved */ | ||
97 | xfs_qcnt_t q_res_rtbcount;/* total realtime blks used+reserved */ | ||
98 | mutex_t q_qlock; /* quota lock */ | ||
99 | sema_t q_flock; /* flush lock */ | ||
100 | uint q_pincount; /* pin count for this dquot */ | ||
101 | sv_t q_pinwait; /* sync var for pinning */ | ||
102 | #ifdef XFS_DQUOT_TRACE | ||
103 | struct ktrace *q_trace; /* trace header structure */ | ||
104 | #endif | ||
105 | } xfs_dquot_t; | ||
106 | |||
107 | |||
108 | #define dq_flnext q_lists.dqm_flnext | ||
109 | #define dq_flprev q_lists.dqm_flprev | ||
110 | #define dq_mplist q_lists.dqm_mplist | ||
111 | #define dq_hashlist q_lists.dqm_hashlist | ||
112 | #define dq_flags q_lists.dqm_flags | ||
113 | |||
114 | #define XFS_DQHOLD(dqp) ((dqp)->q_nrefs++) | ||
115 | |||
116 | /* | ||
117 | * Quota Accounting flags | ||
118 | */ | ||
119 | #define XFS_ALL_QUOTA_ACCT (XFS_UQUOTA_ACCT | XFS_GQUOTA_ACCT) | ||
120 | #define XFS_ALL_QUOTA_ENFD (XFS_UQUOTA_ENFD | XFS_GQUOTA_ENFD) | ||
121 | #define XFS_ALL_QUOTA_CHKD (XFS_UQUOTA_CHKD | XFS_GQUOTA_CHKD) | ||
122 | #define XFS_ALL_QUOTA_ACTV (XFS_UQUOTA_ACTIVE | XFS_GQUOTA_ACTIVE) | ||
123 | #define XFS_ALL_QUOTA_ACCT_ENFD (XFS_UQUOTA_ACCT|XFS_UQUOTA_ENFD|\ | ||
124 | XFS_GQUOTA_ACCT|XFS_GQUOTA_ENFD) | ||
125 | |||
126 | #define XFS_IS_QUOTA_RUNNING(mp) ((mp)->m_qflags & XFS_ALL_QUOTA_ACCT) | ||
127 | #define XFS_IS_UQUOTA_RUNNING(mp) ((mp)->m_qflags & XFS_UQUOTA_ACCT) | ||
128 | #define XFS_IS_GQUOTA_RUNNING(mp) ((mp)->m_qflags & XFS_GQUOTA_ACCT) | ||
129 | |||
130 | /* | ||
131 | * Quota Limit Enforcement flags | ||
132 | */ | ||
133 | #define XFS_IS_QUOTA_ENFORCED(mp) ((mp)->m_qflags & XFS_ALL_QUOTA_ENFD) | ||
134 | #define XFS_IS_UQUOTA_ENFORCED(mp) ((mp)->m_qflags & XFS_UQUOTA_ENFD) | ||
135 | #define XFS_IS_GQUOTA_ENFORCED(mp) ((mp)->m_qflags & XFS_GQUOTA_ENFD) | ||
136 | |||
137 | #ifdef DEBUG | ||
138 | static inline int | ||
139 | XFS_DQ_IS_LOCKED(xfs_dquot_t *dqp) | ||
140 | { | ||
141 | if (mutex_trylock(&dqp->q_qlock)) { | ||
142 | mutex_unlock(&dqp->q_qlock); | ||
143 | return 0; | ||
144 | } | ||
145 | return 1; | ||
146 | } | ||
147 | #endif | ||
148 | |||
149 | |||
150 | /* | ||
151 | * The following three routines simply manage the q_flock | ||
152 | * semaphore embedded in the dquot. This semaphore synchronizes | ||
153 | * processes attempting to flush the in-core dquot back to disk. | ||
154 | */ | ||
155 | #define xfs_dqflock(dqp) { psema(&((dqp)->q_flock), PINOD | PRECALC);\ | ||
156 | (dqp)->dq_flags |= XFS_DQ_FLOCKED; } | ||
157 | #define xfs_dqfunlock(dqp) { ASSERT(valusema(&((dqp)->q_flock)) <= 0); \ | ||
158 | vsema(&((dqp)->q_flock)); \ | ||
159 | (dqp)->dq_flags &= ~(XFS_DQ_FLOCKED); } | ||
160 | |||
161 | #define XFS_DQ_PINLOCK(dqp) mutex_spinlock( \ | ||
162 | &(XFS_DQ_TO_QINF(dqp)->qi_pinlock)) | ||
163 | #define XFS_DQ_PINUNLOCK(dqp, s) mutex_spinunlock( \ | ||
164 | &(XFS_DQ_TO_QINF(dqp)->qi_pinlock), s) | ||
165 | |||
166 | #define XFS_DQ_IS_FLUSH_LOCKED(dqp) (valusema(&((dqp)->q_flock)) <= 0) | ||
167 | #define XFS_DQ_IS_ON_FREELIST(dqp) ((dqp)->dq_flnext != (dqp)) | ||
168 | #define XFS_DQ_IS_DIRTY(dqp) ((dqp)->dq_flags & XFS_DQ_DIRTY) | ||
169 | #define XFS_QM_ISUDQ(dqp) ((dqp)->dq_flags & XFS_DQ_USER) | ||
170 | #define XFS_DQ_TO_QINF(dqp) ((dqp)->q_mount->m_quotainfo) | ||
171 | #define XFS_DQ_TO_QIP(dqp) (XFS_QM_ISUDQ(dqp) ? \ | ||
172 | XFS_DQ_TO_QINF(dqp)->qi_uquotaip : \ | ||
173 | XFS_DQ_TO_QINF(dqp)->qi_gquotaip) | ||
174 | |||
175 | #define XFS_IS_THIS_QUOTA_OFF(d) (! (XFS_QM_ISUDQ(d) ? \ | ||
176 | (XFS_IS_UQUOTA_ON((d)->q_mount)) : \ | ||
177 | (XFS_IS_GQUOTA_ON((d)->q_mount)))) | ||
178 | |||
179 | #ifdef XFS_DQUOT_TRACE | ||
180 | /* | ||
181 | * Dquot Tracing stuff. | ||
182 | */ | ||
183 | #define DQUOT_TRACE_SIZE 64 | ||
184 | #define DQUOT_KTRACE_ENTRY 1 | ||
185 | |||
186 | extern void __xfs_dqtrace_entry(xfs_dquot_t *dqp, char *func, | ||
187 | void *, xfs_inode_t *); | ||
188 | #define xfs_dqtrace_entry_ino(a,b,ip) \ | ||
189 | __xfs_dqtrace_entry((a), (b), (void*)__return_address, (ip)) | ||
190 | #define xfs_dqtrace_entry(a,b) \ | ||
191 | __xfs_dqtrace_entry((a), (b), (void*)__return_address, NULL) | ||
192 | #else | ||
193 | #define xfs_dqtrace_entry(a,b) | ||
194 | #define xfs_dqtrace_entry_ino(a,b,ip) | ||
195 | #endif | ||
196 | |||
197 | #ifdef QUOTADEBUG | ||
198 | extern void xfs_qm_dqprint(xfs_dquot_t *); | ||
199 | #else | ||
200 | #define xfs_qm_dqprint(a) | ||
201 | #endif | ||
202 | |||
203 | extern void xfs_qm_dqdestroy(xfs_dquot_t *); | ||
204 | extern int xfs_qm_dqflush(xfs_dquot_t *, uint); | ||
205 | extern int xfs_qm_dqpurge(xfs_dquot_t *, uint); | ||
206 | extern void xfs_qm_dqunpin_wait(xfs_dquot_t *); | ||
207 | extern int xfs_qm_dqlock_nowait(xfs_dquot_t *); | ||
208 | extern int xfs_qm_dqflock_nowait(xfs_dquot_t *); | ||
209 | extern void xfs_qm_dqflock_pushbuf_wait(xfs_dquot_t *dqp); | ||
210 | extern void xfs_qm_adjust_dqtimers(xfs_mount_t *, | ||
211 | xfs_disk_dquot_t *); | ||
212 | extern void xfs_qm_adjust_dqlimits(xfs_mount_t *, | ||
213 | xfs_disk_dquot_t *); | ||
214 | extern int xfs_qm_dqwarn(xfs_disk_dquot_t *, uint); | ||
215 | extern int xfs_qm_dqget(xfs_mount_t *, xfs_inode_t *, | ||
216 | xfs_dqid_t, uint, uint, xfs_dquot_t **); | ||
217 | extern void xfs_qm_dqput(xfs_dquot_t *); | ||
218 | extern void xfs_qm_dqrele(xfs_dquot_t *); | ||
219 | extern void xfs_dqlock(xfs_dquot_t *); | ||
220 | extern void xfs_dqlock2(xfs_dquot_t *, xfs_dquot_t *); | ||
221 | extern void xfs_dqunlock(xfs_dquot_t *); | ||
222 | extern void xfs_dqunlock_nonotify(xfs_dquot_t *); | ||
223 | |||
224 | #endif /* __XFS_DQUOT_H__ */ | ||