diff options
Diffstat (limited to 'fs/xfs/xfs_qm_syscalls.c')
-rw-r--r-- | fs/xfs/xfs_qm_syscalls.c | 75 |
1 files changed, 44 insertions, 31 deletions
diff --git a/fs/xfs/xfs_qm_syscalls.c b/fs/xfs/xfs_qm_syscalls.c index 6cdf6ffc36a1..e4f8b2d6f38b 100644 --- a/fs/xfs/xfs_qm_syscalls.c +++ b/fs/xfs/xfs_qm_syscalls.c | |||
@@ -117,11 +117,12 @@ xfs_qm_scall_quotaoff( | |||
117 | } | 117 | } |
118 | if (flags & XFS_GQUOTA_ACCT) { | 118 | if (flags & XFS_GQUOTA_ACCT) { |
119 | dqtype |= XFS_QMOPT_GQUOTA; | 119 | dqtype |= XFS_QMOPT_GQUOTA; |
120 | flags |= (XFS_OQUOTA_CHKD | XFS_OQUOTA_ENFD); | 120 | flags |= (XFS_GQUOTA_CHKD | XFS_GQUOTA_ENFD); |
121 | inactivate_flags |= XFS_GQUOTA_ACTIVE; | 121 | inactivate_flags |= XFS_GQUOTA_ACTIVE; |
122 | } else if (flags & XFS_PQUOTA_ACCT) { | 122 | } |
123 | if (flags & XFS_PQUOTA_ACCT) { | ||
123 | dqtype |= XFS_QMOPT_PQUOTA; | 124 | dqtype |= XFS_QMOPT_PQUOTA; |
124 | flags |= (XFS_OQUOTA_CHKD | XFS_OQUOTA_ENFD); | 125 | flags |= (XFS_PQUOTA_CHKD | XFS_PQUOTA_ENFD); |
125 | inactivate_flags |= XFS_PQUOTA_ACTIVE; | 126 | inactivate_flags |= XFS_PQUOTA_ACTIVE; |
126 | } | 127 | } |
127 | 128 | ||
@@ -198,10 +199,9 @@ xfs_qm_scall_quotaoff( | |||
198 | } | 199 | } |
199 | 200 | ||
200 | /* | 201 | /* |
201 | * If quotas is completely disabled, close shop. | 202 | * If all quotas are completely turned off, close shop. |
202 | */ | 203 | */ |
203 | if (((flags & XFS_MOUNT_QUOTA_ALL) == XFS_MOUNT_QUOTA_SET1) || | 204 | if (mp->m_qflags == 0) { |
204 | ((flags & XFS_MOUNT_QUOTA_ALL) == XFS_MOUNT_QUOTA_SET2)) { | ||
205 | mutex_unlock(&q->qi_quotaofflock); | 205 | mutex_unlock(&q->qi_quotaofflock); |
206 | xfs_qm_destroy_quotainfo(mp); | 206 | xfs_qm_destroy_quotainfo(mp); |
207 | return (0); | 207 | return (0); |
@@ -214,10 +214,14 @@ xfs_qm_scall_quotaoff( | |||
214 | IRELE(q->qi_uquotaip); | 214 | IRELE(q->qi_uquotaip); |
215 | q->qi_uquotaip = NULL; | 215 | q->qi_uquotaip = NULL; |
216 | } | 216 | } |
217 | if ((dqtype & (XFS_QMOPT_GQUOTA|XFS_QMOPT_PQUOTA)) && q->qi_gquotaip) { | 217 | if ((dqtype & XFS_QMOPT_GQUOTA) && q->qi_gquotaip) { |
218 | IRELE(q->qi_gquotaip); | 218 | IRELE(q->qi_gquotaip); |
219 | q->qi_gquotaip = NULL; | 219 | q->qi_gquotaip = NULL; |
220 | } | 220 | } |
221 | if ((dqtype & XFS_QMOPT_PQUOTA) && q->qi_pquotaip) { | ||
222 | IRELE(q->qi_pquotaip); | ||
223 | q->qi_pquotaip = NULL; | ||
224 | } | ||
221 | 225 | ||
222 | out_unlock: | 226 | out_unlock: |
223 | mutex_unlock(&q->qi_quotaofflock); | 227 | mutex_unlock(&q->qi_quotaofflock); |
@@ -335,14 +339,14 @@ xfs_qm_scall_quotaon( | |||
335 | * quota acct on ondisk without m_qflags' knowing. | 339 | * quota acct on ondisk without m_qflags' knowing. |
336 | */ | 340 | */ |
337 | if (((flags & XFS_UQUOTA_ACCT) == 0 && | 341 | if (((flags & XFS_UQUOTA_ACCT) == 0 && |
338 | (mp->m_sb.sb_qflags & XFS_UQUOTA_ACCT) == 0 && | 342 | (mp->m_sb.sb_qflags & XFS_UQUOTA_ACCT) == 0 && |
339 | (flags & XFS_UQUOTA_ENFD)) | 343 | (flags & XFS_UQUOTA_ENFD)) || |
340 | || | 344 | ((flags & XFS_GQUOTA_ACCT) == 0 && |
345 | (mp->m_sb.sb_qflags & XFS_GQUOTA_ACCT) == 0 && | ||
346 | (flags & XFS_GQUOTA_ENFD)) || | ||
341 | ((flags & XFS_PQUOTA_ACCT) == 0 && | 347 | ((flags & XFS_PQUOTA_ACCT) == 0 && |
342 | (mp->m_sb.sb_qflags & XFS_PQUOTA_ACCT) == 0 && | 348 | (mp->m_sb.sb_qflags & XFS_PQUOTA_ACCT) == 0 && |
343 | (flags & XFS_GQUOTA_ACCT) == 0 && | 349 | (flags & XFS_PQUOTA_ENFD))) { |
344 | (mp->m_sb.sb_qflags & XFS_GQUOTA_ACCT) == 0 && | ||
345 | (flags & XFS_OQUOTA_ENFD))) { | ||
346 | xfs_debug(mp, | 350 | xfs_debug(mp, |
347 | "%s: Can't enforce without acct, flags=%x sbflags=%x\n", | 351 | "%s: Can't enforce without acct, flags=%x sbflags=%x\n", |
348 | __func__, flags, mp->m_sb.sb_qflags); | 352 | __func__, flags, mp->m_sb.sb_qflags); |
@@ -407,11 +411,11 @@ xfs_qm_scall_getqstat( | |||
407 | struct fs_quota_stat *out) | 411 | struct fs_quota_stat *out) |
408 | { | 412 | { |
409 | struct xfs_quotainfo *q = mp->m_quotainfo; | 413 | struct xfs_quotainfo *q = mp->m_quotainfo; |
410 | struct xfs_inode *uip, *gip; | 414 | struct xfs_inode *uip = NULL; |
411 | bool tempuqip, tempgqip; | 415 | struct xfs_inode *gip = NULL; |
416 | bool tempuqip = false; | ||
417 | bool tempgqip = false; | ||
412 | 418 | ||
413 | uip = gip = NULL; | ||
414 | tempuqip = tempgqip = false; | ||
415 | memset(out, 0, sizeof(fs_quota_stat_t)); | 419 | memset(out, 0, sizeof(fs_quota_stat_t)); |
416 | 420 | ||
417 | out->qs_version = FS_QSTAT_VERSION; | 421 | out->qs_version = FS_QSTAT_VERSION; |
@@ -776,9 +780,12 @@ xfs_qm_scall_getquota( | |||
776 | * gets turned off. No need to confuse the user level code, | 780 | * gets turned off. No need to confuse the user level code, |
777 | * so return zeroes in that case. | 781 | * so return zeroes in that case. |
778 | */ | 782 | */ |
779 | if ((!XFS_IS_UQUOTA_ENFORCED(mp) && dqp->q_core.d_flags == XFS_DQ_USER) || | 783 | if ((!XFS_IS_UQUOTA_ENFORCED(mp) && |
780 | (!XFS_IS_OQUOTA_ENFORCED(mp) && | 784 | dqp->q_core.d_flags == XFS_DQ_USER) || |
781 | (dqp->q_core.d_flags & (XFS_DQ_PROJ | XFS_DQ_GROUP)))) { | 785 | (!XFS_IS_GQUOTA_ENFORCED(mp) && |
786 | dqp->q_core.d_flags == XFS_DQ_GROUP) || | ||
787 | (!XFS_IS_PQUOTA_ENFORCED(mp) && | ||
788 | dqp->q_core.d_flags == XFS_DQ_PROJ)) { | ||
782 | dst->d_btimer = 0; | 789 | dst->d_btimer = 0; |
783 | dst->d_itimer = 0; | 790 | dst->d_itimer = 0; |
784 | dst->d_rtbtimer = 0; | 791 | dst->d_rtbtimer = 0; |
@@ -786,8 +793,8 @@ xfs_qm_scall_getquota( | |||
786 | 793 | ||
787 | #ifdef DEBUG | 794 | #ifdef DEBUG |
788 | if (((XFS_IS_UQUOTA_ENFORCED(mp) && dst->d_flags == FS_USER_QUOTA) || | 795 | if (((XFS_IS_UQUOTA_ENFORCED(mp) && dst->d_flags == FS_USER_QUOTA) || |
789 | (XFS_IS_OQUOTA_ENFORCED(mp) && | 796 | (XFS_IS_GQUOTA_ENFORCED(mp) && dst->d_flags == FS_GROUP_QUOTA) || |
790 | (dst->d_flags & (FS_PROJ_QUOTA | FS_GROUP_QUOTA)))) && | 797 | (XFS_IS_PQUOTA_ENFORCED(mp) && dst->d_flags == FS_PROJ_QUOTA)) && |
791 | dst->d_id != 0) { | 798 | dst->d_id != 0) { |
792 | if ((dst->d_bcount > dst->d_blk_softlimit) && | 799 | if ((dst->d_bcount > dst->d_blk_softlimit) && |
793 | (dst->d_blk_softlimit > 0)) { | 800 | (dst->d_blk_softlimit > 0)) { |
@@ -833,16 +840,16 @@ xfs_qm_export_flags( | |||
833 | uflags = 0; | 840 | uflags = 0; |
834 | if (flags & XFS_UQUOTA_ACCT) | 841 | if (flags & XFS_UQUOTA_ACCT) |
835 | uflags |= FS_QUOTA_UDQ_ACCT; | 842 | uflags |= FS_QUOTA_UDQ_ACCT; |
836 | if (flags & XFS_PQUOTA_ACCT) | ||
837 | uflags |= FS_QUOTA_PDQ_ACCT; | ||
838 | if (flags & XFS_GQUOTA_ACCT) | 843 | if (flags & XFS_GQUOTA_ACCT) |
839 | uflags |= FS_QUOTA_GDQ_ACCT; | 844 | uflags |= FS_QUOTA_GDQ_ACCT; |
845 | if (flags & XFS_PQUOTA_ACCT) | ||
846 | uflags |= FS_QUOTA_PDQ_ACCT; | ||
840 | if (flags & XFS_UQUOTA_ENFD) | 847 | if (flags & XFS_UQUOTA_ENFD) |
841 | uflags |= FS_QUOTA_UDQ_ENFD; | 848 | uflags |= FS_QUOTA_UDQ_ENFD; |
842 | if (flags & (XFS_OQUOTA_ENFD)) { | 849 | if (flags & XFS_GQUOTA_ENFD) |
843 | uflags |= (flags & XFS_GQUOTA_ACCT) ? | 850 | uflags |= FS_QUOTA_GDQ_ENFD; |
844 | FS_QUOTA_GDQ_ENFD : FS_QUOTA_PDQ_ENFD; | 851 | if (flags & XFS_PQUOTA_ENFD) |
845 | } | 852 | uflags |= FS_QUOTA_PDQ_ENFD; |
846 | return (uflags); | 853 | return (uflags); |
847 | } | 854 | } |
848 | 855 | ||
@@ -856,9 +863,11 @@ xfs_dqrele_inode( | |||
856 | { | 863 | { |
857 | /* skip quota inodes */ | 864 | /* skip quota inodes */ |
858 | if (ip == ip->i_mount->m_quotainfo->qi_uquotaip || | 865 | if (ip == ip->i_mount->m_quotainfo->qi_uquotaip || |
859 | ip == ip->i_mount->m_quotainfo->qi_gquotaip) { | 866 | ip == ip->i_mount->m_quotainfo->qi_gquotaip || |
867 | ip == ip->i_mount->m_quotainfo->qi_pquotaip) { | ||
860 | ASSERT(ip->i_udquot == NULL); | 868 | ASSERT(ip->i_udquot == NULL); |
861 | ASSERT(ip->i_gdquot == NULL); | 869 | ASSERT(ip->i_gdquot == NULL); |
870 | ASSERT(ip->i_pdquot == NULL); | ||
862 | return 0; | 871 | return 0; |
863 | } | 872 | } |
864 | 873 | ||
@@ -867,10 +876,14 @@ xfs_dqrele_inode( | |||
867 | xfs_qm_dqrele(ip->i_udquot); | 876 | xfs_qm_dqrele(ip->i_udquot); |
868 | ip->i_udquot = NULL; | 877 | ip->i_udquot = NULL; |
869 | } | 878 | } |
870 | if (flags & (XFS_PQUOTA_ACCT|XFS_GQUOTA_ACCT) && ip->i_gdquot) { | 879 | if ((flags & XFS_GQUOTA_ACCT) && ip->i_gdquot) { |
871 | xfs_qm_dqrele(ip->i_gdquot); | 880 | xfs_qm_dqrele(ip->i_gdquot); |
872 | ip->i_gdquot = NULL; | 881 | ip->i_gdquot = NULL; |
873 | } | 882 | } |
883 | if ((flags & XFS_PQUOTA_ACCT) && ip->i_pdquot) { | ||
884 | xfs_qm_dqrele(ip->i_pdquot); | ||
885 | ip->i_pdquot = NULL; | ||
886 | } | ||
874 | xfs_iunlock(ip, XFS_ILOCK_EXCL); | 887 | xfs_iunlock(ip, XFS_ILOCK_EXCL); |
875 | return 0; | 888 | return 0; |
876 | } | 889 | } |