]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs_repair: try not to trash qflags on metadir filesystems
authorDarrick J. Wong <djwong@kernel.org>
Thu, 21 Nov 2024 00:24:43 +0000 (16:24 -0800)
committerDarrick J. Wong <djwong@kernel.org>
Tue, 24 Dec 2024 02:01:36 +0000 (18:01 -0800)
Try to preserve the accounting and enforcement quota flags when
repairing filesystems.

Signed-off-by: "Darrick J. Wong" <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
repair/agheader.c
repair/phase4.c
repair/sb.c

index e6fca07c6cb4c997fc7ba5ca645d29136c618c13..89a23a869a02e443b64a864a82d63cd29add104d 100644 (file)
@@ -642,7 +642,8 @@ verify_set_agheader(xfs_mount_t *mp, struct xfs_buf *sbuf, xfs_sb_t *sb,
                        sb->sb_fdblocks = 0;
                        sb->sb_frextents = 0;
 
-                       sb->sb_qflags = 0;
+                       if (!xfs_has_metadir(mp))
+                               sb->sb_qflags = 0;
                }
 
                rval |= XR_AG_SB;
index a4183c557a1891ac34b671174743b19033e424e8..728d9ed84cdc7ada3fb47bcf0ac5a5a2a5579ba7 100644 (file)
@@ -71,6 +71,26 @@ quotino_check(
 static void
 quota_sb_check(xfs_mount_t *mp)
 {
+       if (xfs_has_metadir(mp)) {
+               /*
+                * Metadir filesystems try to preserve the quota accounting
+                * and enforcement flags so that users don't have to remember
+                * to supply quota mount options.  Phase 1 discovered the
+                * QUOTABIT flag (fs_quotas) and phase 2 discovered the quota
+                * inodes from the metadir for us.
+                *
+                * If QUOTABIT wasn't set but we found quota inodes, signal
+                * phase 5 to add the feature bit for us.  We do not ever
+                * downgrade the filesystem.
+                */
+               if (!fs_quotas &&
+                   (has_quota_inode(XFS_DQTYPE_USER) ||
+                    has_quota_inode(XFS_DQTYPE_GROUP) ||
+                    has_quota_inode(XFS_DQTYPE_PROJ)))
+                       fs_quotas = 1;
+               return;
+       }
+
        /*
         * if the sb says we have quotas and we lost both,
         * signal a superblock downgrade.  that will cause
index d52ab2ffeaf28cec552aed5439275c3134c515b6..0e4827e046780ba696cb72d4bc6c8d7e5e90ffe5 100644 (file)
@@ -233,6 +233,9 @@ find_secondary_sb(xfs_sb_t *rsb)
         if (!retval)
                 retval = __find_secondary_sb(rsb, XFS_AG_MIN_BYTES, BSIZE);
 
+       if (retval && xfs_sb_version_hasmetadir(rsb))
+               do_warn(_("quota accounting and enforcement flags lost\n"));
+
        return retval;
 }