summaryrefslogtreecommitdiff
path: root/quotaio_meta.c
diff options
context:
space:
mode:
authorJan Kara <jack@suse.cz>2016-01-26 13:10:59 +0100
committerJan Kara <jack@suse.cz>2016-01-27 12:16:20 +0100
commit85687833434d50e3f5fd4b849e543eb505bf5a20 (patch)
tree6e38f4cdfaa916d8b24bbfae2dd314cfaaaa1d15 /quotaio_meta.c
parent1d9542df5d2ae5c21a1e96d100f899b3d7b2f27c (diff)
downloadlinuxquota-85687833434d50e3f5fd4b849e543eb505bf5a20.tar.gz
Scan dquots using Q_GETNEXTQUOTA
Check for new kernel quotactl Q_GETNEXTQUOTA and if available use it for scanning all dquot structures. Signed-off-by: Jan Kara <jack@suse.cz>
Diffstat (limited to 'quotaio_meta.c')
-rw-r--r--quotaio_meta.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/quotaio_meta.c b/quotaio_meta.c
index e52b4f4..ad6ff7a 100644
--- a/quotaio_meta.c
+++ b/quotaio_meta.c
@@ -8,6 +8,7 @@
#include <string.h>
#include <stdlib.h>
+#include <errno.h>
#include <sys/types.h>
@@ -55,7 +56,18 @@ static int meta_commit_dquot(struct dquot *dquot, int flags)
static int meta_scan_dquots(struct quota_handle *h, int (*process_dquot)(struct dquot *dquot, char *dqname))
{
- return generic_scan_dquots(h, process_dquot, vfs_get_dquot);
+ struct if_nextdqblk kdqblk;
+ int ret;
+
+ ret = quotactl(QCMD(Q_GETNEXTQUOTA, h->qh_type), h->qh_quotadev, 0,
+ (void *)&kdqblk);
+ /*
+ * Fall back to scanning using passwd if Q_GETNEXTQUOTA is not
+ * supported
+ */
+ if (ret < 0 && (errno == ENOSYS || errno == EINVAL))
+ return generic_scan_dquots(h, process_dquot, vfs_get_dquot);
+ return vfs_scan_dquots(h, process_dquot);
}
struct quotafile_ops quotafile_ops_meta = {