xfs: Add a new field to fs_quota_stat to get pquota
Subsystems (2)
PATCH 4/4 xfs: Add a new field to fs_quota_stat to get pquota
Add a new field to fs_quota_stat and define a new version for bigger size.
Signed-off-by Jie Liu <[email protected]>
Signed-off-by Chandra Seetharaman <[email protected]>
--- fs/quota/quota.c | 7 ++++++- fs/xfs/xfs_qm_syscalls.c | 23 +++++++++++++++-------- include/linux/dqblk_xfs.h | 29 ++++++++++++++++++++++++++++- 3 files changed, 49 insertions(+), 10 deletions(-)
fs/quota/quota.c +6 -1
@@ -203,8 +203,13 @@ static int quota_getxstate(struct super_block *sb, void __user *addr)if (!sb->s_qcop->get_xstate)return -ENOSYS ; +/* just get the version */ +if (copy_from_user (&fqs, addr,1 )) +return -EFAULT ; +if (!valid_qstat_version (fqs.qs_version)) + fqs.qs_version =FS_QSTAT_VERSION ; ret = sb->s_qcop->get_xstate (sb, &fqs); -if (!ret &©_to_user (addr, &fqs,sizeof (fqs))) +if (!ret &©_to_user (addr, &fqs,qstatsize (fqs.qs_version)))return -EFAULT ;return ret; }
fs/xfs/xfs_qm_syscalls.c +15 -8
@@ -427,7 +427,6 @@ xfs_qm_scall_getqstat( tempuqip = tempgqip = temppqip =B_FALSE ;memset (out,0 ,sizeof (fs_quota_stat_t)); - out->qs_version =FS_QSTAT_VERSION ;if (!xfs_sb_version_hasquota (&mp->m_sb)) { out->qs_uquota.qfs_ino =NULLFSINO ; out->qs_gquota.qfs_ino =NULLFSINO ;
@@ -440,8 +439,6 @@ xfs_qm_scall_getqstat( out->qs_pad =0 ; out->qs_uquota.qfs_ino = mp->m_sb.sb_uquotino; out->qs_gquota.qfs_ino = mp->m_sb.sb_gquotino; -if (&out->qs_gquota != &out->qs_pquota) - out->qs_pquota.qfs_ino = mp->m_sb.sb_pquotino;if (q) { uip = q->qi_uquotaip;
@@ -458,11 +455,6 @@ xfs_qm_scall_getqstat( 0, 0, &gip) == 0) tempgqip =B_TRUE ; } -if (!pip && mp->m_sb.sb_pquotino !=NULLFSINO ) { -if (xfs_iget (mp,NULL , mp->m_sb.sb_pquotino, -0 ,0 , &pip) ==0 ) - temppqip =B_TRUE ; - }if (uip) { out->qs_uquota.qfs_nblks = uip->i_d.di_nblocks; out->qs_uquota.qfs_nextents = uip->i_d.di_nextents;
@@ -481,6 +473,21 @@ xfs_qm_scall_getqstat(if (temppqip)IRELE (pip); } +if (out->qs_version >=FS_QSTAT_VERSION_2 ) { + out->qs_pquota.qfs_ino = mp->m_sb.sb_pquotino; +if (!pip && mp->m_sb.sb_pquotino !=NULLFSINO ) { +if (xfs_iget (mp,NULL , mp->m_sb.sb_pquotino, +0 ,0 , &pip) ==0 ) + temppqip =B_TRUE ; + } +if (pip) { + out->qs_pquota.qfs_nblks = pip->i_d.di_nblocks; + out->qs_pquota.qfs_nextents = pip->i_d.di_nextents; +if (temppqip) +IRELE (pip); + } + } +if (q) { out->qs_incoredqs = q->qi_dquots; out->qs_btimelimit = q->qi_btimelimit;
include/linux/dqblk_xfs.h +28 -1
@@ -18,6 +18,7 @@#define _LINUX_DQBLK_XFS_H#include <linux/types.h> +#include <linux/stddef.h> /* * Disk quota - quotactl(2) commands for the XFS Quota Manager (XQM).
@@ -139,6 +140,7 @@ typedef struct fs_disk_quota {* incore. */ #define FS_QSTAT_VERSION 1/* fs_quota_stat.qs_version */ +#define FS_QSTAT_VERSION_2 2/* new field qs_pquota */ /* * Some basic information about 'quota files'.
@@ -155,13 +157,38 @@ 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 */ __s32 qs_rtbtimelimit;/* limit for rt blks timer */ __u16 qs_bwarnlimit;/* limit for num warnings */ __u16 qs_iwarnlimit;/* limit for num warnings */ + fs_qfilestat_t qs_pquota; /* project quota storage information */ } fs_quota_stat_t; +#define FS_QSTAT_V1_SIZE (offsetof(fs_quota_stat_t, qs_pquota)) +#define FS_QSTAT_V2_SIZE (FS_QSTAT_V1_SIZE + sizeof(fs_qfilestat_t)) + +static inline int valid_qstat_version (int version) +{ +switch (version) { +case FS_QSTAT_VERSION : +case FS_QSTAT_VERSION_2 : +return 1 ; +default : +return 0 ; + } +} + +static inline int qstatsize (int version) +{ +switch (version) { +case FS_QSTAT_VERSION_2 : +return FS_QSTAT_V2_SIZE ; +case FS_QSTAT_VERSION : +default : +return FS_QSTAT_V1_SIZE ; + } +} +#endif /* _LINUX_DQBLK_XFS_H */
Signature · 6 lines
1.7.4.1 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs