From: "Darrick J. Wong" <darrick.wong@oracle.com>
To: Eric Sandeen <sandeen@redhat.com>
Cc: linux-xfs <linux-xfs@vger.kernel.org>
Subject: Re: [PATCH 1/1 V2] xfs_quota: allow individual timer extension
Date: Tue, 19 May 2020 14:34:09 -0700 [thread overview]
Message-ID: <20200519213409.GS17627@magnolia> (raw)
In-Reply-To: <20200519163810.GP17627@magnolia>
On Tue, May 19, 2020 at 09:38:10AM -0700, Darrick J. Wong wrote:
> On Mon, May 18, 2020 at 03:09:30PM -0500, Eric Sandeen wrote:
> > The only grace period which can be set via xfs_quota today is for id 0,
> > i.e. the default grace period for all users. However, setting an
> > individual grace period is useful; for example:
> >
> > Alice has a soft quota of 100 inodes, and a hard quota of 200 inodes
> > Alice uses 150 inodes, and enters a short grace period
> > Alice really needs to use those 150 inodes past the grace period
> > The administrator extends Alice's grace period until next Monday
> >
> > vfs quota users such as ext4 can do this today, with setquota -T
> >
> > xfs_quota can now accept an optional user id or name (symmetric with
> > how warn limits are specified), in which case that user's grace period
> > is extended to expire the given amount of time from now().
> >
> > To maintain compatibility with old command lines, if none of
> > [-d|id|name] are specified, default limits are set as before.
> >
> > (kernelspace requires updates to enable all this as well.)
> >
> > Signed-off-by: Eric Sandeen <sandeen@redhat.com>
> > ---
> >
> > V2: Add comments about only extending if past soft limits
> > Fix typo/mistake checking block hard limits instead of soft
> >
> > diff --git a/man/man8/xfs_quota.8 b/man/man8/xfs_quota.8
> > index e6fe7cd1..dd0479cd 100644
> > --- a/man/man8/xfs_quota.8
> > +++ b/man/man8/xfs_quota.8
> > @@ -457,14 +457,46 @@ must be specified.
> > .B \-bir
> > ]
> > .I value
> > +[
> > +.B -d
> > +|
> > +.I id
> > +|
> > +.I name
> > +]
> > .br
> > Allows the quota enforcement timeout (i.e. the amount of time allowed
> > to pass before the soft limits are enforced as the hard limits) to
> > be modified. The current timeout setting can be displayed using the
> > .B state
> > -command. The value argument is a number of seconds, but units of
> > -\&'minutes', 'hours', 'days', and 'weeks' are also understood
> > +command.
> > +.br
> > +When setting the default timer via the
> > +.B \-d
> > +option, or for
> > +.B id
> > +0, or if no argument is given after
> > +.I value
> > +the
> > +.I value
> > +argument is a number of seconds indicating the relative amount of time after
> > +soft limits are exceeded, before hard limits are enforced.
> > +.br
> > +When setting any other individual timer by
> > +.I id
> > +or
> > +.I name,
> > +the
> > +.I value
> > +is the number of seconds from now, at which time the hard limits will be enforced.
> > +This allows extending the grace time of an individual user who has exceeded soft
> > +limits.
> > +.br
> > +For
> > +.I value,
> > +units of \&'minutes', 'hours', 'days', and 'weeks' are also understood
> > (as are their abbreviations 'm', 'h', 'd', and 'w').
> > +.br
> > .HP
> > .B warn
> > [
> > diff --git a/quota/edit.c b/quota/edit.c
> > index 442b608c..5fdb8ce7 100644
> > --- a/quota/edit.c
> > +++ b/quota/edit.c
> > @@ -419,6 +419,7 @@ restore_f(
> >
> > static void
> > set_timer(
> > + uint32_t id,
> > uint type,
> > uint mask,
> > char *dev,
> > @@ -427,14 +428,43 @@ set_timer(
> > fs_disk_quota_t d;
> >
> > memset(&d, 0, sizeof(d));
> > +
> > + /*
> > + * If id is specified we are extending grace time by value
> > + * Otherwise we are setting the default grace time
> > + */
> > + if (id) {
> > + time_t now;
> > +
> > + /* Get quota to find out whether user is past soft limits */
> > + if (xfsquotactl(XFS_GETQUOTA, dev, type, id, (void *)&d) < 0) {
> > + exitcode = 1;
> > + fprintf(stderr, _("%s: cannot get quota: %s\n"),
> > + progname, strerror(errno));
> > + return;
> > + }
> > +
> > + time(&now);
> > +
> > + /* Only set grace time if user is already past soft limit */
> > + if (d.d_blk_softlimit && d.d_bcount > d.d_blk_softlimit)
> > + d.d_btimer = now + value;
> > + if (d.d_ino_softlimit && d.d_icount > d.d_ino_softlimit)
> > + d.d_itimer = now + value;
> > + if (d.d_rtb_softlimit && d.d_rtbcount > d.d_rtb_softlimit)
> > + d.d_rtbtimer = now + value;
>
> Hmm, I /was/ going to complain about 32-bit wraparound, but then
> realized that the whole ioctl interface is totally __s32 and needs
> y2038 updates and meh.
>
> Someone looking for a project could work on either fixing the xfs quota
> ioctls, or the vfs quota ioctls, or both, assuming Arnd didn't already
> fix the VFS...
>
> Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
...hmm, wait, so an old kernel won't /do/ anything, right? It won't
error out, but the grace period for that non-root user won't have been
changed. Perhaps this ought to re-check the grace period values
afterwards to assess efficacy.
--D
> --D
>
> > + } else {
> > + d.d_btimer = value;
> > + d.d_itimer = value;
> > + d.d_rtbtimer = value;
> > + }
> > +
> > d.d_version = FS_DQUOT_VERSION;
> > d.d_flags = type;
> > d.d_fieldmask = mask;
> > - d.d_itimer = value;
> > - d.d_btimer = value;
> > - d.d_rtbtimer = value;
> > + d.d_id = id;
> >
> > - if (xfsquotactl(XFS_SETQLIM, dev, type, 0, (void *)&d) < 0) {
> > + if (xfsquotactl(XFS_SETQLIM, dev, type, id, (void *)&d) < 0) {
> > exitcode = 1;
> > fprintf(stderr, _("%s: cannot set timer: %s\n"),
> > progname, strerror(errno));
> > @@ -447,10 +477,15 @@ timer_f(
> > char **argv)
> > {
> > uint value;
> > - int c, type = 0, mask = 0;
> > + char *name = NULL;
> > + uint32_t id = 0;
> > + int c, flags = 0, type = 0, mask = 0;
> >
> > - while ((c = getopt(argc, argv, "bgipru")) != EOF) {
> > + while ((c = getopt(argc, argv, "bdgipru")) != EOF) {
> > switch (c) {
> > + case 'd':
> > + flags |= DEFAULTS_FLAG;
> > + break;
> > case 'b':
> > mask |= FS_DQ_BTIMER;
> > break;
> > @@ -474,23 +509,45 @@ timer_f(
> > }
> > }
> >
> > - if (argc != optind + 1)
> > + /*
> > + * Older versions of the command did not accept -d|id|name,
> > + * so in that case we assume we're setting default timer,
> > + * and the last arg is the timer value.
> > + *
> > + * Otherwise, if the defaults flag is set, we expect 1 more arg for
> > + * timer value ; if not, 2 more args: 1 for value, one for id/name.
> > + */
> > + if (!(flags & DEFAULTS_FLAG) && (argc == optind + 1)) {
> > + value = cvttime(argv[optind++]);
> > + } else if (flags & DEFAULTS_FLAG) {
> > + if (argc != optind + 1)
> > + return command_usage(&timer_cmd);
> > + value = cvttime(argv[optind++]);
> > + } else if (argc == optind + 2) {
> > + value = cvttime(argv[optind++]);
> > + name = (flags & DEFAULTS_FLAG) ? "0" : argv[optind++];
> > + } else
> > return command_usage(&timer_cmd);
> >
> > - value = cvttime(argv[optind++]);
> >
> > + /* if none of -bir specified, set them all */
> > if (!mask)
> > mask = FS_DQ_TIMER_MASK;
> >
> > if (!type) {
> > type = XFS_USER_QUOTA;
> > } else if (type != XFS_GROUP_QUOTA &&
> > - type != XFS_PROJ_QUOTA &&
> > - type != XFS_USER_QUOTA) {
> > + type != XFS_PROJ_QUOTA &&
> > + type != XFS_USER_QUOTA) {
> > return command_usage(&timer_cmd);
> > }
> >
> > - set_timer(type, mask, fs_path->fs_name, value);
> > + if (name)
> > + id = id_from_string(name, type);
> > +
> > + if (id >= 0)
> > + set_timer(id, type, mask, fs_path->fs_name, value);
> > +
> > return 0;
> > }
> >
> > @@ -616,9 +673,9 @@ edit_init(void)
> >
> > timer_cmd.name = "timer";
> > timer_cmd.cfunc = timer_f;
> > - timer_cmd.argmin = 2;
> > + timer_cmd.argmin = 1;
> > timer_cmd.argmax = -1;
> > - timer_cmd.args = _("[-bir] [-g|-p|-u] value");
> > + timer_cmd.args = _("[-bir] [-g|-p|-u] value [-d|id|name]");
> > timer_cmd.oneline = _("set quota enforcement timeouts");
> > timer_cmd.help = timer_help;
> > timer_cmd.flags = CMD_FLAG_FOREIGN_OK;
> >
next prev parent reply other threads:[~2020-05-19 21:34 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-05-18 18:46 [PATCH 0/SEVERAL] xfs, xfstests, xfsprogs: quota timer updates Eric Sandeen
2020-05-18 18:48 ` [PATCH 0/6] xfs: quota timer enhancements Eric Sandeen
2020-05-18 18:48 ` [PATCH 1/6] xfs: group quota should return EDQUOT when prj quota enabled Eric Sandeen
2020-05-19 16:22 ` Darrick J. Wong
2020-05-18 18:49 ` [PATCH 2/6] xfs: always return -ENOSPC on project quota reservation failure Eric Sandeen
2020-05-19 16:18 ` Darrick J. Wong
2020-05-18 18:49 ` [PATCH 3/6] xfs: fix up some whitespace in quota code Eric Sandeen
2020-05-19 16:25 ` Darrick J. Wong
2020-05-18 18:50 ` [PATCH 4/6] xfs: pass xfs_dquot to xfs_qm_adjust_dqtimers Eric Sandeen
2020-05-19 16:26 ` Darrick J. Wong
2020-05-18 18:51 ` [PATCH 5/6] xfs: per-type quota timers and warn limits Eric Sandeen
2020-05-19 16:27 ` Darrick J. Wong
2020-05-20 18:41 ` [PATCH 4.5/6] xfs: switch xfs_get_defquota to take explicit type Eric Sandeen
2020-05-20 20:36 ` Darrick J. Wong
2020-05-20 20:41 ` Eric Sandeen
2020-05-20 20:49 ` Darrick J. Wong
2020-05-20 18:43 ` [PATCH 5/6 V2] xfs: per-type quota timers and warn limits Eric Sandeen
2020-05-20 20:31 ` Darrick J. Wong
2020-05-20 20:42 ` Eric Sandeen
2020-05-18 18:52 ` [PATCH 6/6] xfs: allow individual quota grace period extension Eric Sandeen
2020-05-19 16:39 ` Darrick J. Wong
2020-05-19 17:21 ` Eric Sandeen
2020-05-18 19:23 ` [PATCH 0/1] xfs_quota: allow individual timer extension Eric Sandeen
2020-05-18 19:24 ` [PATCH 1/1] " Eric Sandeen
2020-05-18 20:04 ` Eric Sandeen
2020-05-18 20:09 ` [PATCH 1/1 V2] " Eric Sandeen
2020-05-19 16:38 ` Darrick J. Wong
2020-05-19 21:34 ` Darrick J. Wong [this message]
2020-05-18 19:59 ` [PATCH 0/4] fstests: more quota related tests Eric Sandeen
2020-05-18 19:59 ` [PATCH 1/4] xfs: make sure our default quota warning limits and grace periods survive quotacheck Eric Sandeen
2020-05-31 16:17 ` Eryu Guan
2020-05-18 20:00 ` [PATCH 2/4] generic: test per-type quota softlimit enforcement timeout Eric Sandeen
2020-05-31 16:15 ` Eryu Guan
2020-06-01 12:48 ` Zorro Lang
2020-06-01 14:36 ` Eric Sandeen
2020-06-01 16:39 ` Darrick J. Wong
2020-06-11 5:12 ` Zorro Lang
2020-06-11 15:40 ` Darrick J. Wong
2020-05-18 20:00 ` [PATCH 3/4] fstests: individual user grace period extension via setquota Eric Sandeen
2020-05-18 20:01 ` [PATCH 4/4] fstests: individual user grace period extension via xfs_quota Eric Sandeen
2020-05-20 15:39 ` [PATCH 0/4] fstests: more quota related tests Darrick J. Wong
2020-05-20 15:46 ` 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=20200519213409.GS17627@magnolia \
--to=darrick.wong@oracle.com \
--cc=linux-xfs@vger.kernel.org \
--cc=sandeen@redhat.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).