diff mbox series

[19/43] xfs: disable sb_frextents for zoned file systems

Message ID 20241211085636.1380516-20-hch@lst.de (mailing list archive)
State New
Headers show
Series [01/43] xfs: constify feature checks | expand

Commit Message

Christoph Hellwig Dec. 11, 2024, 8:54 a.m. UTC
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>
---
 fs/xfs/libxfs/xfs_sb.c           |  2 +-
 fs/xfs/scrub/fscounters.c        | 11 +++++++++--
 fs/xfs/scrub/fscounters_repair.c | 10 ++++++----
 fs/xfs/xfs_mount.c               |  2 +-
 fs/xfs/xfs_super.c               |  4 +++-
 5 files changed, 20 insertions(+), 9 deletions(-)

Comments

Darrick J. Wong Dec. 12, 2024, 10:26 p.m. UTC | #1
On Wed, Dec 11, 2024 at 09:54:44AM +0100, Christoph Hellwig wrote:
> 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.

How is XC_FREE_RTEXTENTS initialized at mount time, then?

/me peeks ahead.

Oh, it and XC_FREE_RTAVAILABLE are set in xfs_mount_zones from values
that are computed by querying the hardware zone write pointers (or its
software equivalents if the rt device isn't zoned).  So the two incore
free rt space counters are completely detached from the ondisk
superblock counters.

What should be the value of sb_frextents, then?  Zero?  Please specify
that in the definition of xfs_dsb and update the verifiers to reject
nonzero values.

--D

> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---
>  fs/xfs/libxfs/xfs_sb.c           |  2 +-
>  fs/xfs/scrub/fscounters.c        | 11 +++++++++--
>  fs/xfs/scrub/fscounters_repair.c | 10 ++++++----
>  fs/xfs/xfs_mount.c               |  2 +-
>  fs/xfs/xfs_super.c               |  4 +++-
>  5 files changed, 20 insertions(+), 9 deletions(-)
> 
> diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c
> index 6fc21c0a332b..ee56fc22fd06 100644
> --- a/fs/xfs/libxfs/xfs_sb.c
> +++ b/fs/xfs/libxfs/xfs_sb.c
> @@ -1305,7 +1305,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);
>  	}
> diff --git a/fs/xfs/scrub/fscounters.c b/fs/xfs/scrub/fscounters.c
> index 732658a62a2d..5f5f67947440 100644
> --- a/fs/xfs/scrub/fscounters.c
> +++ b/fs/xfs/scrub/fscounters.c
> @@ -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],
>  			fsc->frextents - fsc->frextents_delayed)) {
>  		if (fsc->frozen)
> diff --git a/fs/xfs/scrub/fscounters_repair.c b/fs/xfs/scrub/fscounters_repair.c
> index 8fb0db78489e..f0d2b04644e4 100644
> --- a/fs/xfs/scrub/fscounters_repair.c
> +++ b/fs/xfs/scrub/fscounters_repair.c
> @@ -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;
>  }
> diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c
> index db910ecc1ed4..72fa28263e14 100644
> --- a/fs/xfs/xfs_mount.c
> +++ b/fs/xfs/xfs_mount.c
> @@ -551,7 +551,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;
> diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c
> index 18430e975c53..d0b7e0d02366 100644
> --- a/fs/xfs/xfs_super.c
> +++ b/fs/xfs/xfs_super.c
> @@ -1127,7 +1127,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
> -- 
> 2.45.2
> 
>
Christoph Hellwig Dec. 13, 2024, 5:29 a.m. UTC | #2
On Thu, Dec 12, 2024 at 02:26:09PM -0800, Darrick J. Wong wrote:
> What should be the value of sb_frextents, then?  Zero?  Please specify
> that in the definition of xfs_dsb and update the verifiers to reject
> nonzero values.

Right now it's undefined.  But forcing it to zero makes sense.
diff mbox series

Patch

diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c
index 6fc21c0a332b..ee56fc22fd06 100644
--- a/fs/xfs/libxfs/xfs_sb.c
+++ b/fs/xfs/libxfs/xfs_sb.c
@@ -1305,7 +1305,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);
 	}
diff --git a/fs/xfs/scrub/fscounters.c b/fs/xfs/scrub/fscounters.c
index 732658a62a2d..5f5f67947440 100644
--- a/fs/xfs/scrub/fscounters.c
+++ b/fs/xfs/scrub/fscounters.c
@@ -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],
 			fsc->frextents - fsc->frextents_delayed)) {
 		if (fsc->frozen)
diff --git a/fs/xfs/scrub/fscounters_repair.c b/fs/xfs/scrub/fscounters_repair.c
index 8fb0db78489e..f0d2b04644e4 100644
--- a/fs/xfs/scrub/fscounters_repair.c
+++ b/fs/xfs/scrub/fscounters_repair.c
@@ -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;
 }
diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c
index db910ecc1ed4..72fa28263e14 100644
--- a/fs/xfs/xfs_mount.c
+++ b/fs/xfs/xfs_mount.c
@@ -551,7 +551,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;
diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c
index 18430e975c53..d0b7e0d02366 100644
--- a/fs/xfs/xfs_super.c
+++ b/fs/xfs/xfs_super.c
@@ -1127,7 +1127,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