diff options
author | Jan Kara <jack@suse.cz> | 2016-01-26 13:10:59 +0100 |
---|---|---|
committer | Jan Kara <jack@suse.cz> | 2016-01-27 12:16:20 +0100 |
commit | 85687833434d50e3f5fd4b849e543eb505bf5a20 (patch) | |
tree | 6e38f4cdfaa916d8b24bbfae2dd314cfaaaa1d15 /quotaio_meta.c | |
parent | 1d9542df5d2ae5c21a1e96d100f899b3d7b2f27c (diff) | |
download | linuxquota-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.c | 14 |
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 = { |