diff options
author | Nathan Scott <nathans@sgi.com> | 2005-06-21 01:38:48 -0400 |
---|---|---|
committer | Nathan Scott <nathans@sgi.com> | 2005-06-21 01:38:48 -0400 |
commit | c8ad20ffeb592d66ea869c57f8c525a9d727c67b (patch) | |
tree | 3306edfe984170bc881a1d7fbeab29b4b59f0305 /fs/xfs/xfs_quota.h | |
parent | 8401e9631c26dca9ebbc6997ac445fd49b06c79e (diff) |
[XFS] Add support for project quota, based on Dan Knappes earlier work.
SGI-PV: 932952
SGI-Modid: xfs-linux:xfs-kern:22805a
Signed-off-by: Nathan Scott <nathans@sgi.com>
Diffstat (limited to 'fs/xfs/xfs_quota.h')
-rw-r--r-- | fs/xfs/xfs_quota.h | 61 |
1 files changed, 41 insertions, 20 deletions
diff --git a/fs/xfs/xfs_quota.h b/fs/xfs/xfs_quota.h index 703ec4efcb41..341cb4604c66 100644 --- a/fs/xfs/xfs_quota.h +++ b/fs/xfs/xfs_quota.h | |||
@@ -96,7 +96,7 @@ typedef struct xfs_dqblk { | |||
96 | * flags for q_flags field in the dquot. | 96 | * flags for q_flags field in the dquot. |
97 | */ | 97 | */ |
98 | #define XFS_DQ_USER 0x0001 /* a user quota */ | 98 | #define XFS_DQ_USER 0x0001 /* a user quota */ |
99 | /* #define XFS_DQ_PROJ 0x0002 -- project quota (IRIX) */ | 99 | #define XFS_DQ_PROJ 0x0002 /* project quota */ |
100 | #define XFS_DQ_GROUP 0x0004 /* a group quota */ | 100 | #define XFS_DQ_GROUP 0x0004 /* a group quota */ |
101 | #define XFS_DQ_FLOCKED 0x0008 /* flush lock taken */ | 101 | #define XFS_DQ_FLOCKED 0x0008 /* flush lock taken */ |
102 | #define XFS_DQ_DIRTY 0x0010 /* dquot is dirty */ | 102 | #define XFS_DQ_DIRTY 0x0010 /* dquot is dirty */ |
@@ -104,6 +104,8 @@ typedef struct xfs_dqblk { | |||
104 | #define XFS_DQ_INACTIVE 0x0040 /* dq off mplist & hashlist */ | 104 | #define XFS_DQ_INACTIVE 0x0040 /* dq off mplist & hashlist */ |
105 | #define XFS_DQ_MARKER 0x0080 /* sentinel */ | 105 | #define XFS_DQ_MARKER 0x0080 /* sentinel */ |
106 | 106 | ||
107 | #define XFS_DQ_ALLTYPES (XFS_DQ_USER|XFS_DQ_PROJ|XFS_DQ_GROUP) | ||
108 | |||
107 | /* | 109 | /* |
108 | * In the worst case, when both user and group quotas are on, | 110 | * In the worst case, when both user and group quotas are on, |
109 | * we can have a max of three dquots changing in a single transaction. | 111 | * we can have a max of three dquots changing in a single transaction. |
@@ -124,7 +126,7 @@ typedef struct xfs_dqblk { | |||
124 | typedef struct xfs_dq_logformat { | 126 | typedef struct xfs_dq_logformat { |
125 | __uint16_t qlf_type; /* dquot log item type */ | 127 | __uint16_t qlf_type; /* dquot log item type */ |
126 | __uint16_t qlf_size; /* size of this item */ | 128 | __uint16_t qlf_size; /* size of this item */ |
127 | xfs_dqid_t qlf_id; /* usr/grp id number : 32 bits */ | 129 | xfs_dqid_t qlf_id; /* usr/grp/proj id : 32 bits */ |
128 | __int64_t qlf_blkno; /* blkno of dquot buffer */ | 130 | __int64_t qlf_blkno; /* blkno of dquot buffer */ |
129 | __int32_t qlf_len; /* len of dquot buffer */ | 131 | __int32_t qlf_len; /* len of dquot buffer */ |
130 | __uint32_t qlf_boffset; /* off of dquot in buffer */ | 132 | __uint32_t qlf_boffset; /* off of dquot in buffer */ |
@@ -152,9 +154,9 @@ typedef struct xfs_qoff_logformat { | |||
152 | #define XFS_UQUOTA_ACCT 0x0001 /* user quota accounting ON */ | 154 | #define XFS_UQUOTA_ACCT 0x0001 /* user quota accounting ON */ |
153 | #define XFS_UQUOTA_ENFD 0x0002 /* user quota limits enforced */ | 155 | #define XFS_UQUOTA_ENFD 0x0002 /* user quota limits enforced */ |
154 | #define XFS_UQUOTA_CHKD 0x0004 /* quotacheck run on usr quotas */ | 156 | #define XFS_UQUOTA_CHKD 0x0004 /* quotacheck run on usr quotas */ |
155 | #define XFS_PQUOTA_ACCT 0x0008 /* (IRIX) project quota accounting ON */ | 157 | #define XFS_PQUOTA_ACCT 0x0008 /* project quota accounting ON */ |
156 | #define XFS_GQUOTA_ENFD 0x0010 /* group quota limits enforced */ | 158 | #define XFS_OQUOTA_ENFD 0x0010 /* other (grp/prj) quota limits enforced */ |
157 | #define XFS_GQUOTA_CHKD 0x0020 /* quotacheck run on grp quotas */ | 159 | #define XFS_OQUOTA_CHKD 0x0020 /* quotacheck run on other (grp/prj) quotas */ |
158 | #define XFS_GQUOTA_ACCT 0x0040 /* group quota accounting ON */ | 160 | #define XFS_GQUOTA_ACCT 0x0040 /* group quota accounting ON */ |
159 | 161 | ||
160 | /* | 162 | /* |
@@ -162,17 +164,22 @@ typedef struct xfs_qoff_logformat { | |||
162 | * are in the process of getting turned off. These flags are in m_qflags but | 164 | * are in the process of getting turned off. These flags are in m_qflags but |
163 | * never in sb_qflags. | 165 | * never in sb_qflags. |
164 | */ | 166 | */ |
165 | #define XFS_UQUOTA_ACTIVE 0x0080 /* uquotas are being turned off */ | 167 | #define XFS_UQUOTA_ACTIVE 0x0100 /* uquotas are being turned off */ |
166 | #define XFS_GQUOTA_ACTIVE 0x0100 /* gquotas are being turned off */ | 168 | #define XFS_PQUOTA_ACTIVE 0x0200 /* pquotas are being turned off */ |
169 | #define XFS_GQUOTA_ACTIVE 0x0400 /* gquotas are being turned off */ | ||
167 | 170 | ||
168 | /* | 171 | /* |
169 | * Checking XFS_IS_*QUOTA_ON() while holding any inode lock guarantees | 172 | * Checking XFS_IS_*QUOTA_ON() while holding any inode lock guarantees |
170 | * quota will be not be switched off as long as that inode lock is held. | 173 | * quota will be not be switched off as long as that inode lock is held. |
171 | */ | 174 | */ |
172 | #define XFS_IS_QUOTA_ON(mp) ((mp)->m_qflags & (XFS_UQUOTA_ACTIVE | \ | 175 | #define XFS_IS_QUOTA_ON(mp) ((mp)->m_qflags & (XFS_UQUOTA_ACTIVE | \ |
173 | XFS_GQUOTA_ACTIVE)) | 176 | XFS_GQUOTA_ACTIVE | \ |
177 | XFS_PQUOTA_ACTIVE)) | ||
178 | #define XFS_IS_OQUOTA_ON(mp) ((mp)->m_qflags & (XFS_GQUOTA_ACTIVE | \ | ||
179 | XFS_PQUOTA_ACTIVE)) | ||
174 | #define XFS_IS_UQUOTA_ON(mp) ((mp)->m_qflags & XFS_UQUOTA_ACTIVE) | 180 | #define XFS_IS_UQUOTA_ON(mp) ((mp)->m_qflags & XFS_UQUOTA_ACTIVE) |
175 | #define XFS_IS_GQUOTA_ON(mp) ((mp)->m_qflags & XFS_GQUOTA_ACTIVE) | 181 | #define XFS_IS_GQUOTA_ON(mp) ((mp)->m_qflags & XFS_GQUOTA_ACTIVE) |
182 | #define XFS_IS_PQUOTA_ON(mp) ((mp)->m_qflags & XFS_PQUOTA_ACTIVE) | ||
176 | 183 | ||
177 | /* | 184 | /* |
178 | * Flags to tell various functions what to do. Not all of these are meaningful | 185 | * Flags to tell various functions what to do. Not all of these are meaningful |
@@ -182,7 +189,7 @@ typedef struct xfs_qoff_logformat { | |||
182 | #define XFS_QMOPT_DQLOCK 0x0000001 /* dqlock */ | 189 | #define XFS_QMOPT_DQLOCK 0x0000001 /* dqlock */ |
183 | #define XFS_QMOPT_DQALLOC 0x0000002 /* alloc dquot ondisk if needed */ | 190 | #define XFS_QMOPT_DQALLOC 0x0000002 /* alloc dquot ondisk if needed */ |
184 | #define XFS_QMOPT_UQUOTA 0x0000004 /* user dquot requested */ | 191 | #define XFS_QMOPT_UQUOTA 0x0000004 /* user dquot requested */ |
185 | #define XFS_QMOPT_GQUOTA 0x0000008 /* group dquot requested */ | 192 | #define XFS_QMOPT_PQUOTA 0x0000008 /* project dquot requested */ |
186 | #define XFS_QMOPT_FORCE_RES 0x0000010 /* ignore quota limits */ | 193 | #define XFS_QMOPT_FORCE_RES 0x0000010 /* ignore quota limits */ |
187 | #define XFS_QMOPT_DQSUSER 0x0000020 /* don't cache super users dquot */ | 194 | #define XFS_QMOPT_DQSUSER 0x0000020 /* don't cache super users dquot */ |
188 | #define XFS_QMOPT_SBVERSION 0x0000040 /* change superblock version num */ | 195 | #define XFS_QMOPT_SBVERSION 0x0000040 /* change superblock version num */ |
@@ -192,6 +199,7 @@ typedef struct xfs_qoff_logformat { | |||
192 | #define XFS_QMOPT_DOWARN 0x0000400 /* increase warning cnt if necessary */ | 199 | #define XFS_QMOPT_DOWARN 0x0000400 /* increase warning cnt if necessary */ |
193 | #define XFS_QMOPT_ILOCKED 0x0000800 /* inode is already locked (excl) */ | 200 | #define XFS_QMOPT_ILOCKED 0x0000800 /* inode is already locked (excl) */ |
194 | #define XFS_QMOPT_DQREPAIR 0x0001000 /* repair dquot, if damaged. */ | 201 | #define XFS_QMOPT_DQREPAIR 0x0001000 /* repair dquot, if damaged. */ |
202 | #define XFS_QMOPT_GQUOTA 0x0002000 /* group dquot requested */ | ||
195 | 203 | ||
196 | /* | 204 | /* |
197 | * flags to xfs_trans_mod_dquot to indicate which field needs to be | 205 | * flags to xfs_trans_mod_dquot to indicate which field needs to be |
@@ -231,7 +239,8 @@ typedef struct xfs_qoff_logformat { | |||
231 | #define XFS_TRANS_DQ_DELRTBCOUNT XFS_QMOPT_DELRTBCOUNT | 239 | #define XFS_TRANS_DQ_DELRTBCOUNT XFS_QMOPT_DELRTBCOUNT |
232 | 240 | ||
233 | 241 | ||
234 | #define XFS_QMOPT_QUOTALL (XFS_QMOPT_UQUOTA|XFS_QMOPT_GQUOTA) | 242 | #define XFS_QMOPT_QUOTALL \ |
243 | (XFS_QMOPT_UQUOTA | XFS_QMOPT_PQUOTA | XFS_QMOPT_GQUOTA) | ||
235 | #define XFS_QMOPT_RESBLK_MASK (XFS_QMOPT_RES_REGBLKS | XFS_QMOPT_RES_RTBLKS) | 244 | #define XFS_QMOPT_RESBLK_MASK (XFS_QMOPT_RES_REGBLKS | XFS_QMOPT_RES_RTBLKS) |
236 | 245 | ||
237 | #ifdef __KERNEL__ | 246 | #ifdef __KERNEL__ |
@@ -246,21 +255,33 @@ typedef struct xfs_qoff_logformat { | |||
246 | */ | 255 | */ |
247 | #define XFS_NOT_DQATTACHED(mp, ip) ((XFS_IS_UQUOTA_ON(mp) &&\ | 256 | #define XFS_NOT_DQATTACHED(mp, ip) ((XFS_IS_UQUOTA_ON(mp) &&\ |
248 | (ip)->i_udquot == NULL) || \ | 257 | (ip)->i_udquot == NULL) || \ |
249 | (XFS_IS_GQUOTA_ON(mp) && \ | 258 | (XFS_IS_OQUOTA_ON(mp) && \ |
250 | (ip)->i_gdquot == NULL)) | 259 | (ip)->i_gdquot == NULL)) |
251 | 260 | ||
252 | #define XFS_QM_NEED_QUOTACHECK(mp) ((XFS_IS_UQUOTA_ON(mp) && \ | 261 | #define XFS_QM_NEED_QUOTACHECK(mp) \ |
253 | (mp->m_sb.sb_qflags & \ | 262 | ((XFS_IS_UQUOTA_ON(mp) && \ |
254 | XFS_UQUOTA_CHKD) == 0) || \ | 263 | (mp->m_sb.sb_qflags & XFS_UQUOTA_CHKD) == 0) || \ |
255 | (XFS_IS_GQUOTA_ON(mp) && \ | 264 | (XFS_IS_GQUOTA_ON(mp) && \ |
256 | (mp->m_sb.sb_qflags & \ | 265 | ((mp->m_sb.sb_qflags & XFS_OQUOTA_CHKD) == 0 || \ |
257 | XFS_GQUOTA_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) | ||
258 | 278 | ||
259 | #define XFS_MOUNT_QUOTA_ALL (XFS_UQUOTA_ACCT|XFS_UQUOTA_ENFD|\ | 279 | #define XFS_MOUNT_QUOTA_ALL (XFS_UQUOTA_ACCT|XFS_UQUOTA_ENFD|\ |
260 | XFS_UQUOTA_CHKD|XFS_GQUOTA_ACCT|\ | 280 | XFS_UQUOTA_CHKD|XFS_PQUOTA_ACCT|\ |
261 | XFS_GQUOTA_ENFD|XFS_GQUOTA_CHKD) | 281 | XFS_OQUOTA_ENFD|XFS_OQUOTA_CHKD|\ |
282 | XFS_GQUOTA_ACCT) | ||
262 | #define XFS_MOUNT_QUOTA_MASK (XFS_MOUNT_QUOTA_ALL | XFS_UQUOTA_ACTIVE | \ | 283 | #define XFS_MOUNT_QUOTA_MASK (XFS_MOUNT_QUOTA_ALL | XFS_UQUOTA_ACTIVE | \ |
263 | XFS_GQUOTA_ACTIVE) | 284 | XFS_GQUOTA_ACTIVE | XFS_PQUOTA_ACTIVE) |
264 | 285 | ||
265 | 286 | ||
266 | /* | 287 | /* |