aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs/xfs_qm.c
diff options
context:
space:
mode:
authorChandra Seetharaman <sekharan@us.ibm.com>2013-07-19 18:36:02 -0400
committerBen Myers <bpm@sgi.com>2013-07-22 15:46:26 -0400
commitd892d5864f020c44cfa4e23e9165112d8df91093 (patch)
tree84abbb176e54b24ff2a13d912d8d82a3b83710af /fs/xfs/xfs_qm.c
parent0102629776a2f5c3bd9c5dc0ef77956c60255074 (diff)
xfs: Start using pquotaino from the superblock.
Start using pquotino and define a macro to check if the superblock has pquotino. Keep backward compatibilty by alowing mount of older superblock with no separate pquota inode. Signed-off-by: Chandra Seetharaman <sekharan@us.ibm.com> Reviewed-by: Ben Myers <bpm@sgi.com> Signed-off-by: Ben Myers <bpm@sgi.com>
Diffstat (limited to 'fs/xfs/xfs_qm.c')
-rw-r--r--fs/xfs/xfs_qm.c72
1 files changed, 54 insertions, 18 deletions
diff --git a/fs/xfs/xfs_qm.c b/fs/xfs/xfs_qm.c
index d320794d03ce..1e2361d0294e 100644
--- a/fs/xfs/xfs_qm.c
+++ b/fs/xfs/xfs_qm.c
@@ -834,6 +834,36 @@ xfs_qm_qino_alloc(
834 int error; 834 int error;
835 int committed; 835 int committed;
836 836
837 *ip = NULL;
838 /*
839 * With superblock that doesn't have separate pquotino, we
840 * share an inode between gquota and pquota. If the on-disk
841 * superblock has GQUOTA and the filesystem is now mounted
842 * with PQUOTA, just use sb_gquotino for sb_pquotino and
843 * vice-versa.
844 */
845 if (!xfs_sb_version_has_pquotino(&mp->m_sb) &&
846 (flags & (XFS_QMOPT_PQUOTA|XFS_QMOPT_GQUOTA))) {
847 xfs_ino_t ino = NULLFSINO;
848
849 if ((flags & XFS_QMOPT_PQUOTA) &&
850 (mp->m_sb.sb_gquotino != NULLFSINO)) {
851 ino = mp->m_sb.sb_gquotino;
852 ASSERT(mp->m_sb.sb_pquotino == NULLFSINO);
853 } else if ((flags & XFS_QMOPT_GQUOTA) &&
854 (mp->m_sb.sb_pquotino != NULLFSINO)) {
855 ino = mp->m_sb.sb_pquotino;
856 ASSERT(mp->m_sb.sb_gquotino == NULLFSINO);
857 }
858 if (ino != NULLFSINO) {
859 error = xfs_iget(mp, NULL, ino, 0, 0, ip);
860 if (error)
861 return error;
862 mp->m_sb.sb_gquotino = NULLFSINO;
863 mp->m_sb.sb_pquotino = NULLFSINO;
864 }
865 }
866
837 tp = xfs_trans_alloc(mp, XFS_TRANS_QM_QINOCREATE); 867 tp = xfs_trans_alloc(mp, XFS_TRANS_QM_QINOCREATE);
838 if ((error = xfs_trans_reserve(tp, 868 if ((error = xfs_trans_reserve(tp,
839 XFS_QM_QINOCREATE_SPACE_RES(mp), 869 XFS_QM_QINOCREATE_SPACE_RES(mp),
@@ -844,11 +874,14 @@ xfs_qm_qino_alloc(
844 return error; 874 return error;
845 } 875 }
846 876
847 error = xfs_dir_ialloc(&tp, NULL, S_IFREG, 1, 0, 0, 1, ip, &committed); 877 if (!*ip) {
848 if (error) { 878 error = xfs_dir_ialloc(&tp, NULL, S_IFREG, 1, 0, 0, 1, ip,
849 xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | 879 &committed);
850 XFS_TRANS_ABORT); 880 if (error) {
851 return error; 881 xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES |
882 XFS_TRANS_ABORT);
883 return error;
884 }
852 } 885 }
853 886
854 /* 887 /*
@@ -860,21 +893,25 @@ xfs_qm_qino_alloc(
860 if (flags & XFS_QMOPT_SBVERSION) { 893 if (flags & XFS_QMOPT_SBVERSION) {
861 ASSERT(!xfs_sb_version_hasquota(&mp->m_sb)); 894 ASSERT(!xfs_sb_version_hasquota(&mp->m_sb));
862 ASSERT((sbfields & (XFS_SB_VERSIONNUM | XFS_SB_UQUOTINO | 895 ASSERT((sbfields & (XFS_SB_VERSIONNUM | XFS_SB_UQUOTINO |
863 XFS_SB_GQUOTINO | XFS_SB_QFLAGS)) == 896 XFS_SB_GQUOTINO | XFS_SB_PQUOTINO | XFS_SB_QFLAGS)) ==
864 (XFS_SB_VERSIONNUM | XFS_SB_UQUOTINO | 897 (XFS_SB_VERSIONNUM | XFS_SB_UQUOTINO |
865 XFS_SB_GQUOTINO | XFS_SB_QFLAGS)); 898 XFS_SB_GQUOTINO | XFS_SB_PQUOTINO |
899 XFS_SB_QFLAGS));
866 900
867 xfs_sb_version_addquota(&mp->m_sb); 901 xfs_sb_version_addquota(&mp->m_sb);
868 mp->m_sb.sb_uquotino = NULLFSINO; 902 mp->m_sb.sb_uquotino = NULLFSINO;
869 mp->m_sb.sb_gquotino = NULLFSINO; 903 mp->m_sb.sb_gquotino = NULLFSINO;
904 mp->m_sb.sb_pquotino = NULLFSINO;
870 905
871 /* qflags will get updated _after_ quotacheck */ 906 /* qflags will get updated fully _after_ quotacheck */
872 mp->m_sb.sb_qflags = 0; 907 mp->m_sb.sb_qflags = mp->m_qflags & XFS_ALL_QUOTA_ACCT;
873 } 908 }
874 if (flags & XFS_QMOPT_UQUOTA) 909 if (flags & XFS_QMOPT_UQUOTA)
875 mp->m_sb.sb_uquotino = (*ip)->i_ino; 910 mp->m_sb.sb_uquotino = (*ip)->i_ino;
876 else 911 else if (flags & XFS_QMOPT_GQUOTA)
877 mp->m_sb.sb_gquotino = (*ip)->i_ino; 912 mp->m_sb.sb_gquotino = (*ip)->i_ino;
913 else
914 mp->m_sb.sb_pquotino = (*ip)->i_ino;
878 spin_unlock(&mp->m_sb_lock); 915 spin_unlock(&mp->m_sb_lock);
879 xfs_mod_sb(tp, sbfields); 916 xfs_mod_sb(tp, sbfields);
880 917
@@ -1484,11 +1521,10 @@ xfs_qm_init_quotainos(
1484 if (error) 1521 if (error)
1485 goto error_rele; 1522 goto error_rele;
1486 } 1523 }
1487 /* XXX: Use gquotino for now */
1488 if (XFS_IS_PQUOTA_ON(mp) && 1524 if (XFS_IS_PQUOTA_ON(mp) &&
1489 mp->m_sb.sb_gquotino != NULLFSINO) { 1525 mp->m_sb.sb_pquotino != NULLFSINO) {
1490 ASSERT(mp->m_sb.sb_gquotino > 0); 1526 ASSERT(mp->m_sb.sb_pquotino > 0);
1491 error = xfs_iget(mp, NULL, mp->m_sb.sb_gquotino, 1527 error = xfs_iget(mp, NULL, mp->m_sb.sb_pquotino,
1492 0, 0, &pip); 1528 0, 0, &pip);
1493 if (error) 1529 if (error)
1494 goto error_rele; 1530 goto error_rele;
@@ -1496,7 +1532,8 @@ xfs_qm_init_quotainos(
1496 } else { 1532 } else {
1497 flags |= XFS_QMOPT_SBVERSION; 1533 flags |= XFS_QMOPT_SBVERSION;
1498 sbflags |= (XFS_SB_VERSIONNUM | XFS_SB_UQUOTINO | 1534 sbflags |= (XFS_SB_VERSIONNUM | XFS_SB_UQUOTINO |
1499 XFS_SB_GQUOTINO | XFS_SB_QFLAGS); 1535 XFS_SB_GQUOTINO | XFS_SB_PQUOTINO |
1536 XFS_SB_QFLAGS);
1500 } 1537 }
1501 1538
1502 /* 1539 /*
@@ -1524,9 +1561,8 @@ xfs_qm_init_quotainos(
1524 flags &= ~XFS_QMOPT_SBVERSION; 1561 flags &= ~XFS_QMOPT_SBVERSION;
1525 } 1562 }
1526 if (XFS_IS_PQUOTA_ON(mp) && pip == NULL) { 1563 if (XFS_IS_PQUOTA_ON(mp) && pip == NULL) {
1527 /* XXX: Use XFS_SB_GQUOTINO for now */
1528 error = xfs_qm_qino_alloc(mp, &pip, 1564 error = xfs_qm_qino_alloc(mp, &pip,
1529 sbflags | XFS_SB_GQUOTINO, 1565 sbflags | XFS_SB_PQUOTINO,
1530 flags | XFS_QMOPT_PQUOTA); 1566 flags | XFS_QMOPT_PQUOTA);
1531 if (error) 1567 if (error)
1532 goto error_rele; 1568 goto error_rele;