[2/4] xfs_repair: fix clearing of quota CHKD flags
diff mbox series

Message ID 159476317959.3156699.12804674592240361133.stgit@magnolia
State Accepted
Headers show
Series
  • xfs_repair: check quota counters
Related show

Commit Message

Darrick J. Wong July 14, 2020, 9:46 p.m. UTC
From: Darrick J. Wong <darrick.wong@oracle.com>

XFS_ALL_QUOTA_CHKD, being a OR of [UGP]QUOTA_CHKD, is a bitset of the
possible *incore* quota checked flags.  This means that it cannot be
used in a comparison with the *ondisk* quota checked flags because V4
filesystems set OQUOTA_CHKD, not the [GU]QUOTA_CHKD flags (which are V5
flags).

If you have a V4 filesystem with user quotas disabled but either group
or project quotas enabled, xfs_repair will /not/ claim that the quota
info will be regenerated on the next mount like it does in any other
situation.  This is because the ondisk qflags field has OQUOTA_CHKD set
but repair fails to notice.

Worse, if you have a V4 filesystem with user and group quotas enabled
and mild corruption, repair will claim that the quota info will be
regenerated.  If you then mount the fs with only group quotas enabled,
quotacheck will not run to correct the data because repair failed to
clear OQUOTA_CHKD properly.

These are fairly benign and unlikely scenarios, but when we add
quotacheck capabilities to xfs_repair, it will complain about the
incorrect quota counts, which causes regressions in xfs/278.

Fixes: 342aef1ec0ec ("xfsprogs: Remove incore use of XFS_OQUOTA_ENFD and XFS_OQUOTA_CHKD")
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
 repair/xfs_repair.c |    7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

Comments

Christoph Hellwig July 15, 2020, 5:47 p.m. UTC | #1
On Tue, Jul 14, 2020 at 02:46:19PM -0700, Darrick J. Wong wrote:
> From: Darrick J. Wong <darrick.wong@oracle.com>
> 
> XFS_ALL_QUOTA_CHKD, being a OR of [UGP]QUOTA_CHKD, is a bitset of the
> possible *incore* quota checked flags.  This means that it cannot be
> used in a comparison with the *ondisk* quota checked flags because V4
> filesystems set OQUOTA_CHKD, not the [GU]QUOTA_CHKD flags (which are V5
> flags).
> 
> If you have a V4 filesystem with user quotas disabled but either group
> or project quotas enabled, xfs_repair will /not/ claim that the quota
> info will be regenerated on the next mount like it does in any other
> situation.  This is because the ondisk qflags field has OQUOTA_CHKD set
> but repair fails to notice.
> 
> Worse, if you have a V4 filesystem with user and group quotas enabled
> and mild corruption, repair will claim that the quota info will be
> regenerated.  If you then mount the fs with only group quotas enabled,
> quotacheck will not run to correct the data because repair failed to
> clear OQUOTA_CHKD properly.
> 
> These are fairly benign and unlikely scenarios, but when we add
> quotacheck capabilities to xfs_repair, it will complain about the
> incorrect quota counts, which causes regressions in xfs/278.

Looks good,

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

Patch
diff mbox series

diff --git a/repair/xfs_repair.c b/repair/xfs_repair.c
index 3bfc8311..1a51abd1 100644
--- a/repair/xfs_repair.c
+++ b/repair/xfs_repair.c
@@ -1100,10 +1100,13 @@  _("Warning:  project quota information would be cleared.\n"
 
 	dsb = sbp->b_addr;
 
-	if (be16_to_cpu(dsb->sb_qflags) & XFS_ALL_QUOTA_CHKD) {
+	if (mp->m_sb.sb_qflags & XFS_ALL_QUOTA_CHKD) {
 		do_warn(_("Note - quota info will be regenerated on next "
 			"quota mount.\n"));
-		dsb->sb_qflags &= cpu_to_be16(~XFS_ALL_QUOTA_CHKD);
+		dsb->sb_qflags &= cpu_to_be16(~(XFS_UQUOTA_CHKD |
+						XFS_GQUOTA_CHKD |
+						XFS_PQUOTA_CHKD |
+						XFS_OQUOTA_CHKD));
 	}
 
 	if (copied_sunit) {