diff options
Diffstat (limited to 'fs/xfs/quota/xfs_qm_bhv.c')
-rw-r--r-- | fs/xfs/quota/xfs_qm_bhv.c | 41 |
1 files changed, 34 insertions, 7 deletions
diff --git a/fs/xfs/quota/xfs_qm_bhv.c b/fs/xfs/quota/xfs_qm_bhv.c index 09b1171dfb83..dc3c37a1e158 100644 --- a/fs/xfs/quota/xfs_qm_bhv.c +++ b/fs/xfs/quota/xfs_qm_bhv.c | |||
@@ -71,10 +71,13 @@ | |||
71 | #define MNTOPT_NOQUOTA "noquota" /* no quotas */ | 71 | #define MNTOPT_NOQUOTA "noquota" /* no quotas */ |
72 | #define MNTOPT_USRQUOTA "usrquota" /* user quota enabled */ | 72 | #define MNTOPT_USRQUOTA "usrquota" /* user quota enabled */ |
73 | #define MNTOPT_GRPQUOTA "grpquota" /* group quota enabled */ | 73 | #define MNTOPT_GRPQUOTA "grpquota" /* group quota enabled */ |
74 | #define MNTOPT_PRJQUOTA "prjquota" /* project quota enabled */ | ||
74 | #define MNTOPT_UQUOTA "uquota" /* user quota (IRIX variant) */ | 75 | #define MNTOPT_UQUOTA "uquota" /* user quota (IRIX variant) */ |
75 | #define MNTOPT_GQUOTA "gquota" /* group quota (IRIX variant) */ | 76 | #define MNTOPT_GQUOTA "gquota" /* group quota (IRIX variant) */ |
77 | #define MNTOPT_PQUOTA "pquota" /* project quota (IRIX variant) */ | ||
76 | #define MNTOPT_UQUOTANOENF "uqnoenforce"/* user quota limit enforcement */ | 78 | #define MNTOPT_UQUOTANOENF "uqnoenforce"/* user quota limit enforcement */ |
77 | #define MNTOPT_GQUOTANOENF "gqnoenforce"/* group quota limit enforcement */ | 79 | #define MNTOPT_GQUOTANOENF "gqnoenforce"/* group quota limit enforcement */ |
80 | #define MNTOPT_PQUOTANOENF "pqnoenforce"/* project quota limit enforcement */ | ||
78 | #define MNTOPT_QUOTANOENF "qnoenforce" /* same as uqnoenforce */ | 81 | #define MNTOPT_QUOTANOENF "qnoenforce" /* same as uqnoenforce */ |
79 | 82 | ||
80 | STATIC int | 83 | STATIC int |
@@ -109,6 +112,14 @@ xfs_qm_parseargs( | |||
109 | args->flags |= XFSMNT_UQUOTA; | 112 | args->flags |= XFSMNT_UQUOTA; |
110 | args->flags &= ~XFSMNT_UQUOTAENF; | 113 | args->flags &= ~XFSMNT_UQUOTAENF; |
111 | referenced = 1; | 114 | referenced = 1; |
115 | } else if (!strcmp(this_char, MNTOPT_PQUOTA) || | ||
116 | !strcmp(this_char, MNTOPT_PRJQUOTA)) { | ||
117 | args->flags |= XFSMNT_PQUOTA | XFSMNT_PQUOTAENF; | ||
118 | referenced = 1; | ||
119 | } else if (!strcmp(this_char, MNTOPT_PQUOTANOENF)) { | ||
120 | args->flags |= XFSMNT_PQUOTA; | ||
121 | args->flags &= ~XFSMNT_PQUOTAENF; | ||
122 | referenced = 1; | ||
112 | } else if (!strcmp(this_char, MNTOPT_GQUOTA) || | 123 | } else if (!strcmp(this_char, MNTOPT_GQUOTA) || |
113 | !strcmp(this_char, MNTOPT_GRPQUOTA)) { | 124 | !strcmp(this_char, MNTOPT_GRPQUOTA)) { |
114 | args->flags |= XFSMNT_GQUOTA | XFSMNT_GQUOTAENF; | 125 | args->flags |= XFSMNT_GQUOTA | XFSMNT_GQUOTAENF; |
@@ -127,6 +138,12 @@ xfs_qm_parseargs( | |||
127 | *this_char++ = ','; | 138 | *this_char++ = ','; |
128 | } | 139 | } |
129 | 140 | ||
141 | if ((args->flags & XFSMNT_GQUOTA) && (args->flags & XFSMNT_PQUOTA)) { | ||
142 | cmn_err(CE_WARN, | ||
143 | "XFS: cannot mount with both project and group quota"); | ||
144 | return XFS_ERROR(EINVAL); | ||
145 | } | ||
146 | |||
130 | PVFS_PARSEARGS(BHV_NEXT(bhv), options, args, update, error); | 147 | PVFS_PARSEARGS(BHV_NEXT(bhv), options, args, update, error); |
131 | if (!error && !referenced) | 148 | if (!error && !referenced) |
132 | bhv_remove_vfsops(bhvtovfs(bhv), VFS_POSITION_QM); | 149 | bhv_remove_vfsops(bhvtovfs(bhv), VFS_POSITION_QM); |
@@ -148,13 +165,19 @@ xfs_qm_showargs( | |||
148 | seq_puts(m, "," MNTOPT_UQUOTANOENF); | 165 | seq_puts(m, "," MNTOPT_UQUOTANOENF); |
149 | } | 166 | } |
150 | 167 | ||
168 | if (mp->m_qflags & XFS_PQUOTA_ACCT) { | ||
169 | (mp->m_qflags & XFS_OQUOTA_ENFD) ? | ||
170 | seq_puts(m, "," MNTOPT_PRJQUOTA) : | ||
171 | seq_puts(m, "," MNTOPT_PQUOTANOENF); | ||
172 | } | ||
173 | |||
151 | if (mp->m_qflags & XFS_GQUOTA_ACCT) { | 174 | if (mp->m_qflags & XFS_GQUOTA_ACCT) { |
152 | (mp->m_qflags & XFS_GQUOTA_ENFD) ? | 175 | (mp->m_qflags & XFS_OQUOTA_ENFD) ? |
153 | seq_puts(m, "," MNTOPT_GRPQUOTA) : | 176 | seq_puts(m, "," MNTOPT_GRPQUOTA) : |
154 | seq_puts(m, "," MNTOPT_GQUOTANOENF); | 177 | seq_puts(m, "," MNTOPT_GQUOTANOENF); |
155 | } | 178 | } |
156 | 179 | ||
157 | if (!(mp->m_qflags & (XFS_UQUOTA_ACCT|XFS_GQUOTA_ACCT))) | 180 | if (!(mp->m_qflags & XFS_ALL_QUOTA_ACCT)) |
158 | seq_puts(m, "," MNTOPT_NOQUOTA); | 181 | seq_puts(m, "," MNTOPT_NOQUOTA); |
159 | 182 | ||
160 | PVFS_SHOWARGS(BHV_NEXT(bhv), m, error); | 183 | PVFS_SHOWARGS(BHV_NEXT(bhv), m, error); |
@@ -171,7 +194,7 @@ xfs_qm_mount( | |||
171 | struct xfs_mount *mp = XFS_VFSTOM(vfsp); | 194 | struct xfs_mount *mp = XFS_VFSTOM(vfsp); |
172 | int error; | 195 | int error; |
173 | 196 | ||
174 | if (args->flags & (XFSMNT_UQUOTA | XFSMNT_GQUOTA)) | 197 | if (args->flags & (XFSMNT_UQUOTA | XFSMNT_GQUOTA | XFSMNT_PQUOTA)) |
175 | xfs_qm_mount_quotainit(mp, args->flags); | 198 | xfs_qm_mount_quotainit(mp, args->flags); |
176 | PVFS_MOUNT(BHV_NEXT(bhv), args, cr, error); | 199 | PVFS_MOUNT(BHV_NEXT(bhv), args, cr, error); |
177 | return error; | 200 | return error; |
@@ -255,16 +278,17 @@ xfs_qm_newmount( | |||
255 | uint *quotaflags) | 278 | uint *quotaflags) |
256 | { | 279 | { |
257 | uint quotaondisk; | 280 | uint quotaondisk; |
258 | uint uquotaondisk = 0, gquotaondisk = 0; | 281 | uint uquotaondisk = 0, gquotaondisk = 0, pquotaondisk = 0; |
259 | 282 | ||
260 | *quotaflags = 0; | 283 | *quotaflags = 0; |
261 | *needquotamount = B_FALSE; | 284 | *needquotamount = B_FALSE; |
262 | 285 | ||
263 | quotaondisk = XFS_SB_VERSION_HASQUOTA(&mp->m_sb) && | 286 | quotaondisk = XFS_SB_VERSION_HASQUOTA(&mp->m_sb) && |
264 | mp->m_sb.sb_qflags & (XFS_UQUOTA_ACCT|XFS_GQUOTA_ACCT); | 287 | (mp->m_sb.sb_qflags & XFS_ALL_QUOTA_ACCT); |
265 | 288 | ||
266 | if (quotaondisk) { | 289 | if (quotaondisk) { |
267 | uquotaondisk = mp->m_sb.sb_qflags & XFS_UQUOTA_ACCT; | 290 | uquotaondisk = mp->m_sb.sb_qflags & XFS_UQUOTA_ACCT; |
291 | pquotaondisk = mp->m_sb.sb_qflags & XFS_PQUOTA_ACCT; | ||
268 | gquotaondisk = mp->m_sb.sb_qflags & XFS_GQUOTA_ACCT; | 292 | gquotaondisk = mp->m_sb.sb_qflags & XFS_GQUOTA_ACCT; |
269 | } | 293 | } |
270 | 294 | ||
@@ -277,13 +301,16 @@ xfs_qm_newmount( | |||
277 | 301 | ||
278 | if (((uquotaondisk && !XFS_IS_UQUOTA_ON(mp)) || | 302 | if (((uquotaondisk && !XFS_IS_UQUOTA_ON(mp)) || |
279 | (!uquotaondisk && XFS_IS_UQUOTA_ON(mp)) || | 303 | (!uquotaondisk && XFS_IS_UQUOTA_ON(mp)) || |
304 | (pquotaondisk && !XFS_IS_PQUOTA_ON(mp)) || | ||
305 | (!pquotaondisk && XFS_IS_PQUOTA_ON(mp)) || | ||
280 | (gquotaondisk && !XFS_IS_GQUOTA_ON(mp)) || | 306 | (gquotaondisk && !XFS_IS_GQUOTA_ON(mp)) || |
281 | (!gquotaondisk && XFS_IS_GQUOTA_ON(mp))) && | 307 | (!gquotaondisk && XFS_IS_OQUOTA_ON(mp))) && |
282 | xfs_dev_is_read_only(mp, "changing quota state")) { | 308 | xfs_dev_is_read_only(mp, "changing quota state")) { |
283 | cmn_err(CE_WARN, | 309 | cmn_err(CE_WARN, |
284 | "XFS: please mount with%s%s%s.", | 310 | "XFS: please mount with%s%s%s%s.", |
285 | (!quotaondisk ? "out quota" : ""), | 311 | (!quotaondisk ? "out quota" : ""), |
286 | (uquotaondisk ? " usrquota" : ""), | 312 | (uquotaondisk ? " usrquota" : ""), |
313 | (pquotaondisk ? " prjquota" : ""), | ||
287 | (gquotaondisk ? " grpquota" : "")); | 314 | (gquotaondisk ? " grpquota" : "")); |
288 | return XFS_ERROR(EPERM); | 315 | return XFS_ERROR(EPERM); |
289 | } | 316 | } |