xfsprogs: use Q_XGETQUOTA2
cover xfsprogs: use Q_XGETQUOTA2
Patch series to make xfs_quota's repquota use the new Q_XGETQUOTA2 interface.
-Eric
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
PATCH 1/3 xfs_quota: define Q_XGETQUOTA2
This simply defines the Q_XGETQUOTA2 quotactl in xfsprogs.
--- include/xqm.h | 1 + quota/linux.c | 2 ++ quota/quota.h | 2 ++ 3 files changed, 5 insertions(+), 0 deletions(-)
include/xqm.h +1 -0
@@ -32,6 +32,7 @@#define Q_XGETQSTAT XQM_CMD(5)/* get quota subsystem status */ #define Q_XQUOTARM XQM_CMD(6)/* free disk space used by dquots */ #define Q_XQUOTASYNC XQM_CMD(7)/* delalloc flush, updates dquots */ +#define Q_XGETQUOTA2 XQM_CMD(9)/* get disk limits and usage */ /* * fs_disk_quota structure:
quota/linux.c +2 -0
@@ -49,6 +49,8 @@ xcommand_to_qcommand(return Q_XQUOTAOFF ;case XFS_GETQUOTA :return Q_XGETQUOTA ; +case XFS_GETQUOTA2 : +return Q_XGETQUOTA2 ;case XFS_SETQLIM :return Q_XSETQLIM ;case XFS_GETQSTAT :
quota/quota.h +2 -0
@@ -43,6 +43,8 @@ enum {XFS_GETQSTAT ,/* get quota subsystem status */ XFS_QUOTARM ,/* free disk space used by dquots */ XFS_QSYNC ,/* flush delayed allocate space */ +XFS_GETQSTATV ,/* newer version of quota stats */ + XFS_GETQUOTA2, /* get disk limits and usage */ };/*
Signature · 6 lines
1.7.1 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
PATCH 2/3 xfs_quota: make report_mount() take an "output id"
In reply to Eric SandeenAllow report_mount() to take a *oid pointer, an "output id" which will be filled in if the quotactl returns an ID for something other than that which was passed in.
Also, when printing results, print the id which was actually returned, not the id which was passed in.
Should be a no-op change at this point; the next patch which wires in Q_XGETQUOTA2 will make use of this.
--- quota/report.c | 24 ++++++++++++++---------- 1 files changed, 14 insertions(+), 10 deletions(-)
quota/report.c +14 -10
@@ -291,6 +291,7 @@ report_mount(FILE *fp, __uint32_t id, char *name, + __uint32_t *oid, uint form, uint type, fs_path_t *mount,
@@ -308,6 +309,9 @@ report_mount(return 0 ; } +if (oid) + *oid = d.d_id; +if (flags &TERSE_FLAG ) { count =0 ;if ((form &XFS_BLOCK_QUOTA ) && d.d_bcount)
@@ -324,19 +328,19 @@ report_mount(report_header (fp, form, type, mount, flags);if (flags &NO_LOOKUP_FLAG ) { -fprintf (fp,"#%-10u" , id); +fprintf (fp,"#%-10u" , d.d_id); }else {if (name ==NULL ) {if (type ==XFS_USER_QUOTA ) { -struct passwd *u =getpwuid (id); +struct passwd *u =getpwuid (d.d_id);if (u) name = u->pw_name; }else if (type ==XFS_GROUP_QUOTA ) { -struct group *g =getgrgid (id); +struct group *g =getgrgid (d.d_id);if (g) name = g->gr_name; }else if (type ==XFS_PROJ_QUOTA ) { -fs_project_t *p =getprprid (id); +fs_project_t *p =getprprid (d.d_id);if (p) name = p->pr_name; }
@@ -425,14 +429,14 @@ report_user_mount(if (upper) {/* identifier range specified */ for (id = lower; id <= upper; id++) { -if (report_mount (fp, id,NULL , +if (report_mount (fp, id,NULL ,NULL , form,XFS_USER_QUOTA , mount, flags)) flags |=NO_HEADER_FLAG ; } }else {setpwent ();while ((u =getpwent ()) !=NULL ) { -if (report_mount (fp, u->pw_uid, u->pw_name, +if (report_mount (fp, u->pw_uid, u->pw_name,NULL , form,XFS_USER_QUOTA , mount, flags)) flags |=NO_HEADER_FLAG ; }
@@ -457,14 +461,14 @@ report_group_mount(if (upper) {/* identifier range specified */ for (id = lower; id <= upper; id++) { -if (report_mount (fp, id,NULL , +if (report_mount (fp, id,NULL ,NULL , form,XFS_GROUP_QUOTA , mount, flags)) flags |=NO_HEADER_FLAG ; } }else {setgrent ();while ((g =getgrent ()) !=NULL ) { -if (report_mount (fp, g->gr_gid, g->gr_name, +if (report_mount (fp, g->gr_gid, g->gr_name,NULL , form,XFS_GROUP_QUOTA , mount, flags)) flags |=NO_HEADER_FLAG ; }
@@ -488,14 +492,14 @@ report_project_mount(if (upper) {/* identifier range specified */ for (id = lower; id <= upper; id++) { -if (report_mount (fp, id,NULL , +if (report_mount (fp, id,NULL ,NULL , form,XFS_PROJ_QUOTA , mount, flags)) flags |=NO_HEADER_FLAG ; } }else {setprent ();while ((p =getprent ()) !=NULL ) { -if (report_mount (fp, p->pr_prid, p->pr_name, +if (report_mount (fp, p->pr_prid, p->pr_name,NULL , form,XFS_PROJ_QUOTA , mount, flags)) flags |=NO_HEADER_FLAG ; }
Signature · 6 lines
1.7.1 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
PATCH 3/3 xfs_quota: use Q_XGETQUOTA2 for repquota
In reply to Eric SandeenRather than a loop over getpwnam() etc, use the Q_XGETQUOTA2 command to iterate through all active quotas.
If Q_XGETQUOTA2 fails, go back to the old way.
--- quota/quota.h | 1 + quota/report.c | 41 +++++++++++++++++++++++++++++++++++++---- 2 files changed, 38 insertions(+), 4 deletions(-)
quota/quota.h +1 -0
@@ -74,6 +74,7 @@ enum {DEFAULTS_FLAG =0x0100 ,/* use value as a default */ ABSOLUTE_FLAG =0x0200 ,/* absolute time, not related to now */ NO_LOOKUP_FLAG =0x0400 ,/* skip name lookups, just report ID */ + GETQUOTA2_FLAG = 0x0800, /* use getquota2 quotactl */ };/*
quota/report.c +37 -4
84 lines not on this page · raw message
Signature · 6 lines
1.7.1 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs