]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
xfs: disable sb_frextents for zoned file systems
authorChristoph Hellwig <hch@lst.de>
Thu, 13 Feb 2025 04:47:15 +0000 (05:47 +0100)
committerChristoph Hellwig <hch@lst.de>
Mon, 3 Mar 2025 15:16:45 +0000 (08:16 -0700)
Zoned file systems not only don't use the global frextents counter, but
for them the in-memory percpu counter also includes reservations taken
before even allocating delalloc extent records, so it will never match
the per-zone used information.  Disable all updates and verification of
the sb counter for zoned file systems as it isn't useful for them.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
fs/xfs/libxfs/xfs_sb.c
fs/xfs/scrub/fscounters.c
fs/xfs/scrub/fscounters_repair.c
fs/xfs/xfs_mount.c
fs/xfs/xfs_super.c

index 3b886886ea693ef826233974eac9d767f4157b8a..65256e109e64eee51fab1e30f78b497b29b4d32c 100644 (file)
@@ -1333,7 +1333,7 @@ xfs_log_sb(
         * we handle nearly-lockless reservations, so we must use the _positive
         * variant here to avoid writing out nonsense frextents.
         */
-       if (xfs_has_rtgroups(mp)) {
+       if (xfs_has_rtgroups(mp) && !xfs_has_zoned(mp)) {
                mp->m_sb.sb_frextents =
                                xfs_sum_freecounter(mp, XC_FREE_RTEXTENTS);
        }
index 9dd893ece1883b1736bee68bd9130b19728bbee3..e629663e460aec89de401a9558210d0e490cd6d1 100644 (file)
@@ -413,7 +413,13 @@ xchk_fscount_count_frextents(
 
        fsc->frextents = 0;
        fsc->frextents_delayed = 0;
-       if (!xfs_has_realtime(mp))
+
+       /*
+        * Don't bother verifying and repairing the fs counters for zoned file
+        * systems as they don't track an on-disk frextents count, and the
+        * in-memory percpu counter also includes reservations.
+        */
+       if (!xfs_has_realtime(mp) || xfs_has_zoned(mp))
                return 0;
 
        while ((rtg = xfs_rtgroup_next(mp, rtg))) {
@@ -597,7 +603,8 @@ xchk_fscounters(
                        try_again = true;
        }
 
-       if (!xchk_fscount_within_range(sc, frextents,
+       if (!xfs_has_zoned(mp) &&
+           !xchk_fscount_within_range(sc, frextents,
                        &mp->m_free[XC_FREE_RTEXTENTS].count,
                        fsc->frextents - fsc->frextents_delayed)) {
                if (fsc->frozen)
index 8fb0db78489eeffb06b037edffd782959f4f60d2..f0d2b04644e4524aa4829d283df7f2f8dcfc244e 100644 (file)
@@ -74,10 +74,12 @@ xrep_fscounters(
         * track of the delalloc reservations separately, as they are are
         * subtracted from m_frextents, but not included in sb_frextents.
         */
-       xfs_set_freecounter(mp, XC_FREE_RTEXTENTS,
-               fsc->frextents - fsc->frextents_delayed);
-       if (!xfs_has_rtgroups(mp))
-               mp->m_sb.sb_frextents = fsc->frextents;
+       if (!xfs_has_zoned(mp)) {
+               xfs_set_freecounter(mp, XC_FREE_RTEXTENTS,
+                               fsc->frextents - fsc->frextents_delayed);
+               if (!xfs_has_rtgroups(mp))
+                       mp->m_sb.sb_frextents = fsc->frextents;
+       }
 
        return 0;
 }
index a77a2de1127883b39f8e673e6ab70f5b9c027a35..4a8350c3f771654e21549211406de601414a4ebe 100644 (file)
@@ -553,7 +553,7 @@ xfs_check_summary_counts(
         * If we're mounting the rt volume after recovering the log, recompute
         * frextents from the rtbitmap file to fix the inconsistency.
         */
-       if (xfs_has_realtime(mp) && !xfs_is_clean(mp)) {
+       if (xfs_has_realtime(mp) && !xfs_has_zoned(mp) && !xfs_is_clean(mp)) {
                error = xfs_rtalloc_reinit_frextents(mp);
                if (error)
                        return error;
index 86d61f3d83cd48267e00e006c6af334dc960f724..a840e1c68ff2bab9ff28bafa1501ab1f8ad8dac6 100644 (file)
@@ -1131,7 +1131,9 @@ xfs_reinit_percpu_counters(
        percpu_counter_set(&mp->m_icount, mp->m_sb.sb_icount);
        percpu_counter_set(&mp->m_ifree, mp->m_sb.sb_ifree);
        xfs_set_freecounter(mp, XC_FREE_BLOCKS, mp->m_sb.sb_fdblocks);
-       xfs_set_freecounter(mp, XC_FREE_RTEXTENTS, mp->m_sb.sb_frextents);
+       if (!xfs_has_zoned(mp))
+               xfs_set_freecounter(mp, XC_FREE_RTEXTENTS,
+                               mp->m_sb.sb_frextents);
 }
 
 static void