diff mbox series

[v2] xfs: preserve default grace interval during quotacheck

Message ID 20200324210146.GR29339@magnolia (mailing list archive)
State Accepted
Headers show
Series [v2] xfs: preserve default grace interval during quotacheck | expand

Commit Message

Darrick J. Wong March 24, 2020, 9:01 p.m. UTC
From: Darrick J. Wong <darrick.wong@oracle.com>

When quotacheck runs, it zeroes all the timer fields in every dquot.
Unfortunately, it also does this to the root dquot, which erases any
preconfigured grace intervals and warning limits that the administrator
may have set.  Worse yet, the incore copies of those variables remain
set.  This cache coherence problem manifests itself as the grace
interval mysteriously being reset back to the defaults at the /next/
mount.

Fix it by not resetting the root disk dquot's timer and warning fields.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
v2: just use a branch
---
 fs/xfs/xfs_qm.c |   20 ++++++++++++++------
 1 file changed, 14 insertions(+), 6 deletions(-)

Comments

Dave Chinner March 24, 2020, 11:19 p.m. UTC | #1
On Tue, Mar 24, 2020 at 02:01:46PM -0700, Darrick J. Wong wrote:
> From: Darrick J. Wong <darrick.wong@oracle.com>
> 
> When quotacheck runs, it zeroes all the timer fields in every dquot.
> Unfortunately, it also does this to the root dquot, which erases any
> preconfigured grace intervals and warning limits that the administrator
> may have set.  Worse yet, the incore copies of those variables remain
> set.  This cache coherence problem manifests itself as the grace
> interval mysteriously being reset back to the defaults at the /next/
> mount.
> 
> Fix it by not resetting the root disk dquot's timer and warning fields.
> 
> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>

Looks fine.

Reviewed-by: Dave Chinner <dchinner@redhat.com>
Christoph Hellwig March 25, 2020, 7:13 a.m. UTC | #2
On Tue, Mar 24, 2020 at 02:01:46PM -0700, Darrick J. Wong wrote:
> From: Darrick J. Wong <darrick.wong@oracle.com>
> 
> When quotacheck runs, it zeroes all the timer fields in every dquot.
> Unfortunately, it also does this to the root dquot, which erases any
> preconfigured grace intervals and warning limits that the administrator
> may have set.  Worse yet, the incore copies of those variables remain
> set.  This cache coherence problem manifests itself as the grace
> interval mysteriously being reset back to the defaults at the /next/
> mount.
> 
> Fix it by not resetting the root disk dquot's timer and warning fields.
> 
> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>

Looks good, although a comment in the code about the special nature
of qid 0 might be useful.  Otherwise:

Reviewed-by: Christoph Hellwig <hch@lst.de>
diff mbox series

Patch

diff --git a/fs/xfs/xfs_qm.c b/fs/xfs/xfs_qm.c
index 0ce334c51d73..ee175617630e 100644
--- a/fs/xfs/xfs_qm.c
+++ b/fs/xfs/xfs_qm.c
@@ -889,12 +889,20 @@  xfs_qm_reset_dqcounts(
 		ddq->d_bcount = 0;
 		ddq->d_icount = 0;
 		ddq->d_rtbcount = 0;
-		ddq->d_btimer = 0;
-		ddq->d_itimer = 0;
-		ddq->d_rtbtimer = 0;
-		ddq->d_bwarns = 0;
-		ddq->d_iwarns = 0;
-		ddq->d_rtbwarns = 0;
+
+		/*
+		 * dquot id 0 stores the default grace period and the maximum
+		 * warning limit that were set by the administrator, so we
+		 * should not reset them.
+		 */
+		if (ddq->d_id != 0) {
+			ddq->d_btimer = 0;
+			ddq->d_itimer = 0;
+			ddq->d_rtbtimer = 0;
+			ddq->d_bwarns = 0;
+			ddq->d_iwarns = 0;
+			ddq->d_rtbwarns = 0;
+		}
 
 		if (xfs_sb_version_hascrc(&mp->m_sb)) {
 			xfs_update_cksum((char *)&dqb[j],