Message ID | 159476317959.3156699.12804674592240361133.stgit@magnolia (mailing list archive) |
---|---|
State | Accepted |
Headers | show |
Series | xfs_repair: check quota counters | expand |
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>
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) {