summaryrefslogtreecommitdiffstats
path: root/include/linux/quota.h
diff options
context:
space:
mode:
authorEric Sandeen <sandeen@redhat.com>2016-02-07 19:21:50 -0500
committerDave Chinner <david@fromorbit.com>2016-02-07 19:21:50 -0500
commit8b37524962b9c54423374717786198f5c0820a28 (patch)
tree0a502e7dae81cf9b6c8edb5f2f291604e09ec34a /include/linux/quota.h
parent3218a3ec87f7d0063b48b10cf3d649ce75966223 (diff)
quota: add new quotactl Q_XGETNEXTQUOTA
Q_XGETNEXTQUOTA is exactly like Q_XGETQUOTA, except that it will return quota information for the id equal to or greater than the id requested. In other words, if the requested id has no quota, the command will return quota information for the next higher id which does have a quota set. If no higher id has an active quota, -ESRCH is returned. This allows filesystems to do efficient iteration in kernelspace, much like extN filesystems do in userspace when asked to report all active quotas. The patch adds a d_id field to struct qc_dqblk so that we can pass back the id of the quota which was found, and return it to userspace. Today, filesystems such as XFS require getpwent-style iterations, and for systems which have i.e. LDAP backends, this can be very slow, or even impossible if iteration is not allowed in the configuration. Signed-off-by: Eric Sandeen <sandeen@redhat.com> Reviewed-by: Jan Kara <jack@suse.cz> Signed-off-by: Dave Chinner <david@fromorbit.com>
Diffstat (limited to 'include/linux/quota.h')
-rw-r--r--include/linux/quota.h2
1 files changed, 2 insertions, 0 deletions
diff --git a/include/linux/quota.h b/include/linux/quota.h
index b2505acfd3c0..fba92f5c1a63 100644
--- a/include/linux/quota.h
+++ b/include/linux/quota.h
@@ -425,6 +425,8 @@ struct quotactl_ops {
425 int (*quota_sync)(struct super_block *, int); 425 int (*quota_sync)(struct super_block *, int);
426 int (*set_info)(struct super_block *, int, struct qc_info *); 426 int (*set_info)(struct super_block *, int, struct qc_info *);
427 int (*get_dqblk)(struct super_block *, struct kqid, struct qc_dqblk *); 427 int (*get_dqblk)(struct super_block *, struct kqid, struct qc_dqblk *);
428 int (*get_nextdqblk)(struct super_block *, struct kqid *,
429 struct qc_dqblk *);
428 int (*set_dqblk)(struct super_block *, struct kqid, struct qc_dqblk *); 430 int (*set_dqblk)(struct super_block *, struct kqid, struct qc_dqblk *);
429 int (*get_state)(struct super_block *, struct qc_state *); 431 int (*get_state)(struct super_block *, struct qc_state *);
430 int (*rm_xquota)(struct super_block *, unsigned int); 432 int (*rm_xquota)(struct super_block *, unsigned int);