* [PATCH v3 1/5] xfs_quota: separate quota info acquisition into get_dquot()
2022-05-02 15:02 [PATCH v3 0/5] xfsprogs: optimize -L/-U range calls for xfs_quota's dump/report Andrey Albershteyn
@ 2022-05-02 15:02 ` Andrey Albershteyn
2022-05-02 15:02 ` [PATCH v3 2/5] xfs_quota: separate get_dquot() and dump_file() Andrey Albershteyn
` (3 subsequent siblings)
4 siblings, 0 replies; 7+ messages in thread
From: Andrey Albershteyn @ 2022-05-02 15:02 UTC (permalink / raw)
To: linux-xfs; +Cc: Andrey Albershteyn, Christoph Hellwig, Darrick J . Wong
Both report_mount() and dump_file() have identical code to get quota
information. This could be used for further separation of the
functions.
Signed-off-by: Andrey Albershteyn <aalbersh@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
---
quota/report.c | 49 +++++++++++++++++++++++--------------------------
1 file changed, 23 insertions(+), 26 deletions(-)
diff --git a/quota/report.c b/quota/report.c
index 2eb5b5a9..6994cba6 100644
--- a/quota/report.c
+++ b/quota/report.c
@@ -59,16 +59,15 @@ report_help(void)
"\n"));
}
-static int
-dump_file(
- FILE *fp,
+static int
+get_dquot(
+ struct fs_disk_quota *d,
uint id,
uint *oid,
uint type,
char *dev,
int flags)
{
- fs_disk_quota_t d;
int cmd;
if (flags & GETNEXTQUOTA_FLAG)
@@ -77,7 +76,7 @@ dump_file(
cmd = XFS_GETQUOTA;
/* Fall back silently if XFS_GETNEXTQUOTA fails, warn on XFS_GETQUOTA */
- if (xfsquotactl(cmd, dev, type, id, (void *)&d) < 0) {
+ if (xfsquotactl(cmd, dev, type, id, (void *)d) < 0) {
if (errno != ENOENT && errno != ENOSYS && errno != ESRCH &&
cmd == XFS_GETQUOTA)
perror("XFS_GETQUOTA");
@@ -85,12 +84,29 @@ dump_file(
}
if (oid) {
- *oid = d.d_id;
+ *oid = d->d_id;
/* Did kernelspace wrap? */
if (*oid < id)
return 0;
}
+ return 1;
+}
+
+static int
+dump_file(
+ FILE *fp,
+ uint id,
+ uint *oid,
+ uint type,
+ char *dev,
+ int flags)
+{
+ struct fs_disk_quota d;
+
+ if (!get_dquot(&d, id, oid, type, dev, flags))
+ return 0;
+
if (!d.d_blk_softlimit && !d.d_blk_hardlimit &&
!d.d_ino_softlimit && !d.d_ino_hardlimit &&
!d.d_rtb_softlimit && !d.d_rtb_hardlimit)
@@ -329,31 +345,12 @@ report_mount(
{
fs_disk_quota_t d;
time64_t timer;
- char *dev = mount->fs_name;
char c[8], h[8], s[8];
uint qflags;
int count;
- int cmd;
- if (flags & GETNEXTQUOTA_FLAG)
- cmd = XFS_GETNEXTQUOTA;
- else
- cmd = XFS_GETQUOTA;
-
- /* Fall back silently if XFS_GETNEXTQUOTA fails, warn on XFS_GETQUOTA*/
- if (xfsquotactl(cmd, dev, type, id, (void *)&d) < 0) {
- if (errno != ENOENT && errno != ENOSYS && errno != ESRCH &&
- cmd == XFS_GETQUOTA)
- perror("XFS_GETQUOTA");
+ if (!get_dquot(&d, id, oid, type, mount->fs_name, flags))
return 0;
- }
-
- if (oid) {
- *oid = d.d_id;
- /* Did kernelspace wrap? */
- if (* oid < id)
- return 0;
- }
if (flags & TERSE_FLAG) {
count = 0;
--
2.27.0
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH v3 2/5] xfs_quota: separate get_dquot() and dump_file()
2022-05-02 15:02 [PATCH v3 0/5] xfsprogs: optimize -L/-U range calls for xfs_quota's dump/report Andrey Albershteyn
2022-05-02 15:02 ` [PATCH v3 1/5] xfs_quota: separate quota info acquisition into get_dquot() Andrey Albershteyn
@ 2022-05-02 15:02 ` Andrey Albershteyn
2022-05-02 15:02 ` [PATCH v3 3/5] xfs_quota: separate get_dquot() and report_mount() Andrey Albershteyn
` (2 subsequent siblings)
4 siblings, 0 replies; 7+ messages in thread
From: Andrey Albershteyn @ 2022-05-02 15:02 UTC (permalink / raw)
To: linux-xfs; +Cc: Andrey Albershteyn, Christoph Hellwig, Darrick J . Wong
Separate quota info acquisition from outputting it to file. This
allows upper functions to filter obtained info (e.g. within specific
ID range).
Signed-off-by: Andrey Albershteyn <aalbersh@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
---
quota/report.c | 86 ++++++++++++++++++++++++++------------------------
1 file changed, 45 insertions(+), 41 deletions(-)
diff --git a/quota/report.c b/quota/report.c
index 6994cba6..d5c6f84f 100644
--- a/quota/report.c
+++ b/quota/report.c
@@ -96,39 +96,31 @@ get_dquot(
static int
dump_file(
FILE *fp,
- uint id,
- uint *oid,
- uint type,
- char *dev,
- int flags)
+ struct fs_disk_quota *d,
+ char *dev)
{
- struct fs_disk_quota d;
-
- if (!get_dquot(&d, id, oid, type, dev, flags))
- return 0;
-
- if (!d.d_blk_softlimit && !d.d_blk_hardlimit &&
- !d.d_ino_softlimit && !d.d_ino_hardlimit &&
- !d.d_rtb_softlimit && !d.d_rtb_hardlimit)
+ if (!d->d_blk_softlimit && !d->d_blk_hardlimit &&
+ !d->d_ino_softlimit && !d->d_ino_hardlimit &&
+ !d->d_rtb_softlimit && !d->d_rtb_hardlimit)
return 1;
fprintf(fp, "fs = %s\n", dev);
/* this branch is for backward compatibility reasons */
- if (d.d_rtb_softlimit || d.d_rtb_hardlimit)
+ if (d->d_rtb_softlimit || d->d_rtb_hardlimit)
fprintf(fp, "%-10d %7llu %7llu %7llu %7llu %7llu %7llu\n",
- d.d_id,
- (unsigned long long)d.d_blk_softlimit,
- (unsigned long long)d.d_blk_hardlimit,
- (unsigned long long)d.d_ino_softlimit,
- (unsigned long long)d.d_ino_hardlimit,
- (unsigned long long)d.d_rtb_softlimit,
- (unsigned long long)d.d_rtb_hardlimit);
+ d->d_id,
+ (unsigned long long)d->d_blk_softlimit,
+ (unsigned long long)d->d_blk_hardlimit,
+ (unsigned long long)d->d_ino_softlimit,
+ (unsigned long long)d->d_ino_hardlimit,
+ (unsigned long long)d->d_rtb_softlimit,
+ (unsigned long long)d->d_rtb_hardlimit);
else
fprintf(fp, "%-10d %7llu %7llu %7llu %7llu\n",
- d.d_id,
- (unsigned long long)d.d_blk_softlimit,
- (unsigned long long)d.d_blk_hardlimit,
- (unsigned long long)d.d_ino_softlimit,
- (unsigned long long)d.d_ino_hardlimit);
+ d->d_id,
+ (unsigned long long)d->d_blk_softlimit,
+ (unsigned long long)d->d_blk_hardlimit,
+ (unsigned long long)d->d_ino_softlimit,
+ (unsigned long long)d->d_ino_hardlimit);
return 1;
}
@@ -142,6 +134,7 @@ dump_limits_any_type(
uint upper)
{
fs_path_t *mount;
+ struct fs_disk_quota d;
uint id = 0, oid;
if ((mount = fs_table_lookup(dir, FS_MOUNT_POINT)) == NULL) {
@@ -153,46 +146,57 @@ dump_limits_any_type(
/* Range was specified; query everything in it */
if (upper) {
- for (id = lower; id <= upper; id++)
- dump_file(fp, id, NULL, type, mount->fs_name, 0);
+ for (id = lower; id <= upper; id++) {
+ get_dquot(&d, id, &oid, type, mount->fs_name, 0);
+ dump_file(fp, &d, mount->fs_name);
+ }
return;
}
/* Use GETNEXTQUOTA if it's available */
- if (dump_file(fp, id, &oid, type, mount->fs_name, GETNEXTQUOTA_FLAG)) {
+ if (get_dquot(&d, id, &oid, type, mount->fs_name, GETNEXTQUOTA_FLAG)) {
+ dump_file(fp, &d, mount->fs_name);
id = oid + 1;
- while (dump_file(fp, id, &oid, type, mount->fs_name,
- GETNEXTQUOTA_FLAG))
+ while (get_dquot(&d, id, &oid, type, mount->fs_name,
+ GETNEXTQUOTA_FLAG)) {
+ dump_file(fp, &d, mount->fs_name);
id = oid + 1;
+ }
return;
- }
+ }
/* Otherwise fall back to iterating over each uid/gid/prjid */
switch (type) {
case XFS_GROUP_QUOTA: {
struct group *g;
setgrent();
- while ((g = getgrent()) != NULL)
- dump_file(fp, g->gr_gid, NULL, type,
- mount->fs_name, 0);
+ while ((g = getgrent()) != NULL) {
+ get_dquot(&d, g->gr_gid, NULL, type,
+ mount->fs_name, 0);
+ dump_file(fp, &d, mount->fs_name);
+ }
endgrent();
break;
}
case XFS_PROJ_QUOTA: {
struct fs_project *p;
setprent();
- while ((p = getprent()) != NULL)
- dump_file(fp, p->pr_prid, NULL, type,
- mount->fs_name, 0);
+ while ((p = getprent()) != NULL) {
+ get_dquot(&d, p->pr_prid, NULL, type,
+ mount->fs_name, 0);
+ dump_file(fp, &d, mount->fs_name);
+ }
endprent();
break;
}
case XFS_USER_QUOTA: {
struct passwd *u;
setpwent();
- while ((u = getpwent()) != NULL)
- dump_file(fp, u->pw_uid, NULL, type,
- mount->fs_name, 0);
+ while ((u = getpwent()) != NULL) {
+ get_dquot(&d, u->pw_uid, NULL, type,
+ mount->fs_name, 0);
+ dump_file(fp, &d, mount->fs_name);
+ }
endpwent();
break;
}
--
2.27.0
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH v3 3/5] xfs_quota: separate get_dquot() and report_mount()
2022-05-02 15:02 [PATCH v3 0/5] xfsprogs: optimize -L/-U range calls for xfs_quota's dump/report Andrey Albershteyn
2022-05-02 15:02 ` [PATCH v3 1/5] xfs_quota: separate quota info acquisition into get_dquot() Andrey Albershteyn
2022-05-02 15:02 ` [PATCH v3 2/5] xfs_quota: separate get_dquot() and dump_file() Andrey Albershteyn
@ 2022-05-02 15:02 ` Andrey Albershteyn
2022-05-02 15:02 ` [PATCH v3 4/5] xfs_quota: utilize XFS_GETNEXTQUOTA for ranged calls in report/dump Andrey Albershteyn
2022-05-02 15:02 ` [PATCH v3 5/5] xfs_quota: apply -L/-U range limits in uid/gid/pid loops Andrey Albershteyn
4 siblings, 0 replies; 7+ messages in thread
From: Andrey Albershteyn @ 2022-05-02 15:02 UTC (permalink / raw)
To: linux-xfs; +Cc: Andrey Albershteyn, Christoph Hellwig, Darrick J . Wong
Separate quota info acquisition from outputting. This allows upper
functions to filter obtained info (e.g. within specific ID range).
Signed-off-by: Andrey Albershteyn <aalbersh@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
---
quota/report.c | 178 ++++++++++++++++++++++++++++---------------------
1 file changed, 103 insertions(+), 75 deletions(-)
diff --git a/quota/report.c b/quota/report.c
index d5c6f84f..8ca154f0 100644
--- a/quota/report.c
+++ b/quota/report.c
@@ -339,30 +339,25 @@ report_header(
static int
report_mount(
FILE *fp,
- uint32_t id,
+ struct fs_disk_quota *d,
char *name,
- uint32_t *oid,
uint form,
uint type,
fs_path_t *mount,
uint flags)
{
- fs_disk_quota_t d;
time64_t timer;
char c[8], h[8], s[8];
uint qflags;
int count;
- if (!get_dquot(&d, id, oid, type, mount->fs_name, flags))
- return 0;
-
if (flags & TERSE_FLAG) {
count = 0;
- if ((form & XFS_BLOCK_QUOTA) && d.d_bcount)
+ if ((form & XFS_BLOCK_QUOTA) && d->d_bcount)
count++;
- if ((form & XFS_INODE_QUOTA) && d.d_icount)
+ if ((form & XFS_INODE_QUOTA) && d->d_icount)
count++;
- if ((form & XFS_RTBLOCK_QUOTA) && d.d_rtbcount)
+ if ((form & XFS_RTBLOCK_QUOTA) && d->d_rtbcount)
count++;
if (!count)
return 0;
@@ -372,19 +367,19 @@ report_mount(
report_header(fp, form, type, mount, flags);
if (flags & NO_LOOKUP_FLAG) {
- fprintf(fp, "#%-10u", d.d_id);
+ fprintf(fp, "#%-10u", d->d_id);
} else {
if (name == NULL) {
if (type == XFS_USER_QUOTA) {
- struct passwd *u = getpwuid(d.d_id);
+ struct passwd *u = getpwuid(d->d_id);
if (u)
name = u->pw_name;
} else if (type == XFS_GROUP_QUOTA) {
- struct group *g = getgrgid(d.d_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(d.d_id);
+ fs_project_t *p = getprprid(d->d_id);
if (p)
name = p->pr_name;
}
@@ -393,73 +388,73 @@ report_mount(
if (name != NULL)
fprintf(fp, "%-10s", name);
else
- fprintf(fp, "#%-9u", d.d_id);
+ fprintf(fp, "#%-9u", d->d_id);
}
if (form & XFS_BLOCK_QUOTA) {
- timer = decode_timer(&d, d.d_btimer, d.d_btimer_hi);
+ timer = decode_timer(d, d->d_btimer, d->d_btimer_hi);
qflags = (flags & HUMAN_FLAG);
- if (d.d_blk_hardlimit && d.d_bcount > d.d_blk_hardlimit)
+ if (d->d_blk_hardlimit && d->d_bcount > d->d_blk_hardlimit)
qflags |= LIMIT_FLAG;
- if (d.d_blk_softlimit && d.d_bcount > d.d_blk_softlimit)
+ if (d->d_blk_softlimit && d->d_bcount > d->d_blk_softlimit)
qflags |= QUOTA_FLAG;
if (flags & HUMAN_FLAG)
fprintf(fp, " %6s %6s %6s %02d %8s",
- bbs_to_string(d.d_bcount, c, sizeof(c)),
- bbs_to_string(d.d_blk_softlimit, s, sizeof(s)),
- bbs_to_string(d.d_blk_hardlimit, h, sizeof(h)),
- d.d_bwarns,
+ bbs_to_string(d->d_bcount, c, sizeof(c)),
+ bbs_to_string(d->d_blk_softlimit, s, sizeof(s)),
+ bbs_to_string(d->d_blk_hardlimit, h, sizeof(h)),
+ d->d_bwarns,
time_to_string(timer, qflags));
else
fprintf(fp, " %10llu %10llu %10llu %02d %9s",
- (unsigned long long)d.d_bcount >> 1,
- (unsigned long long)d.d_blk_softlimit >> 1,
- (unsigned long long)d.d_blk_hardlimit >> 1,
- d.d_bwarns,
+ (unsigned long long)d->d_bcount >> 1,
+ (unsigned long long)d->d_blk_softlimit >> 1,
+ (unsigned long long)d->d_blk_hardlimit >> 1,
+ d->d_bwarns,
time_to_string(timer, qflags));
}
if (form & XFS_INODE_QUOTA) {
- timer = decode_timer(&d, d.d_itimer, d.d_itimer_hi);
+ timer = decode_timer(d, d->d_itimer, d->d_itimer_hi);
qflags = (flags & HUMAN_FLAG);
- if (d.d_ino_hardlimit && d.d_icount > d.d_ino_hardlimit)
+ if (d->d_ino_hardlimit && d->d_icount > d->d_ino_hardlimit)
qflags |= LIMIT_FLAG;
- if (d.d_ino_softlimit && d.d_icount > d.d_ino_softlimit)
+ if (d->d_ino_softlimit && d->d_icount > d->d_ino_softlimit)
qflags |= QUOTA_FLAG;
if (flags & HUMAN_FLAG)
fprintf(fp, " %6s %6s %6s %02d %8s",
- num_to_string(d.d_icount, c, sizeof(c)),
- num_to_string(d.d_ino_softlimit, s, sizeof(s)),
- num_to_string(d.d_ino_hardlimit, h, sizeof(h)),
- d.d_iwarns,
+ num_to_string(d->d_icount, c, sizeof(c)),
+ num_to_string(d->d_ino_softlimit, s, sizeof(s)),
+ num_to_string(d->d_ino_hardlimit, h, sizeof(h)),
+ d->d_iwarns,
time_to_string(timer, qflags));
else
fprintf(fp, " %10llu %10llu %10llu %02d %9s",
- (unsigned long long)d.d_icount,
- (unsigned long long)d.d_ino_softlimit,
- (unsigned long long)d.d_ino_hardlimit,
- d.d_iwarns,
+ (unsigned long long)d->d_icount,
+ (unsigned long long)d->d_ino_softlimit,
+ (unsigned long long)d->d_ino_hardlimit,
+ d->d_iwarns,
time_to_string(timer, qflags));
}
if (form & XFS_RTBLOCK_QUOTA) {
- timer = decode_timer(&d, d.d_rtbtimer, d.d_rtbtimer_hi);
+ timer = decode_timer(d, d->d_rtbtimer, d->d_rtbtimer_hi);
qflags = (flags & HUMAN_FLAG);
- if (d.d_rtb_hardlimit && d.d_rtbcount > d.d_rtb_hardlimit)
+ if (d->d_rtb_hardlimit && d->d_rtbcount > d->d_rtb_hardlimit)
qflags |= LIMIT_FLAG;
- if (d.d_rtb_softlimit && d.d_rtbcount > d.d_rtb_softlimit)
+ if (d->d_rtb_softlimit && d->d_rtbcount > d->d_rtb_softlimit)
qflags |= QUOTA_FLAG;
if (flags & HUMAN_FLAG)
fprintf(fp, " %6s %6s %6s %02d %8s",
- bbs_to_string(d.d_rtbcount, c, sizeof(c)),
- bbs_to_string(d.d_rtb_softlimit, s, sizeof(s)),
- bbs_to_string(d.d_rtb_hardlimit, h, sizeof(h)),
- d.d_rtbwarns,
+ bbs_to_string(d->d_rtbcount, c, sizeof(c)),
+ bbs_to_string(d->d_rtb_softlimit, s, sizeof(s)),
+ bbs_to_string(d->d_rtb_hardlimit, h, sizeof(h)),
+ d->d_rtbwarns,
time_to_string(timer, qflags));
else
fprintf(fp, " %10llu %10llu %10llu %02d %9s",
- (unsigned long long)d.d_rtbcount >> 1,
- (unsigned long long)d.d_rtb_softlimit >> 1,
- (unsigned long long)d.d_rtb_hardlimit >> 1,
- d.d_rtbwarns,
+ (unsigned long long)d->d_rtbcount >> 1,
+ (unsigned long long)d->d_rtb_softlimit >> 1,
+ (unsigned long long)d->d_rtb_hardlimit >> 1,
+ d->d_rtbwarns,
time_to_string(timer, qflags));
}
fputc('\n', fp);
@@ -476,30 +471,40 @@ report_user_mount(
uint flags)
{
struct passwd *u;
+ struct fs_disk_quota d;
uint id = 0, oid;
if (upper) { /* identifier range specified */
for (id = lower; id <= upper; id++) {
- if (report_mount(fp, id, NULL, NULL,
- form, XFS_USER_QUOTA, mount, flags))
+ if (get_dquot(&d, id, NULL, XFS_USER_QUOTA,
+ mount->fs_name, flags)) {
+ report_mount(fp, &d, NULL, form, XFS_USER_QUOTA,
+ mount, flags);
flags |= NO_HEADER_FLAG;
+ }
}
- } else if (report_mount(fp, id, NULL, &oid, form,
- XFS_USER_QUOTA, mount,
+ } else if (get_dquot(&d, id, &oid, XFS_USER_QUOTA, mount->fs_name,
flags|GETNEXTQUOTA_FLAG)) {
+ report_mount(fp, &d, NULL, form, XFS_USER_QUOTA, mount,
+ flags|GETNEXTQUOTA_FLAG);
id = oid + 1;
flags |= GETNEXTQUOTA_FLAG;
flags |= NO_HEADER_FLAG;
- while (report_mount(fp, id, NULL, &oid, form, XFS_USER_QUOTA,
- mount, flags)) {
+ while (get_dquot(&d, id, &oid, XFS_USER_QUOTA, mount->fs_name,
+ flags)) {
+ report_mount(fp, &d, NULL, form, XFS_USER_QUOTA,
+ mount, flags);
id = oid + 1;
}
} else {
setpwent();
while ((u = getpwent()) != NULL) {
- if (report_mount(fp, u->pw_uid, u->pw_name, NULL,
- form, XFS_USER_QUOTA, mount, flags))
+ if (get_dquot(&d, u->pw_uid, NULL, XFS_USER_QUOTA,
+ mount->fs_name, flags)) {
+ report_mount(fp, &d, u->pw_name, form,
+ XFS_USER_QUOTA, mount, flags);
flags |= NO_HEADER_FLAG;
+ }
}
endpwent();
}
@@ -518,30 +523,40 @@ report_group_mount(
uint flags)
{
struct group *g;
+ struct fs_disk_quota d;
uint id = 0, oid;
if (upper) { /* identifier range specified */
for (id = lower; id <= upper; id++) {
- if (report_mount(fp, id, NULL, NULL,
- form, XFS_GROUP_QUOTA, mount, flags))
+ if (get_dquot(&d, id, NULL, XFS_GROUP_QUOTA,
+ mount->fs_name, flags)) {
+ report_mount(fp, &d, NULL, form,
+ XFS_GROUP_QUOTA, mount, flags);
flags |= NO_HEADER_FLAG;
+ }
}
- } else if (report_mount(fp, id, NULL, &oid, form,
- XFS_GROUP_QUOTA, mount,
- flags|GETNEXTQUOTA_FLAG)) {
+ } else if (get_dquot(&d, id, &oid, XFS_GROUP_QUOTA,
+ mount->fs_name, flags|GETNEXTQUOTA_FLAG)) {
+ report_mount(fp, &d, NULL, form, XFS_GROUP_QUOTA, mount,
+ flags|GETNEXTQUOTA_FLAG);
id = oid + 1;
flags |= GETNEXTQUOTA_FLAG;
flags |= NO_HEADER_FLAG;
- while (report_mount(fp, id, NULL, &oid, form, XFS_GROUP_QUOTA,
- mount, flags)) {
+ while (get_dquot(&d, id, &oid, XFS_GROUP_QUOTA,
+ mount->fs_name, flags)) {
+ report_mount(fp, &d, NULL, form, XFS_GROUP_QUOTA, mount,
+ flags);
id = oid + 1;
}
} else {
setgrent();
while ((g = getgrent()) != NULL) {
- if (report_mount(fp, g->gr_gid, g->gr_name, NULL,
- form, XFS_GROUP_QUOTA, mount, flags))
+ if (get_dquot(&d, g->gr_gid, NULL, XFS_GROUP_QUOTA,
+ mount->fs_name, flags)) {
+ report_mount(fp, &d, g->gr_name, form,
+ XFS_GROUP_QUOTA, mount, flags);
flags |= NO_HEADER_FLAG;
+ }
}
}
if (flags & NO_HEADER_FLAG)
@@ -559,22 +574,29 @@ report_project_mount(
uint flags)
{
fs_project_t *p;
+ struct fs_disk_quota d;
uint id = 0, oid;
if (upper) { /* identifier range specified */
for (id = lower; id <= upper; id++) {
- if (report_mount(fp, id, NULL, NULL,
- form, XFS_PROJ_QUOTA, mount, flags))
+ if (get_dquot(&d, id, NULL, XFS_PROJ_QUOTA,
+ mount->fs_name, flags)) {
+ report_mount(fp, &d, NULL, form, XFS_PROJ_QUOTA,
+ mount, flags);
flags |= NO_HEADER_FLAG;
+ }
}
- } else if (report_mount(fp, id, NULL, &oid, form,
- XFS_PROJ_QUOTA, mount,
- flags|GETNEXTQUOTA_FLAG)) {
+ } else if (get_dquot(&d, id, &oid, XFS_PROJ_QUOTA,
+ mount->fs_name, flags|GETNEXTQUOTA_FLAG)) {
+ report_mount(fp, &d, NULL, form, XFS_PROJ_QUOTA, mount,
+ flags|GETNEXTQUOTA_FLAG);
id = oid + 1;
flags |= GETNEXTQUOTA_FLAG;
flags |= NO_HEADER_FLAG;
- while (report_mount(fp, id, NULL, &oid, form, XFS_PROJ_QUOTA,
- mount, flags)) {
+ while (get_dquot(&d, id, &oid, XFS_PROJ_QUOTA,
+ mount->fs_name, flags)) {
+ report_mount(fp, &d, NULL, form, XFS_PROJ_QUOTA, mount,
+ flags);
id = oid + 1;
}
} else {
@@ -583,16 +605,22 @@ report_project_mount(
* Print default project quota, even if projid 0
* isn't defined
*/
- if (report_mount(fp, 0, NULL, NULL,
- form, XFS_PROJ_QUOTA, mount, flags))
+ if (get_dquot(&d, 0, NULL, XFS_PROJ_QUOTA,
+ mount->fs_name, flags)) {
+ report_mount(fp, &d, NULL, form, XFS_PROJ_QUOTA,
+ mount, flags);
flags |= NO_HEADER_FLAG;
+ }
}
setprent();
while ((p = getprent()) != NULL) {
- if (report_mount(fp, p->pr_prid, p->pr_name, NULL,
- form, XFS_PROJ_QUOTA, mount, flags))
+ if (get_dquot(&d, p->pr_prid, NULL, XFS_PROJ_QUOTA,
+ mount->fs_name, flags)) {
+ report_mount(fp, &d, p->pr_name, form,
+ XFS_PROJ_QUOTA, mount, flags);
flags |= NO_HEADER_FLAG;
+ }
}
endprent();
}
--
2.27.0
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH v3 4/5] xfs_quota: utilize XFS_GETNEXTQUOTA for ranged calls in report/dump
2022-05-02 15:02 [PATCH v3 0/5] xfsprogs: optimize -L/-U range calls for xfs_quota's dump/report Andrey Albershteyn
` (2 preceding siblings ...)
2022-05-02 15:02 ` [PATCH v3 3/5] xfs_quota: separate get_dquot() and report_mount() Andrey Albershteyn
@ 2022-05-02 15:02 ` Andrey Albershteyn
2022-05-03 23:00 ` Darrick J. Wong
2022-05-02 15:02 ` [PATCH v3 5/5] xfs_quota: apply -L/-U range limits in uid/gid/pid loops Andrey Albershteyn
4 siblings, 1 reply; 7+ messages in thread
From: Andrey Albershteyn @ 2022-05-02 15:02 UTC (permalink / raw)
To: linux-xfs; +Cc: Andrey Albershteyn, Christoph Hellwig
The implementation based on XFS_GETQUOTA call for each ID in range,
specified with -L/-U, is quite slow for wider ranges.
If kernel supports XFS_GETNEXTQUOTA, report_*_mount/dump_any_file
will use that to obtain quota list for the mount. XFS_GETNEXTQUOTA
returns quota of the requested ID and next ID with non-empty quota.
Otherwise, XFS_GETQUOTA will be used for each user/group/project ID
known from password/group/project database.
Signed-off-by: Andrey Albershteyn <aalbersh@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
---
quota/report.c | 148 ++++++++++++++++---------------------------------
1 file changed, 49 insertions(+), 99 deletions(-)
diff --git a/quota/report.c b/quota/report.c
index 8ca154f0..2b9577a5 100644
--- a/quota/report.c
+++ b/quota/report.c
@@ -63,7 +63,6 @@ static int
get_dquot(
struct fs_disk_quota *d,
uint id,
- uint *oid,
uint type,
char *dev,
int flags)
@@ -83,12 +82,9 @@ get_dquot(
return 0;
}
- if (oid) {
- *oid = d->d_id;
- /* Did kernelspace wrap? */
- if (*oid < id)
- return 0;
- }
+ /* Did kernelspace wrap? */
+ if (d->d_id < id)
+ return 0;
return 1;
}
@@ -135,7 +131,7 @@ dump_limits_any_type(
{
fs_path_t *mount;
struct fs_disk_quota d;
- uint id = 0, oid;
+ uint id = lower, flags = 0;
if ((mount = fs_table_lookup(dir, FS_MOUNT_POINT)) == NULL) {
exitcode = 1;
@@ -144,26 +140,16 @@ dump_limits_any_type(
return;
}
- /* Range was specified; query everything in it */
- if (upper) {
- for (id = lower; id <= upper; id++) {
- get_dquot(&d, id, &oid, type, mount->fs_name, 0);
- dump_file(fp, &d, mount->fs_name);
- }
- return;
+ while (get_dquot(&d, id, type, mount->fs_name,
+ flags | GETNEXTQUOTA_FLAG) &&
+ !(upper && (d.d_id > upper))) {
+ dump_file(fp, &d, mount->fs_name);
+ id = d.d_id + 1;
+ flags |= GETNEXTQUOTA_FLAG;
}
- /* Use GETNEXTQUOTA if it's available */
- if (get_dquot(&d, id, &oid, type, mount->fs_name, GETNEXTQUOTA_FLAG)) {
- dump_file(fp, &d, mount->fs_name);
- id = oid + 1;
- while (get_dquot(&d, id, &oid, type, mount->fs_name,
- GETNEXTQUOTA_FLAG)) {
- dump_file(fp, &d, mount->fs_name);
- id = oid + 1;
- }
+ if (flags & GETNEXTQUOTA_FLAG)
return;
- }
/* Otherwise fall back to iterating over each uid/gid/prjid */
switch (type) {
@@ -171,7 +157,7 @@ dump_limits_any_type(
struct group *g;
setgrent();
while ((g = getgrent()) != NULL) {
- get_dquot(&d, g->gr_gid, NULL, type,
+ get_dquot(&d, g->gr_gid, type,
mount->fs_name, 0);
dump_file(fp, &d, mount->fs_name);
}
@@ -182,7 +168,7 @@ dump_limits_any_type(
struct fs_project *p;
setprent();
while ((p = getprent()) != NULL) {
- get_dquot(&d, p->pr_prid, NULL, type,
+ get_dquot(&d, p->pr_prid, type,
mount->fs_name, 0);
dump_file(fp, &d, mount->fs_name);
}
@@ -193,7 +179,7 @@ dump_limits_any_type(
struct passwd *u;
setpwent();
while ((u = getpwent()) != NULL) {
- get_dquot(&d, u->pw_uid, NULL, type,
+ get_dquot(&d, u->pw_uid, type,
mount->fs_name, 0);
dump_file(fp, &d, mount->fs_name);
}
@@ -472,34 +458,22 @@ report_user_mount(
{
struct passwd *u;
struct fs_disk_quota d;
- uint id = 0, oid;
+ uint id = lower;
- if (upper) { /* identifier range specified */
- for (id = lower; id <= upper; id++) {
- if (get_dquot(&d, id, NULL, XFS_USER_QUOTA,
- mount->fs_name, flags)) {
- report_mount(fp, &d, NULL, form, XFS_USER_QUOTA,
- mount, flags);
- flags |= NO_HEADER_FLAG;
- }
- }
- } else if (get_dquot(&d, id, &oid, XFS_USER_QUOTA, mount->fs_name,
- flags|GETNEXTQUOTA_FLAG)) {
- report_mount(fp, &d, NULL, form, XFS_USER_QUOTA, mount,
- flags|GETNEXTQUOTA_FLAG);
- id = oid + 1;
+ while (get_dquot(&d, id, XFS_USER_QUOTA, mount->fs_name,
+ flags | GETNEXTQUOTA_FLAG) &&
+ !(upper && (d.d_id > upper))) {
+ report_mount(fp, &d, NULL, form, XFS_USER_QUOTA, mount, flags);
+ id = d.d_id + 1;
flags |= GETNEXTQUOTA_FLAG;
flags |= NO_HEADER_FLAG;
- while (get_dquot(&d, id, &oid, XFS_USER_QUOTA, mount->fs_name,
- flags)) {
- report_mount(fp, &d, NULL, form, XFS_USER_QUOTA,
- mount, flags);
- id = oid + 1;
- }
- } else {
+ }
+
+ /* No GETNEXTQUOTA support, iterate over all from password file */
+ if (!(flags & GETNEXTQUOTA_FLAG)) {
setpwent();
while ((u = getpwent()) != NULL) {
- if (get_dquot(&d, u->pw_uid, NULL, XFS_USER_QUOTA,
+ if (get_dquot(&d, u->pw_uid, XFS_USER_QUOTA,
mount->fs_name, flags)) {
report_mount(fp, &d, u->pw_name, form,
XFS_USER_QUOTA, mount, flags);
@@ -524,34 +498,22 @@ report_group_mount(
{
struct group *g;
struct fs_disk_quota d;
- uint id = 0, oid;
+ uint id = lower;
- if (upper) { /* identifier range specified */
- for (id = lower; id <= upper; id++) {
- if (get_dquot(&d, id, NULL, XFS_GROUP_QUOTA,
- mount->fs_name, flags)) {
- report_mount(fp, &d, NULL, form,
- XFS_GROUP_QUOTA, mount, flags);
- flags |= NO_HEADER_FLAG;
- }
- }
- } else if (get_dquot(&d, id, &oid, XFS_GROUP_QUOTA,
- mount->fs_name, flags|GETNEXTQUOTA_FLAG)) {
- report_mount(fp, &d, NULL, form, XFS_GROUP_QUOTA, mount,
- flags|GETNEXTQUOTA_FLAG);
- id = oid + 1;
+ while (get_dquot(&d, id, XFS_GROUP_QUOTA, mount->fs_name,
+ flags | GETNEXTQUOTA_FLAG) &&
+ !(upper && (d.d_id > upper))) {
+ report_mount(fp, &d, NULL, form, XFS_GROUP_QUOTA, mount, flags);
+ id = d.d_id + 1;
flags |= GETNEXTQUOTA_FLAG;
flags |= NO_HEADER_FLAG;
- while (get_dquot(&d, id, &oid, XFS_GROUP_QUOTA,
- mount->fs_name, flags)) {
- report_mount(fp, &d, NULL, form, XFS_GROUP_QUOTA, mount,
- flags);
- id = oid + 1;
- }
- } else {
+ }
+
+ /* No GETNEXTQUOTA support, iterate over all from password file */
+ if (!(flags & GETNEXTQUOTA_FLAG)) {
setgrent();
while ((g = getgrent()) != NULL) {
- if (get_dquot(&d, g->gr_gid, NULL, XFS_GROUP_QUOTA,
+ if (get_dquot(&d, g->gr_gid, XFS_GROUP_QUOTA,
mount->fs_name, flags)) {
report_mount(fp, &d, g->gr_name, form,
XFS_GROUP_QUOTA, mount, flags);
@@ -575,38 +537,26 @@ report_project_mount(
{
fs_project_t *p;
struct fs_disk_quota d;
- uint id = 0, oid;
+ uint id = lower;
- if (upper) { /* identifier range specified */
- for (id = lower; id <= upper; id++) {
- if (get_dquot(&d, id, NULL, XFS_PROJ_QUOTA,
- mount->fs_name, flags)) {
- report_mount(fp, &d, NULL, form, XFS_PROJ_QUOTA,
- mount, flags);
- flags |= NO_HEADER_FLAG;
- }
- }
- } else if (get_dquot(&d, id, &oid, XFS_PROJ_QUOTA,
- mount->fs_name, flags|GETNEXTQUOTA_FLAG)) {
- report_mount(fp, &d, NULL, form, XFS_PROJ_QUOTA, mount,
- flags|GETNEXTQUOTA_FLAG);
- id = oid + 1;
+ while (get_dquot(&d, id, XFS_PROJ_QUOTA, mount->fs_name,
+ flags | GETNEXTQUOTA_FLAG) &&
+ !(upper && (d.d_id > upper))) {
+ report_mount(fp, &d, NULL, form, XFS_PROJ_QUOTA, mount, flags);
+ id = d.d_id + 1;
flags |= GETNEXTQUOTA_FLAG;
flags |= NO_HEADER_FLAG;
- while (get_dquot(&d, id, &oid, XFS_PROJ_QUOTA,
- mount->fs_name, flags)) {
- report_mount(fp, &d, NULL, form, XFS_PROJ_QUOTA, mount,
- flags);
- id = oid + 1;
- }
- } else {
+ }
+
+ /* No GETNEXTQUOTA support, iterate over all */
+ if (!(flags & GETNEXTQUOTA_FLAG)) {
if (!getprprid(0)) {
/*
* Print default project quota, even if projid 0
* isn't defined
*/
- if (get_dquot(&d, 0, NULL, XFS_PROJ_QUOTA,
- mount->fs_name, flags)) {
+ if (get_dquot(&d, 0, XFS_PROJ_QUOTA, mount->fs_name,
+ flags)) {
report_mount(fp, &d, NULL, form, XFS_PROJ_QUOTA,
mount, flags);
flags |= NO_HEADER_FLAG;
@@ -615,7 +565,7 @@ report_project_mount(
setprent();
while ((p = getprent()) != NULL) {
- if (get_dquot(&d, p->pr_prid, NULL, XFS_PROJ_QUOTA,
+ if (get_dquot(&d, p->pr_prid, XFS_PROJ_QUOTA,
mount->fs_name, flags)) {
report_mount(fp, &d, p->pr_name, form,
XFS_PROJ_QUOTA, mount, flags);
--
2.27.0
^ permalink raw reply related [flat|nested] 7+ messages in thread* Re: [PATCH v3 4/5] xfs_quota: utilize XFS_GETNEXTQUOTA for ranged calls in report/dump
2022-05-02 15:02 ` [PATCH v3 4/5] xfs_quota: utilize XFS_GETNEXTQUOTA for ranged calls in report/dump Andrey Albershteyn
@ 2022-05-03 23:00 ` Darrick J. Wong
0 siblings, 0 replies; 7+ messages in thread
From: Darrick J. Wong @ 2022-05-03 23:00 UTC (permalink / raw)
To: Andrey Albershteyn; +Cc: linux-xfs, Christoph Hellwig
On Mon, May 02, 2022 at 05:02:10PM +0200, Andrey Albershteyn wrote:
> The implementation based on XFS_GETQUOTA call for each ID in range,
> specified with -L/-U, is quite slow for wider ranges.
>
> If kernel supports XFS_GETNEXTQUOTA, report_*_mount/dump_any_file
> will use that to obtain quota list for the mount. XFS_GETNEXTQUOTA
> returns quota of the requested ID and next ID with non-empty quota.
>
> Otherwise, XFS_GETQUOTA will be used for each user/group/project ID
> known from password/group/project database.
>
> Signed-off-by: Andrey Albershteyn <aalbersh@redhat.com>
> Reviewed-by: Christoph Hellwig <hch@lst.de>
Looks good now,
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
--D
> ---
> quota/report.c | 148 ++++++++++++++++---------------------------------
> 1 file changed, 49 insertions(+), 99 deletions(-)
>
> diff --git a/quota/report.c b/quota/report.c
> index 8ca154f0..2b9577a5 100644
> --- a/quota/report.c
> +++ b/quota/report.c
> @@ -63,7 +63,6 @@ static int
> get_dquot(
> struct fs_disk_quota *d,
> uint id,
> - uint *oid,
> uint type,
> char *dev,
> int flags)
> @@ -83,12 +82,9 @@ get_dquot(
> return 0;
> }
>
> - if (oid) {
> - *oid = d->d_id;
> - /* Did kernelspace wrap? */
> - if (*oid < id)
> - return 0;
> - }
> + /* Did kernelspace wrap? */
> + if (d->d_id < id)
> + return 0;
>
> return 1;
> }
> @@ -135,7 +131,7 @@ dump_limits_any_type(
> {
> fs_path_t *mount;
> struct fs_disk_quota d;
> - uint id = 0, oid;
> + uint id = lower, flags = 0;
>
> if ((mount = fs_table_lookup(dir, FS_MOUNT_POINT)) == NULL) {
> exitcode = 1;
> @@ -144,26 +140,16 @@ dump_limits_any_type(
> return;
> }
>
> - /* Range was specified; query everything in it */
> - if (upper) {
> - for (id = lower; id <= upper; id++) {
> - get_dquot(&d, id, &oid, type, mount->fs_name, 0);
> - dump_file(fp, &d, mount->fs_name);
> - }
> - return;
> + while (get_dquot(&d, id, type, mount->fs_name,
> + flags | GETNEXTQUOTA_FLAG) &&
> + !(upper && (d.d_id > upper))) {
> + dump_file(fp, &d, mount->fs_name);
> + id = d.d_id + 1;
> + flags |= GETNEXTQUOTA_FLAG;
> }
>
> - /* Use GETNEXTQUOTA if it's available */
> - if (get_dquot(&d, id, &oid, type, mount->fs_name, GETNEXTQUOTA_FLAG)) {
> - dump_file(fp, &d, mount->fs_name);
> - id = oid + 1;
> - while (get_dquot(&d, id, &oid, type, mount->fs_name,
> - GETNEXTQUOTA_FLAG)) {
> - dump_file(fp, &d, mount->fs_name);
> - id = oid + 1;
> - }
> + if (flags & GETNEXTQUOTA_FLAG)
> return;
> - }
>
> /* Otherwise fall back to iterating over each uid/gid/prjid */
> switch (type) {
> @@ -171,7 +157,7 @@ dump_limits_any_type(
> struct group *g;
> setgrent();
> while ((g = getgrent()) != NULL) {
> - get_dquot(&d, g->gr_gid, NULL, type,
> + get_dquot(&d, g->gr_gid, type,
> mount->fs_name, 0);
> dump_file(fp, &d, mount->fs_name);
> }
> @@ -182,7 +168,7 @@ dump_limits_any_type(
> struct fs_project *p;
> setprent();
> while ((p = getprent()) != NULL) {
> - get_dquot(&d, p->pr_prid, NULL, type,
> + get_dquot(&d, p->pr_prid, type,
> mount->fs_name, 0);
> dump_file(fp, &d, mount->fs_name);
> }
> @@ -193,7 +179,7 @@ dump_limits_any_type(
> struct passwd *u;
> setpwent();
> while ((u = getpwent()) != NULL) {
> - get_dquot(&d, u->pw_uid, NULL, type,
> + get_dquot(&d, u->pw_uid, type,
> mount->fs_name, 0);
> dump_file(fp, &d, mount->fs_name);
> }
> @@ -472,34 +458,22 @@ report_user_mount(
> {
> struct passwd *u;
> struct fs_disk_quota d;
> - uint id = 0, oid;
> + uint id = lower;
>
> - if (upper) { /* identifier range specified */
> - for (id = lower; id <= upper; id++) {
> - if (get_dquot(&d, id, NULL, XFS_USER_QUOTA,
> - mount->fs_name, flags)) {
> - report_mount(fp, &d, NULL, form, XFS_USER_QUOTA,
> - mount, flags);
> - flags |= NO_HEADER_FLAG;
> - }
> - }
> - } else if (get_dquot(&d, id, &oid, XFS_USER_QUOTA, mount->fs_name,
> - flags|GETNEXTQUOTA_FLAG)) {
> - report_mount(fp, &d, NULL, form, XFS_USER_QUOTA, mount,
> - flags|GETNEXTQUOTA_FLAG);
> - id = oid + 1;
> + while (get_dquot(&d, id, XFS_USER_QUOTA, mount->fs_name,
> + flags | GETNEXTQUOTA_FLAG) &&
> + !(upper && (d.d_id > upper))) {
> + report_mount(fp, &d, NULL, form, XFS_USER_QUOTA, mount, flags);
> + id = d.d_id + 1;
> flags |= GETNEXTQUOTA_FLAG;
> flags |= NO_HEADER_FLAG;
> - while (get_dquot(&d, id, &oid, XFS_USER_QUOTA, mount->fs_name,
> - flags)) {
> - report_mount(fp, &d, NULL, form, XFS_USER_QUOTA,
> - mount, flags);
> - id = oid + 1;
> - }
> - } else {
> + }
> +
> + /* No GETNEXTQUOTA support, iterate over all from password file */
> + if (!(flags & GETNEXTQUOTA_FLAG)) {
> setpwent();
> while ((u = getpwent()) != NULL) {
> - if (get_dquot(&d, u->pw_uid, NULL, XFS_USER_QUOTA,
> + if (get_dquot(&d, u->pw_uid, XFS_USER_QUOTA,
> mount->fs_name, flags)) {
> report_mount(fp, &d, u->pw_name, form,
> XFS_USER_QUOTA, mount, flags);
> @@ -524,34 +498,22 @@ report_group_mount(
> {
> struct group *g;
> struct fs_disk_quota d;
> - uint id = 0, oid;
> + uint id = lower;
>
> - if (upper) { /* identifier range specified */
> - for (id = lower; id <= upper; id++) {
> - if (get_dquot(&d, id, NULL, XFS_GROUP_QUOTA,
> - mount->fs_name, flags)) {
> - report_mount(fp, &d, NULL, form,
> - XFS_GROUP_QUOTA, mount, flags);
> - flags |= NO_HEADER_FLAG;
> - }
> - }
> - } else if (get_dquot(&d, id, &oid, XFS_GROUP_QUOTA,
> - mount->fs_name, flags|GETNEXTQUOTA_FLAG)) {
> - report_mount(fp, &d, NULL, form, XFS_GROUP_QUOTA, mount,
> - flags|GETNEXTQUOTA_FLAG);
> - id = oid + 1;
> + while (get_dquot(&d, id, XFS_GROUP_QUOTA, mount->fs_name,
> + flags | GETNEXTQUOTA_FLAG) &&
> + !(upper && (d.d_id > upper))) {
> + report_mount(fp, &d, NULL, form, XFS_GROUP_QUOTA, mount, flags);
> + id = d.d_id + 1;
> flags |= GETNEXTQUOTA_FLAG;
> flags |= NO_HEADER_FLAG;
> - while (get_dquot(&d, id, &oid, XFS_GROUP_QUOTA,
> - mount->fs_name, flags)) {
> - report_mount(fp, &d, NULL, form, XFS_GROUP_QUOTA, mount,
> - flags);
> - id = oid + 1;
> - }
> - } else {
> + }
> +
> + /* No GETNEXTQUOTA support, iterate over all from password file */
> + if (!(flags & GETNEXTQUOTA_FLAG)) {
> setgrent();
> while ((g = getgrent()) != NULL) {
> - if (get_dquot(&d, g->gr_gid, NULL, XFS_GROUP_QUOTA,
> + if (get_dquot(&d, g->gr_gid, XFS_GROUP_QUOTA,
> mount->fs_name, flags)) {
> report_mount(fp, &d, g->gr_name, form,
> XFS_GROUP_QUOTA, mount, flags);
> @@ -575,38 +537,26 @@ report_project_mount(
> {
> fs_project_t *p;
> struct fs_disk_quota d;
> - uint id = 0, oid;
> + uint id = lower;
>
> - if (upper) { /* identifier range specified */
> - for (id = lower; id <= upper; id++) {
> - if (get_dquot(&d, id, NULL, XFS_PROJ_QUOTA,
> - mount->fs_name, flags)) {
> - report_mount(fp, &d, NULL, form, XFS_PROJ_QUOTA,
> - mount, flags);
> - flags |= NO_HEADER_FLAG;
> - }
> - }
> - } else if (get_dquot(&d, id, &oid, XFS_PROJ_QUOTA,
> - mount->fs_name, flags|GETNEXTQUOTA_FLAG)) {
> - report_mount(fp, &d, NULL, form, XFS_PROJ_QUOTA, mount,
> - flags|GETNEXTQUOTA_FLAG);
> - id = oid + 1;
> + while (get_dquot(&d, id, XFS_PROJ_QUOTA, mount->fs_name,
> + flags | GETNEXTQUOTA_FLAG) &&
> + !(upper && (d.d_id > upper))) {
> + report_mount(fp, &d, NULL, form, XFS_PROJ_QUOTA, mount, flags);
> + id = d.d_id + 1;
> flags |= GETNEXTQUOTA_FLAG;
> flags |= NO_HEADER_FLAG;
> - while (get_dquot(&d, id, &oid, XFS_PROJ_QUOTA,
> - mount->fs_name, flags)) {
> - report_mount(fp, &d, NULL, form, XFS_PROJ_QUOTA, mount,
> - flags);
> - id = oid + 1;
> - }
> - } else {
> + }
> +
> + /* No GETNEXTQUOTA support, iterate over all */
> + if (!(flags & GETNEXTQUOTA_FLAG)) {
> if (!getprprid(0)) {
> /*
> * Print default project quota, even if projid 0
> * isn't defined
> */
> - if (get_dquot(&d, 0, NULL, XFS_PROJ_QUOTA,
> - mount->fs_name, flags)) {
> + if (get_dquot(&d, 0, XFS_PROJ_QUOTA, mount->fs_name,
> + flags)) {
> report_mount(fp, &d, NULL, form, XFS_PROJ_QUOTA,
> mount, flags);
> flags |= NO_HEADER_FLAG;
> @@ -615,7 +565,7 @@ report_project_mount(
>
> setprent();
> while ((p = getprent()) != NULL) {
> - if (get_dquot(&d, p->pr_prid, NULL, XFS_PROJ_QUOTA,
> + if (get_dquot(&d, p->pr_prid, XFS_PROJ_QUOTA,
> mount->fs_name, flags)) {
> report_mount(fp, &d, p->pr_name, form,
> XFS_PROJ_QUOTA, mount, flags);
> --
> 2.27.0
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v3 5/5] xfs_quota: apply -L/-U range limits in uid/gid/pid loops
2022-05-02 15:02 [PATCH v3 0/5] xfsprogs: optimize -L/-U range calls for xfs_quota's dump/report Andrey Albershteyn
` (3 preceding siblings ...)
2022-05-02 15:02 ` [PATCH v3 4/5] xfs_quota: utilize XFS_GETNEXTQUOTA for ranged calls in report/dump Andrey Albershteyn
@ 2022-05-02 15:02 ` Andrey Albershteyn
4 siblings, 0 replies; 7+ messages in thread
From: Andrey Albershteyn @ 2022-05-02 15:02 UTC (permalink / raw)
To: linux-xfs; +Cc: Andrey Albershteyn, Christoph Hellwig, Darrick J . Wong
In case kernel doesn't support XFS_GETNEXTQUOTA the report/dump
command will fallback to iterating over all known uid/gid/pid.
However, currently it won't take -L/-U range limits into account
(all entities with non-zero qoutas will be outputted). This applies
those limits for fallback case.
Signed-off-by: Andrey Albershteyn <aalbersh@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
---
quota/report.c | 40 +++++++++++++++++++++++++++-------------
1 file changed, 27 insertions(+), 13 deletions(-)
diff --git a/quota/report.c b/quota/report.c
index 2b9577a5..2acf81b8 100644
--- a/quota/report.c
+++ b/quota/report.c
@@ -157,9 +157,11 @@ dump_limits_any_type(
struct group *g;
setgrent();
while ((g = getgrent()) != NULL) {
- get_dquot(&d, g->gr_gid, type,
- mount->fs_name, 0);
- dump_file(fp, &d, mount->fs_name);
+ if (get_dquot(&d, g->gr_gid, type,
+ mount->fs_name, 0) &&
+ !(lower && (d.d_id < lower)) &&
+ !(upper && (d.d_id > upper)))
+ dump_file(fp, &d, mount->fs_name);
}
endgrent();
break;
@@ -168,9 +170,11 @@ dump_limits_any_type(
struct fs_project *p;
setprent();
while ((p = getprent()) != NULL) {
- get_dquot(&d, p->pr_prid, type,
- mount->fs_name, 0);
- dump_file(fp, &d, mount->fs_name);
+ if (get_dquot(&d, p->pr_prid, type,
+ mount->fs_name, 0) &&
+ !(lower && (d.d_id < lower)) &&
+ !(upper && (d.d_id > upper)))
+ dump_file(fp, &d, mount->fs_name);
}
endprent();
break;
@@ -179,9 +183,11 @@ dump_limits_any_type(
struct passwd *u;
setpwent();
while ((u = getpwent()) != NULL) {
- get_dquot(&d, u->pw_uid, type,
- mount->fs_name, 0);
- dump_file(fp, &d, mount->fs_name);
+ if (get_dquot(&d, u->pw_uid, type,
+ mount->fs_name, 0) &&
+ !(lower && (d.d_id < lower)) &&
+ !(upper && (d.d_id > upper)))
+ dump_file(fp, &d, mount->fs_name);
}
endpwent();
break;
@@ -474,7 +480,9 @@ report_user_mount(
setpwent();
while ((u = getpwent()) != NULL) {
if (get_dquot(&d, u->pw_uid, XFS_USER_QUOTA,
- mount->fs_name, flags)) {
+ mount->fs_name, flags) &&
+ !(lower && (d.d_id < lower)) &&
+ !(upper && (d.d_id > upper))) {
report_mount(fp, &d, u->pw_name, form,
XFS_USER_QUOTA, mount, flags);
flags |= NO_HEADER_FLAG;
@@ -514,7 +522,9 @@ report_group_mount(
setgrent();
while ((g = getgrent()) != NULL) {
if (get_dquot(&d, g->gr_gid, XFS_GROUP_QUOTA,
- mount->fs_name, flags)) {
+ mount->fs_name, flags) &&
+ !(lower && (d.d_id < lower)) &&
+ !(upper && (d.d_id > upper))) {
report_mount(fp, &d, g->gr_name, form,
XFS_GROUP_QUOTA, mount, flags);
flags |= NO_HEADER_FLAG;
@@ -556,7 +566,9 @@ report_project_mount(
* isn't defined
*/
if (get_dquot(&d, 0, XFS_PROJ_QUOTA, mount->fs_name,
- flags)) {
+ flags) &&
+ !(lower && (d.d_id < lower)) &&
+ !(upper && (d.d_id > upper))) {
report_mount(fp, &d, NULL, form, XFS_PROJ_QUOTA,
mount, flags);
flags |= NO_HEADER_FLAG;
@@ -566,7 +578,9 @@ report_project_mount(
setprent();
while ((p = getprent()) != NULL) {
if (get_dquot(&d, p->pr_prid, XFS_PROJ_QUOTA,
- mount->fs_name, flags)) {
+ mount->fs_name, flags) &&
+ !(lower && (d.d_id < lower)) &&
+ !(upper && (d.d_id > upper))) {
report_mount(fp, &d, p->pr_name, form,
XFS_PROJ_QUOTA, mount, flags);
flags |= NO_HEADER_FLAG;
--
2.27.0
^ permalink raw reply related [flat|nested] 7+ messages in thread