Message ID | 20200324210146.GR29339@magnolia (mailing list archive) |
---|---|
State | Accepted |
Headers | show |
Series | [v2] xfs: preserve default grace interval during quotacheck | expand |
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>
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 --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],