xfs: Add pquotaino to on-disk super block
PATCH 3/4 xfs: Add pquotaino to on-disk super block
Add pquotaino to on-disk super block. Add a new field to the super block to add support for separate pquota with a specific version.
--- fs/xfs/xfs_itable.c | 3 +- fs/xfs/xfs_mount.c | 53 +++++++++++++++++++++++++++++++++++++++++++- fs/xfs/xfs_qm.c | 27 +++++++++++++++------- fs/xfs/xfs_qm_syscalls.c | 44 ++++++++++++++++++++++++++++--------- fs/xfs/xfs_quota.h | 8 ------ fs/xfs/xfs_sb.h | 17 ++++++++++++-- fs/xfs/xfs_super.c | 15 +++++++----- fs/xfs/xfs_trans_dquot.c | 3 +- include/linux/dqblk_xfs.h | 1 + 9 files changed, 130 insertions(+), 41 deletions(-)
fs/xfs/xfs_itable.c +2 -1
@@ -42,7 +42,8 @@ xfs_internal_inum( {return (ino == mp->m_sb.sb_rbmino || ino == mp->m_sb.sb_rsumino || (xfs_sb_version_hasquota (&mp->m_sb) && - (ino == mp->m_sb.sb_uquotino || ino == mp->m_sb.sb_gquotino))); + (ino == mp->m_sb.sb_uquotino || ino == mp->m_sb.sb_gquotino || + ino == mp->m_sb.sb_pquotino))); }/*
fs/xfs/xfs_mount.c +51 -2
95 lines not on this page · raw message
fs/xfs/xfs_qm.c +18 -9
@@ -502,7 +502,8 @@ xfs_qm_need_dqattach(if (!XFS_NOT_DQATTACHED (mp, ip))return false;if (ip->i_ino == mp->m_sb.sb_uquotino || - ip->i_ino == mp->m_sb.sb_gquotino) + ip->i_ino == mp->m_sb.sb_gquotino || + ip->i_ino == mp->m_sb.sb_pquotino)return false;return true; }
@@ -632,6 +633,7 @@ xfs_qm_dqdetach(ASSERT (ip->i_ino != ip->i_mount->m_sb.sb_uquotino);ASSERT (ip->i_ino != ip->i_mount->m_sb.sb_gquotino); +ASSERT (ip->i_ino != ip->i_mount->m_sb.sb_pquotino);if (ip->i_udquot) {xfs_qm_dqrele (ip->i_udquot); ip->i_udquot =NULL ;
@@ -827,21 +829,26 @@ xfs_qm_qino_alloc(if (flags &XFS_QMOPT_SBVERSION ) {ASSERT (!xfs_sb_version_hasquota (&mp->m_sb));ASSERT ((sbfields & (XFS_SB_VERSIONNUM |XFS_SB_UQUOTINO | -XFS_SB_GQUOTINO |XFS_SB_QFLAGS )) == - (XFS_SB_VERSIONNUM |XFS_SB_UQUOTINO | -XFS_SB_GQUOTINO |XFS_SB_QFLAGS )); +XFS_SB_GQUOTINO |XFS_SB_PQUOTINO | +XFS_SB_QFLAGS )) == + (XFS_SB_VERSIONNUM |XFS_SB_UQUOTINO |XFS_SB_GQUOTINO | +XFS_SB_PQUOTINO |XFS_SB_QFLAGS ));xfs_sb_version_addquota (&mp->m_sb); mp->m_sb.sb_uquotino =NULLFSINO ; mp->m_sb.sb_gquotino =NULLFSINO ; + mp->m_sb.sb_pquotino =NULLFSINO ;/* qflags will get updated _after_ quotacheck */ mp->m_sb.sb_qflags =0 ; }if (flags &XFS_QMOPT_UQUOTA ) mp->m_sb.sb_uquotino = (*ip)->i_ino; -else +else if (flags &XFS_QMOPT_GQUOTA ) mp->m_sb.sb_gquotino = (*ip)->i_ino; +else + mp->m_sb.sb_pquotino = (*ip)->i_ino; +spin_unlock (&mp->m_sb_lock);xfs_mod_sb (tp, sbfields);
@@ -1147,7 +1154,8 @@ xfs_qm_dqusage_adjust(* rootino must have its resources accounted for, not so with the quota * inodes. */ -if (ino == mp->m_sb.sb_uquotino || ino == mp->m_sb.sb_gquotino) { +if (ino == mp->m_sb.sb_uquotino || ino == mp->m_sb.sb_gquotino || + ino == mp->m_sb.sb_pquotino) { *res =BULKSTAT_RV_NOTHING ;return XFS_ERROR (EINVAL ); }
@@ -1446,7 +1454,8 @@ xfs_qm_init_quotainos( }else { flags |=XFS_QMOPT_SBVERSION ; sbflags |= (XFS_SB_VERSIONNUM |XFS_SB_UQUOTINO | -XFS_SB_GQUOTINO |XFS_SB_QFLAGS ); +XFS_SB_GQUOTINO |XFS_SB_PQUOTINO | +XFS_SB_QFLAGS ); }/*
@@ -1477,7 +1486,7 @@ xfs_qm_init_quotainos(/* Why not define a XFS_SB_PQUOTINO? */ if (XFS_IS_PQUOTA_ON (mp) && pip ==NULL ) { error =xfs_qm_qino_alloc (mp, &pip, - sbflags |XFS_SB_GQUOTINO , + sbflags |XFS_SB_PQUOTINO , flags |XFS_QMOPT_PQUOTA );if (error) {if (uip)
@@ -1679,7 +1688,7 @@ xfs_qm_write_sb_changes(* and returns the dquots corresponding to the uid and/or gid. * * in : inode (unlocked) -* out : udquot, gdquot with references taken and unlocked +* out : udquot, gdquot, pdquot with references taken and unlocked */ int xfs_qm_vop_dqalloc(
fs/xfs/xfs_qm_syscalls.c +33 -11
99 lines not on this page · raw message
fs/xfs/xfs_quota.h +0 -8
@@ -284,14 +284,6 @@ typedef struct xfs_qoff_logformat { (XFS_IS_PQUOTA_ON(mp) && \ (mp->m_sb.sb_qflags & XFS_PQUOTA_CHKD) == 0)) -#define XFS_MOUNT_QUOTA_SET1 (XFS_UQUOTA_ACCT|XFS_UQUOTA_ENFD|\ - XFS_UQUOTA_CHKD|XFS_PQUOTA_ACCT|\ - XFS_PQUOTA_ENFD|XFS_PQUOTA_CHKD) - -#define XFS_MOUNT_QUOTA_SET2 (XFS_UQUOTA_ACCT|XFS_UQUOTA_ENFD|\ - XFS_UQUOTA_CHKD|XFS_GQUOTA_ACCT|\ - XFS_GQUOTA_ENFD|XFS_GQUOTA_CHKD) -#define XFS_MOUNT_QUOTA_ALL (XFS_UQUOTA_ACCT|XFS_UQUOTA_ENFD|\ XFS_UQUOTA_CHKD|XFS_PQUOTA_ACCT|\ XFS_PQUOTA_ENFD|XFS_PQUOTA_CHKD|\
fs/xfs/xfs_sb.h +14 -3
@@ -81,11 +81,15 @@ struct xfs_mount;#define XFS_SB_VERSION2_ATTR2BIT 0x00000008/* Inline attr rework */ #define XFS_SB_VERSION2_PARENTBIT 0x00000010/* parent pointers */ #define XFS_SB_VERSION2_PROJID32BIT 0x00000080/* 32 bit project id */ +#define XFS_SB_VERSION2_NO_OQUOTA 0x00000100/* No OQUOTA and has * +* separate project * +* quota field */ #define XFS_SB_VERSION2_OKREALFBITS \ (XFS_SB_VERSION2_LAZYSBCOUNTBIT | \ XFS_SB_VERSION2_ATTR2BIT | \ - XFS_SB_VERSION2_PROJID32BIT) + XFS_SB_VERSION2_PROJID32BIT | \ + XFS_SB_VERSION2_NO_OQUOTA)#define XFS_SB_VERSION2_OKSASHFBITS \ (0)#define XFS_SB_VERSION2_OKREALBITS \
@@ -250,7 +254,7 @@ typedef enum {XFS_SBS_GQUOTINO ,XFS_SBS_QFLAGS ,XFS_SBS_FLAGS ,XFS_SBS_SHARED_VN ,XFS_SBS_INOALIGNMT ,XFS_SBS_UNIT ,XFS_SBS_WIDTH ,XFS_SBS_DIRBLKLOG ,XFS_SBS_LOGSECTLOG ,XFS_SBS_LOGSECTSIZE ,XFS_SBS_LOGSUNIT , -XFS_SBS_FEATURES2 ,XFS_SBS_BAD_FEATURES2 , +XFS_SBS_FEATURES2 ,XFS_SBS_BAD_FEATURES2 ,XFS_SBS_PQUOTINO , XFS_SBS_FIELDCOUNT } xfs_sb_field_t;
@@ -276,6 +280,7 @@ typedef enum {#define XFS_SB_FDBLOCKS XFS_SB_MVAL(FDBLOCKS)#define XFS_SB_FEATURES2 XFS_SB_MVAL(FEATURES2)#define XFS_SB_BAD_FEATURES2 XFS_SB_MVAL(BAD_FEATURES2) +#define XFS_SB_PQUOTINO XFS_SB_MVAL(PQUOTINO)#define XFS_SB_NUM_BITS ((int)XFS_SBS_FIELDCOUNT)#define XFS_SB_ALL_BITS ((1LL << XFS_SB_NUM_BITS) - 1)#define XFS_SB_MOD_BITS \
@@ -283,7 +288,7 @@ typedef enum {XFS_SB_VERSIONNUM |XFS_SB_UQUOTINO |XFS_SB_GQUOTINO | \XFS_SB_QFLAGS |XFS_SB_SHARED_VN |XFS_SB_UNIT |XFS_SB_WIDTH | \XFS_SB_ICOUNT |XFS_SB_IFREE |XFS_SB_FDBLOCKS |XFS_SB_FEATURES2 | \ - XFS_SB_BAD_FEATURES2) + XFS_SB_BAD_FEATURES2 | XFS_SB_PQUOTINO)/*
@@ -504,6 +509,12 @@ static inline int xfs_sb_version_hasprojid32bit(xfs_sb_t *sbp) (sbp->sb_features2 &XFS_SB_VERSION2_PROJID32BIT ); } +static inline int xfs_sb_version_has_no_oquota (xfs_sb_t *sbp) +{ +return xfs_sb_version_hasmorebits (sbp) && + (sbp->sb_features2 &XFS_SB_VERSION2_NO_OQUOTA ); +} +/* * end of superblock version macros */
fs/xfs/xfs_super.c +9 -6
@@ -399,12 +399,6 @@ xfs_parseargs( }#endif -if ((mp->m_qflags & (XFS_GQUOTA_ACCT |XFS_GQUOTA_ACTIVE )) && - (mp->m_qflags & (XFS_PQUOTA_ACCT |XFS_PQUOTA_ACTIVE ))) { -xfs_warn (mp,"cannot mount with both project and group quota" ); -return EINVAL ; - } -if ((dsunit && !dswidth) || (!dsunit && dswidth)) {xfs_warn (mp,"sunit and swidth must be specified together" );return EINVAL ;
@@ -1331,6 +1325,15 @@ xfs_fs_fill_super(if (error) goto out_destroy_counters; +if ((mp->m_qflags & (XFS_GQUOTA_ACCT |XFS_GQUOTA_ACTIVE )) && + (mp->m_qflags & (XFS_PQUOTA_ACCT |XFS_PQUOTA_ACTIVE )) && + !xfs_sb_version_has_no_oquota (&mp->m_sb)) { +xfs_warn (mp,"Super block does not support " +"project and group quota together" ); + error =EINVAL ; + goto out_free_sb; + } + error =xfs_finish_flags (mp);if (error) goto out_free_sb;
fs/xfs/xfs_trans_dquot.c +2 -1
@@ -163,7 +163,8 @@ xfs_trans_mod_dquot_byino(if (!XFS_IS_QUOTA_RUNNING (mp) || !XFS_IS_QUOTA_ON (mp) || ip->i_ino == mp->m_sb.sb_uquotino || - ip->i_ino == mp->m_sb.sb_gquotino) + ip->i_ino == mp->m_sb.sb_gquotino || + ip->i_ino == mp->m_sb.sb_pquotino)return ;if (tp->t_dqinfo ==NULL )
include/linux/dqblk_xfs.h +1 -0
@@ -155,6 +155,7 @@ typedef struct fs_quota_stat {__s8 qs_pad;/* unused */ fs_qfilestat_t qs_uquota;/* user quota storage information */ fs_qfilestat_t qs_gquota;/* group quota storage information */ +#define qs_pquota qs_gquota__u32 qs_incoredqs;/* number of dquots incore */ __s32 qs_btimelimit;/* limit for blks timer */ __s32 qs_itimelimit;/* limit for inodes timer */
Signature · 6 lines
1.7.4.1 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
Quoted 3 lines · Jeff Liu
Add pquotaino to on-disk super block. Add a new field to the super block to add support for separate pquota with a specific version.
Call me stupid, but I can't find where it actually adds the field.
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
Quoted 6 lines · Christoph Hellwig
Quoted 3 lines · Jeff Liu
Add pquotaino to on-disk super block. Add a new field to the super block to add support for separate pquota with a specific version.
Call me stupid, but I can't find where it actually adds the field.
Sorry! looks I have made a mistake when producing this patch set, just looked through the code on my working tree, the code change in xfs_readsb() also does not reflect here.
I'll correct this in next post.
Thanks,
-Jeff
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs