On Thu, Jul 11, 2013 at 12:00:42AM -0500, Chandra Seetharaman wrote: > Added appropriate pads and code for backward compatibility. > > Copied over the old version as it is different from the newer padded > version. > > New callers of the system call have to set the version of the data > structure being passed, and kernel will fill as much data as requested. > > Signed-off-by: Chandra Seetharaman <sekharan@xxxxxxxxxx> > --- > fs/gfs2/quota.c | 3 -- > fs/quota/quota.c | 67 +++++++++++++++++++++++++++++++++++++-- > fs/xfs/xfs_qm_syscalls.c | 4 -- > include/uapi/linux/dqblk_xfs.h | 60 +++++++++++++++++++++++++++++++---- > 4 files changed, 116 insertions(+), 18 deletions(-) > > diff --git a/fs/gfs2/quota.c b/fs/gfs2/quota.c > index c7c840e..ca0dccd 100644 > --- a/fs/gfs2/quota.c > +++ b/fs/gfs2/quota.c > @@ -1443,9 +1443,6 @@ static int gfs2_quota_get_xstate(struct super_block *sb, > { > struct gfs2_sbd *sdp = sb->s_fs_info; > > - memset(fqs, 0, sizeof(struct fs_quota_stat)); > - fqs->qs_version = FS_QSTAT_VERSION; > - > switch (sdp->sd_args.ar_quota) { > case GFS2_QUOTA_ON: > fqs->qs_flags |= (FS_QUOTA_UDQ_ENFD | FS_QUOTA_GDQ_ENFD); > diff --git a/fs/quota/quota.c b/fs/quota/quota.c > index c7314f1..ac5dd3a 100644 > --- a/fs/quota/quota.c > +++ b/fs/quota/quota.c > @@ -204,15 +204,72 @@ static int quota_setxstate(struct super_block *sb, int cmd, void __user *addr) > return sb->s_qcop->set_xstate(sb, flags, cmd); > } > > -static int quota_getxstate(struct super_block *sb, void __user *addr) > +static int quota_getxstate(struct super_block *sb, void __user *addr, > + bool older_version) I'd suggest that the two API calls should be handled by separate functions so there are no overlapping, dependent branches in the code. > { > struct fs_quota_stat fqs; > - int ret; > + struct fs_quota_stat_v1 fqs_v1; > + int ret, size; > + void *fqsp; > > if (!sb->s_qcop->get_xstate) > return -ENOSYS; I'd also suggest that a sb->s_qcop->get_xstatev vector is added so that filesystems keep the separate as well. And that means we don't need to play the fs_quota_stat and conversion-to-fs_quota_stat_v1 games. i.e. the existing quota_getxstate() remains and uses the existing struct fs_quota_stat, and the new Q_XGETQSTATV calls quota_getxstatev() and uses the newly defined struct fs_quota_statv and ->get_xstatev() call.... > @@ -137,31 +139,75 @@ typedef struct fs_disk_quota { > * Provides a centralized way to get meta information about the quota subsystem. > * eg. space taken up for user and group quotas, number of dquots currently > * incore. > + * With version FS_QSTAT_VERSION, user space can send in an uninitialized > + * buffer and data will be filled by the kernel. > + * Starting FS_QSTAT_VERSION_2, to be used with Q_XGETQSTATV, user space > + * caller should set qs_version to the appropriate version of the > + * fs_quota_stat data structure they are providing. On return, user > + * space should check qs_version and use appropriate fields supported by > + * that version. > */ > #define FS_QSTAT_VERSION 1 /* fs_quota_stat.qs_version */ > +#define FS_QSTAT_VERSION_2 2 /* new field qs_pquota; realignment */ As per above, this reasoning and logic is all invalid now because we aren't trying to maintain compatibility between users of the same quotactl. We are using a new quotactl, so we do not need to overload the existing structure or versions. > +/* > + * Some basic information about 'quota files'. Version 2. > + */ > +struct fs_qfilestat { > + __u64 qfs_ino; /* inode number */ > + __u64 qfs_nblks; /* number of BBs 512-byte-blks */ > + __u32 qfs_nextents; /* number of extents */ > + __u32 qfs_pad; /* pad for 8-byte alignment */ > +}; > + > +struct fs_quota_stat { > + __s8 qs_version; /* version for future changes */ > + __u8 qs_pad1; /* pad for 16bit alignment */ > + __u16 qs_flags; /* FS_QUOTA_.* flags */ > + __u32 qs_incoredqs; /* number of dquots incore */ > + struct fs_qfilestat qs_uquota; /* user quota information */ > + struct fs_qfilestat qs_gquota; /* group quota information */ > + struct fs_qfilestat qs_pquota; /* project quota information */ > + __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 */ > + __u64 qs_pad2[8]; /* for future proofing */ > +}; these are what become fs_quota_statv and fs_qfilestatv structures for the new quotactl. > +/* > + * Since Version 1 did not have padding at appropriate places, > + * a new data structure has been defined for the older version to > + * provide backward compatibility. > + * Future extentions of this data structure won't require new > + * data structure definitions as the current one can be extended > + * with the logic and padding in place now. > + */ > +#define FS_QSTAT_V1_SIZE (sizeof(struct fs_quota_stat_v1)) > +#define FS_QSTAT_V2_SIZE (sizeof(struct fs_quota_stat)) And these can go away completely. Cheers, Dave. -- Dave Chinner david@xxxxxxxxxxxxx _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs