From: Jan Kara <jack@suse.cz>
To: Eric Sandeen <sandeen@redhat.com>
Cc: linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, jack@suse.cz
Subject: Re: [PATCH 2/7] quota: add new quotactl Q_XGETNEXTQUOTA
Date: Tue, 26 Jan 2016 13:57:10 +0100 [thread overview]
Message-ID: <20160126125710.GA23820@quack.suse.cz> (raw)
In-Reply-To: <1453487136-12681-3-git-send-email-sandeen@redhat.com>
On Fri 22-01-16 12:25:31, Eric Sandeen wrote:
> 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.
Actually, is -ESRCH the right return value? It seems XFS traditionally
returns -ENOENT when id doesn't exist. So that would look more logical to
me.
Honza
> 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>
> ---
> fs/quota/quota.c | 31 +++++++++++++++++++++++++++++++
> include/linux/quota.h | 2 ++
> include/uapi/linux/dqblk_xfs.h | 1 +
> 3 files changed, 34 insertions(+), 0 deletions(-)
>
> diff --git a/fs/quota/quota.c b/fs/quota/quota.c
> index ea66670..0a6dd71 100644
> --- a/fs/quota/quota.c
> +++ b/fs/quota/quota.c
> @@ -625,6 +625,34 @@ static int quota_getxquota(struct super_block *sb, int type, qid_t id,
> return ret;
> }
>
> +/*
> + * Return quota for next active quota >= this id, if any exists,
> + * otherwise return -ESRCH via ->get_nextdqblk.
> + */
> +static int quota_getnextxquota(struct super_block *sb, int type, qid_t id,
> + void __user *addr)
> +{
> + struct fs_disk_quota fdq;
> + struct qc_dqblk qdq;
> + struct kqid qid;
> + qid_t id_out;
> + int ret;
> +
> + if (!sb->s_qcop->get_nextdqblk)
> + return -ENOSYS;
> + qid = make_kqid(current_user_ns(), type, id);
> + if (!qid_valid(qid))
> + return -EINVAL;
> + ret = sb->s_qcop->get_nextdqblk(sb, &qid, &qdq);
> + if (ret)
> + return ret;
> + id_out = from_kqid(current_user_ns(), qid);
> + copy_to_xfs_dqblk(&fdq, &qdq, type, id_out);
> + if (copy_to_user(addr, &fdq, sizeof(fdq)))
> + return -EFAULT;
> + return ret;
> +}
> +
> static int quota_rmxquota(struct super_block *sb, void __user *addr)
> {
> __u32 flags;
> @@ -690,6 +718,8 @@ static int do_quotactl(struct super_block *sb, int type, int cmd, qid_t id,
> return quota_setxquota(sb, type, id, addr);
> case Q_XGETQUOTA:
> return quota_getxquota(sb, type, id, addr);
> + case Q_XGETNEXTQUOTA:
> + return quota_getnextxquota(sb, type, id, addr);
> case Q_XQUOTASYNC:
> if (sb->s_flags & MS_RDONLY)
> return -EROFS;
> @@ -712,6 +742,7 @@ static int quotactl_cmd_write(int cmd)
> case Q_XGETQSTAT:
> case Q_XGETQSTATV:
> case Q_XGETQUOTA:
> + case Q_XGETNEXTQUOTA:
> case Q_XQUOTASYNC:
> return 0;
> }
> diff --git a/include/linux/quota.h b/include/linux/quota.h
> index b2505ac..fba92f5 100644
> --- a/include/linux/quota.h
> +++ b/include/linux/quota.h
> @@ -425,6 +425,8 @@ struct quotactl_ops {
> int (*quota_sync)(struct super_block *, int);
> int (*set_info)(struct super_block *, int, struct qc_info *);
> int (*get_dqblk)(struct super_block *, struct kqid, struct qc_dqblk *);
> + int (*get_nextdqblk)(struct super_block *, struct kqid *,
> + struct qc_dqblk *);
> int (*set_dqblk)(struct super_block *, struct kqid, struct qc_dqblk *);
> int (*get_state)(struct super_block *, struct qc_state *);
> int (*rm_xquota)(struct super_block *, unsigned int);
> diff --git a/include/uapi/linux/dqblk_xfs.h b/include/uapi/linux/dqblk_xfs.h
> index dcd75cc..11b3b31 100644
> --- a/include/uapi/linux/dqblk_xfs.h
> +++ b/include/uapi/linux/dqblk_xfs.h
> @@ -39,6 +39,7 @@
> #define Q_XQUOTARM XQM_CMD(6) /* free disk space used by dquots */
> #define Q_XQUOTASYNC XQM_CMD(7) /* delalloc flush, updates dquots */
> #define Q_XGETQSTATV XQM_CMD(8) /* newer version of get quota */
> +#define Q_XGETNEXTQUOTA XQM_CMD(9) /* get disk limits and usage >= ID */
>
> /*
> * fs_disk_quota structure:
> --
> 1.7.1
>
--
Jan Kara <jack@suse.com>
SUSE Labs, CR
next prev parent reply other threads:[~2016-01-26 12:57 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-01-22 18:25 [PATCH 0/7 V3] quota: add new quotactl Q_GETNEXTQUOTA Eric Sandeen
2016-01-22 18:25 ` [PATCH 1/7] quota: remove unused cmd argument from quota_quotaon() Eric Sandeen
2016-01-25 14:47 ` Jan Kara
2016-01-25 14:49 ` Jan Kara
2016-01-22 18:25 ` [PATCH 2/7] quota: add new quotactl Q_XGETNEXTQUOTA Eric Sandeen
2016-01-25 14:51 ` Jan Kara
2016-01-26 12:57 ` Jan Kara [this message]
2016-01-26 15:00 ` Eric Sandeen
2016-01-26 17:52 ` Jan Kara
2016-01-26 17:57 ` Eric Sandeen
2016-01-26 18:39 ` Eric Sandeen
2016-01-26 20:40 ` Jan Kara
2016-01-22 18:25 ` [PATCH 3/7] quota: add new quotactl Q_GETNEXTQUOTA Eric Sandeen
2016-01-25 14:51 ` Jan Kara
2016-01-22 18:25 ` [PATCH 4/7] xfs: don't overflow quota ID when initializing dqblk Eric Sandeen
2016-01-22 18:25 ` [PATCH 5/7] xfs: get quota inode from mp & flags rather than dqp Eric Sandeen
2016-01-22 18:25 ` [PATCH 6/7] xfs: Factor xfs_seek_hole_data into helper Eric Sandeen
2016-01-22 18:25 ` [PATCH 7/7] xfs: wire up Q_XGETNEXTQUOTA / get_nextdqblk Eric Sandeen
2016-01-26 18:40 ` [PATCH 7/7 V4] " Eric Sandeen
2016-01-25 15:07 ` [PATCH 0/7 V3] quota: add new quotactl Q_GETNEXTQUOTA Jan Kara
2016-01-25 16:04 ` Eric Sandeen
2016-01-26 13:10 ` Jan Kara
-- strict thread matches above, loose matches on Subject: below --
2016-01-22 4:07 [PATCH 0/7 V2] " Eric Sandeen
2016-01-22 4:07 ` [PATCH 2/7] quota: add new quotactl Q_XGETNEXTQUOTA Eric Sandeen
2016-01-22 8:55 ` Jan Kara
2016-01-22 13:57 ` Eric Sandeen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20160126125710.GA23820@quack.suse.cz \
--to=jack@suse.cz \
--cc=linux-fsdevel@vger.kernel.org \
--cc=sandeen@redhat.com \
--cc=xfs@oss.sgi.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).