Linux XFS filesystem development
 help / color / mirror / Atom feed
From: Eric Sandeen <sandeen@redhat.com>
To: linux-xfs <linux-xfs@vger.kernel.org>
Cc: Jan Kara <jack@suse.cz>
Subject: [PATCH RFC] xfs: allow adjusting individual quota grace times
Date: Sat, 9 May 2020 14:47:02 -0500	[thread overview]
Message-ID: <ca1d2bb6-6f37-255c-1015-a20c6060d81c@redhat.com> (raw)

vfs/ext3/4 quota allows the administrator to push out the grace time
for soft quota with the setquota -T command:

setquota -T [ -u | -g ] [ -F quotaformat ] name block-grace inode-grace -a | filesystem...

       -T, --edit-times
              Alter times for individual user/group when softlimit is enforced.
              Times block-grace and inode-grace are specified in seconds or can
              be string 'unset'.

Essentially, if you do "setquota -T -u username 1d 1d" and "username" is
over their soft quotas and into their grace time, it will extend the
grace time expiry to 1d from now.

xfs can't do this, today.  The patch below is a first cut at allowing us
to do this, and userspace updates are needed as well (I have those in a
patch stack.)

I'm not looking so much for patch review right now, though, what I'm
wondering is if this is a change we can make from the ABI perspective?

Because today, if you try to pass in a UID other than 0 (i.e. the
default grace period) it just gets ignored by the kernel, not rejected.

So there's no real way to know that the grace period adjustment failed
on an older kernel.  We could consider that a bug and fix it, or
consider it a change in behavior that we can't just make without
at least some form of versioning.  Thoughts?

Anyway, the patch below moves the disk quota grace period adjustment out
from "if id == 0" and allows the change for any ID; it only sets the
default grace value in the "id == 0" case.

Signed-off-by: Eric Sandeen <sandeen@redhat.com>
---

diff --git a/fs/xfs/xfs_qm_syscalls.c b/fs/xfs/xfs_qm_syscalls.c
index f48561b7e947..e58ee98f938c 100644
--- a/fs/xfs/xfs_qm_syscalls.c
+++ b/fs/xfs/xfs_qm_syscalls.c
@@ -555,32 +555,41 @@ xfs_qm_scall_setqlim(
 		ddq->d_rtbwarns = cpu_to_be16(newlim->d_rt_spc_warns);
 
 	if (id == 0) {
-		/*
-		 * Timelimits for the super user set the relative time
-		 * the other users can be over quota for this file system.
-		 * If it is zero a default is used.  Ditto for the default
-		 * soft and hard limit values (already done, above), and
-		 * for warnings.
-		 */
-		if (newlim->d_fieldmask & QC_SPC_TIMER) {
-			defq->btimelimit = newlim->d_spc_timer;
-			ddq->d_btimer = cpu_to_be32(newlim->d_spc_timer);
-		}
-		if (newlim->d_fieldmask & QC_INO_TIMER) {
-			defq->itimelimit = newlim->d_ino_timer;
-			ddq->d_itimer = cpu_to_be32(newlim->d_ino_timer);
-		}
-		if (newlim->d_fieldmask & QC_RT_SPC_TIMER) {
-			defq->rtbtimelimit = newlim->d_rt_spc_timer;
-			ddq->d_rtbtimer = cpu_to_be32(newlim->d_rt_spc_timer);
-		}
 		if (newlim->d_fieldmask & QC_SPC_WARNS)
 			defq->bwarnlimit = newlim->d_spc_warns;
 		if (newlim->d_fieldmask & QC_INO_WARNS)
 			defq->iwarnlimit = newlim->d_ino_warns;
 		if (newlim->d_fieldmask & QC_RT_SPC_WARNS)
 			defq->rtbwarnlimit = newlim->d_rt_spc_warns;
-	} else {
+	}
+
+	/*
+	 * Timelimits for the super user set the relative time the other users
+	 * can be over quota for this file system. If it is zero a default is
+	 * used.  Ditto for the default soft and hard limit values (already
+	 * done, above), and for warnings.
+	 *
+	 * For other IDs, userspace can bump out the grace period if over
+	 * the soft limit.
+	 */
+	if (newlim->d_fieldmask & QC_SPC_TIMER) {
+		if (!id)
+			defq->btimelimit = newlim->d_spc_timer;
+		ddq->d_btimer = cpu_to_be32(newlim->d_spc_timer);
+	}
+	if (newlim->d_fieldmask & QC_INO_TIMER) {
+		printk("setting inode timer to %d\n", newlim->d_ino_timer);
+		if (!id)
+			defq->itimelimit = newlim->d_ino_timer;
+		ddq->d_itimer = cpu_to_be32(newlim->d_ino_timer);
+	}
+	if (newlim->d_fieldmask & QC_RT_SPC_TIMER) {
+		if (!id)
+			defq->rtbtimelimit = newlim->d_rt_spc_timer;
+		ddq->d_rtbtimer = cpu_to_be32(newlim->d_rt_spc_timer);
+	}
+
+	if (id != 0) {
 		/*
 		 * If the user is now over quota, start the timelimit.
 		 * The user will not be 'warned'.



             reply	other threads:[~2020-05-09 19:47 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-05-09 19:47 Eric Sandeen [this message]
2020-05-09 19:51 ` [PATCH RFC] xfs: allow adjusting individual quota grace times Eric Sandeen
2020-05-11 15:35 ` Christoph Hellwig
2020-05-12 23:27   ` Darrick J. Wong
2020-05-12 23:29 ` Darrick J. Wong
2020-05-12 23:34   ` 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=ca1d2bb6-6f37-255c-1015-a20c6060d81c@redhat.com \
    --to=sandeen@redhat.com \
    --cc=jack@suse.cz \
    --cc=linux-xfs@vger.kernel.org \
    /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