diff options
author | Chandra Seetharaman <sekharan@us.ibm.com> | 2013-07-19 18:36:02 -0400 |
---|---|---|
committer | Ben Myers <bpm@sgi.com> | 2013-07-22 15:46:26 -0400 |
commit | d892d5864f020c44cfa4e23e9165112d8df91093 (patch) | |
tree | 84abbb176e54b24ff2a13d912d8d82a3b83710af /fs/xfs/xfs_qm.c | |
parent | 0102629776a2f5c3bd9c5dc0ef77956c60255074 (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.c | 72 |
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; |