From 7367f5d511ec4555fbb7a87c1c1853fd4fd01712 Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Tue, 26 Jan 2016 14:06:59 +0100 Subject: [PATCH 2/2] Add support for scanning using Q_XGETNEXTQUOTA MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add support for scanning of all available quota structures using Q_XGETNEXTQUOTA quotactl. Signed-off-by: Jan Kara Signed-off-by: Petr Písař --- quotaio_xfs.c | 42 +++++++++++++++++++++++++++++++++++++++--- quotaio_xfs.h | 1 + 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: -- 2.5.0