summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Kara <jack@suse.cz>2016-01-26 14:06:59 +0100
committerJan Kara <jack@suse.cz>2016-01-27 12:16:25 +0100
commit7367f5d511ec4555fbb7a87c1c1853fd4fd01712 (patch)
treea95f6331716622299563e7c301faa87f681f0bc5
parent85687833434d50e3f5fd4b849e543eb505bf5a20 (diff)
Add support for scanning using Q_XGETNEXTQUOTA
Add support for scanning of all available quota structures using Q_XGETNEXTQUOTA quotactl. Signed-off-by: Jan Kara <jack@suse.cz>
-rw-r--r--quotaio_xfs.c42
-rw-r--r--quotaio_xfs.h1
2 files changed, 40 insertions, 3 deletions
diff --git a/quotaio_xfs.c b/quotaio_xfs.c
index 903c03e..9d90a3e 100644
--- a/quotaio_xfs.c
+++ b/quotaio_xfs.c
@@ -191,15 +191,51 @@ static int xfs_get_dquot(struct dquot *dq)
return 0;
}
+static int xfs_kernel_scan_dquots(struct quota_handle *h,
+ int (*process_dquot)(struct dquot *dquot, char *dqname))
+{
+ struct dquot *dquot = get_empty_dquot();
+ qid_t id = 0;
+ struct xfs_kern_dqblk xdqblk;
+ int ret;
+
+ dquot->dq_h = h;
+ while (1) {
+ ret = quotactl(QCMD(Q_XGETNEXTQUOTA, h->qh_type),
+ h->qh_quotadev, id, (void *)&xdqblk);
+ if (ret < 0)
+ break;
+
+ xfs_kern2utildqblk(&dquot->dq_dqb, &xdqblk);
+ dquot->dq_id = xdqblk.d_id;
+ ret = process_dquot(dquot, NULL);
+ if (ret < 0)
+ break;
+ id = xdqblk.d_id + 1;
+ }
+ free(dquot);
+
+ if (errno == ENOENT)
+ return 0;
+ return ret;
+}
+
/*
* Scan all known dquots and call callback on each
*/
static int xfs_scan_dquots(struct quota_handle *h, int (*process_dquot) (struct dquot *dquot, char *dqname))
{
- if (!XFS_USRQUOTA(h) && !XFS_GRPQUOTA(h))
- return 0;
+ int ret;
+ struct xfs_kern_dqblk xdqblk;
- return generic_scan_dquots(h, process_dquot, xfs_get_dquot);
+ ret = quotactl(QCMD(Q_XGETNEXTQUOTA, h->qh_type), h->qh_quotadev, 0,
+ (void *)&xdqblk);
+ if (ret < 0 && (errno == ENOSYS || errno == EINVAL)) {
+ if (!XFS_USRQUOTA(h) && !XFS_GRPQUOTA(h))
+ return 0;
+ return generic_scan_dquots(h, process_dquot, xfs_get_dquot);
+ }
+ return xfs_kernel_scan_dquots(h, process_dquot);
}
/*
diff --git a/quotaio_xfs.h b/quotaio_xfs.h
index 54725b0..2236da4 100644
--- a/quotaio_xfs.h
+++ b/quotaio_xfs.h
@@ -46,6 +46,7 @@
#define Q_XSETQLIM XQM_CMD(0x4) /* set disk limits only */
#define Q_XGETQSTAT XQM_CMD(0x5) /* returns fs_quota_stat_t struct */
#define Q_XQUOTARM XQM_CMD(0x6) /* free quota files' space */
+#define Q_XGETNEXTQUOTA XQM_CMD(0x9) /* get disk limits and usage >= ID */
/*
* fs_disk_quota structure: