Linux XFS filesystem development
 help / color / mirror / Atom feed
* zoned fixes
@ 2025-03-17  5:44 Christoph Hellwig
  2025-03-17  5:44 ` [PATCH 1/3] xfs: fix a missing unlock in xfs_growfs_data Christoph Hellwig
                   ` (2 more replies)
  0 siblings, 3 replies; 9+ messages in thread
From: Christoph Hellwig @ 2025-03-17  5:44 UTC (permalink / raw)
  To: Carlos Maiolino; +Cc: Darrick J. Wong, Dan Carpenter, Hans Holmberg, linux-xfs

Hi all,

this is a small set of zoned fixes, one reported by Dan through smatch,
and reported and draft fixed by Darrick, and a little cleanup I noticed
while going through the report from Dan.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 1/3] xfs: fix a missing unlock in xfs_growfs_data
  2025-03-17  5:44 zoned fixes Christoph Hellwig
@ 2025-03-17  5:44 ` Christoph Hellwig
  2025-03-18 11:54   ` Carlos Maiolino
  2025-03-24  8:52   ` Carlos Maiolino
  2025-03-17  5:44 ` [PATCH 2/3] xfs: don't increment m_generation for all errors " Christoph Hellwig
  2025-03-17  5:44 ` [PATCH 3/3] xfs: don't wake zone space waiters without m_zone_info Christoph Hellwig
  2 siblings, 2 replies; 9+ messages in thread
From: Christoph Hellwig @ 2025-03-17  5:44 UTC (permalink / raw)
  To: Carlos Maiolino; +Cc: Darrick J. Wong, Dan Carpenter, Hans Holmberg, linux-xfs

The newly added check for the internal RT device needs to unlock
m_growlock just like all ther other error cases.

Fixes: bdc03eb5f98f ("xfs: allow internal RT devices for zoned mode")
Reported-by: Dan Carpenter <dan.carpenter@linaro.org>
Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 fs/xfs/xfs_fsops.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c
index ee2cefbd5df8..d7658b7dcdbd 100644
--- a/fs/xfs/xfs_fsops.c
+++ b/fs/xfs/xfs_fsops.c
@@ -301,7 +301,7 @@ xfs_growfs_data(
 	struct xfs_mount	*mp,
 	struct xfs_growfs_data	*in)
 {
-	int			error = 0;
+	int			error;
 
 	if (!capable(CAP_SYS_ADMIN))
 		return -EPERM;
@@ -309,8 +309,10 @@ xfs_growfs_data(
 		return -EWOULDBLOCK;
 
 	/* we can't grow the data section when an internal RT section exists */
-	if (in->newblocks != mp->m_sb.sb_dblocks && mp->m_sb.sb_rtstart)
-		return -EINVAL;
+	if (in->newblocks != mp->m_sb.sb_dblocks && mp->m_sb.sb_rtstart) {
+		error = -EINVAL;
+		goto out_error;
+	}
 
 	/* update imaxpct separately to the physical grow of the filesystem */
 	if (in->imaxpct != mp->m_sb.sb_imax_pct) {
-- 
2.45.2


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 2/3] xfs: don't increment m_generation for all errors in xfs_growfs_data
  2025-03-17  5:44 zoned fixes Christoph Hellwig
  2025-03-17  5:44 ` [PATCH 1/3] xfs: fix a missing unlock in xfs_growfs_data Christoph Hellwig
@ 2025-03-17  5:44 ` Christoph Hellwig
  2025-03-18 12:01   ` Carlos Maiolino
  2025-03-17  5:44 ` [PATCH 3/3] xfs: don't wake zone space waiters without m_zone_info Christoph Hellwig
  2 siblings, 1 reply; 9+ messages in thread
From: Christoph Hellwig @ 2025-03-17  5:44 UTC (permalink / raw)
  To: Carlos Maiolino; +Cc: Darrick J. Wong, Dan Carpenter, Hans Holmberg, linux-xfs

xfs_growfs_data needs to increment m_generation as soon as the primary
superblock has been updated.  As the update of the secondary superblocks
was part of xfs_growfs_data_private that mean the incremented had to be
done unconditionally once that was called.  Later, commit 83a7f86e39ff
("xfs: separate secondary sb update in growfs") split the secondary
superblock update into a separate helper, so now the increment on error
can be limited to failed calls to xfs_update_secondary_sbs.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 fs/xfs/xfs_fsops.c | 13 ++++++-------
 1 file changed, 6 insertions(+), 7 deletions(-)

diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c
index d7658b7dcdbd..b6f3d7abdae5 100644
--- a/fs/xfs/xfs_fsops.c
+++ b/fs/xfs/xfs_fsops.c
@@ -311,20 +311,20 @@ xfs_growfs_data(
 	/* we can't grow the data section when an internal RT section exists */
 	if (in->newblocks != mp->m_sb.sb_dblocks && mp->m_sb.sb_rtstart) {
 		error = -EINVAL;
-		goto out_error;
+		goto out_unlock;
 	}
 
 	/* update imaxpct separately to the physical grow of the filesystem */
 	if (in->imaxpct != mp->m_sb.sb_imax_pct) {
 		error = xfs_growfs_imaxpct(mp, in->imaxpct);
 		if (error)
-			goto out_error;
+			goto out_unlock;
 	}
 
 	if (in->newblocks != mp->m_sb.sb_dblocks) {
 		error = xfs_growfs_data_private(mp, in);
 		if (error)
-			goto out_error;
+			goto out_unlock;
 	}
 
 	/* Post growfs calculations needed to reflect new state in operations */
@@ -338,13 +338,12 @@ xfs_growfs_data(
 	/* Update secondary superblocks now the physical grow has completed */
 	error = xfs_update_secondary_sbs(mp);
 
-out_error:
 	/*
-	 * Increment the generation unconditionally, the error could be from
-	 * updating the secondary superblocks, in which case the new size
-	 * is live already.
+	 * Increment the generation unconditionally, after trying to update the
+	 * secondary superblocks, as the new size is live already at this point.
 	 */
 	mp->m_generation++;
+out_unlock:
 	mutex_unlock(&mp->m_growlock);
 	return error;
 }
-- 
2.45.2


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 3/3] xfs: don't wake zone space waiters without m_zone_info
  2025-03-17  5:44 zoned fixes Christoph Hellwig
  2025-03-17  5:44 ` [PATCH 1/3] xfs: fix a missing unlock in xfs_growfs_data Christoph Hellwig
  2025-03-17  5:44 ` [PATCH 2/3] xfs: don't increment m_generation for all errors " Christoph Hellwig
@ 2025-03-17  5:44 ` Christoph Hellwig
  2025-03-17 14:46   ` Hans Holmberg
  2025-03-18 12:04   ` Carlos Maiolino
  2 siblings, 2 replies; 9+ messages in thread
From: Christoph Hellwig @ 2025-03-17  5:44 UTC (permalink / raw)
  To: Carlos Maiolino; +Cc: Darrick J. Wong, Dan Carpenter, Hans Holmberg, linux-xfs

From: "Darrick J. Wong" <djwong@kernel.org>

xfs_zoned_wake_all checks SB_ACTIVE to make sure it does the right thing
when a shutdown happens during unmount, but it fails to account for the
log recovery special case that sets SB_ACTIVE temporarily.  Add a NULL
check to cover both cases.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
[hch: added a commit log and comment]
Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 fs/xfs/xfs_zone_alloc.c | 15 ++++++++++++---
 1 file changed, 12 insertions(+), 3 deletions(-)

diff --git a/fs/xfs/xfs_zone_alloc.c b/fs/xfs/xfs_zone_alloc.c
index fd4c60a050e6..52af234936a2 100644
--- a/fs/xfs/xfs_zone_alloc.c
+++ b/fs/xfs/xfs_zone_alloc.c
@@ -853,13 +853,22 @@ xfs_zone_alloc_and_submit(
 	bio_io_error(&ioend->io_bio);
 }
 
+/*
+ * Wake up all threads waiting for a zoned space allocation when the file system
+ * is shut down.
+ */
 void
 xfs_zoned_wake_all(
 	struct xfs_mount	*mp)
 {
-	if (!(mp->m_super->s_flags & SB_ACTIVE))
-		return; /* can happen during log recovery */
-	wake_up_all(&mp->m_zone_info->zi_zone_wait);
+	/*
+	 * Don't wake up if there is no m_zone_info.  This is complicated by the
+	 * fact that unmount can't atomically clear m_zone_info and thus we need
+	 * to check SB_ACTIVE for that, but mount temporarily enables SB_ACTIVE
+	 * during log recovery so we can't entirely rely on that either.
+	 */
+	if ((mp->m_super->s_flags & SB_ACTIVE) && mp->m_zone_info)
+		wake_up_all(&mp->m_zone_info->zi_zone_wait);
 }
 
 /*
-- 
2.45.2


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH 3/3] xfs: don't wake zone space waiters without m_zone_info
  2025-03-17  5:44 ` [PATCH 3/3] xfs: don't wake zone space waiters without m_zone_info Christoph Hellwig
@ 2025-03-17 14:46   ` Hans Holmberg
  2025-03-18 12:04   ` Carlos Maiolino
  1 sibling, 0 replies; 9+ messages in thread
From: Hans Holmberg @ 2025-03-17 14:46 UTC (permalink / raw)
  To: hch, Carlos Maiolino
  Cc: Darrick J. Wong, Dan Carpenter, linux-xfs@vger.kernel.org

On 17/03/2025 06:45, Christoph Hellwig wrote:
> From: "Darrick J. Wong" <djwong@kernel.org>
> 
> xfs_zoned_wake_all checks SB_ACTIVE to make sure it does the right thing
> when a shutdown happens during unmount, but it fails to account for the
> log recovery special case that sets SB_ACTIVE temporarily.  Add a NULL
> check to cover both cases.
> 
> Signed-off-by: Darrick J. Wong <djwong@kernel.org>
> [hch: added a commit log and comment]
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---
>  fs/xfs/xfs_zone_alloc.c | 15 ++++++++++++---
>  1 file changed, 12 insertions(+), 3 deletions(-)
> 
> diff --git a/fs/xfs/xfs_zone_alloc.c b/fs/xfs/xfs_zone_alloc.c
> index fd4c60a050e6..52af234936a2 100644
> --- a/fs/xfs/xfs_zone_alloc.c
> +++ b/fs/xfs/xfs_zone_alloc.c
> @@ -853,13 +853,22 @@ xfs_zone_alloc_and_submit(
>  	bio_io_error(&ioend->io_bio);
>  }
>  
> +/*
> + * Wake up all threads waiting for a zoned space allocation when the file system
> + * is shut down.
> + */
>  void
>  xfs_zoned_wake_all(
>  	struct xfs_mount	*mp)
>  {
> -	if (!(mp->m_super->s_flags & SB_ACTIVE))
> -		return; /* can happen during log recovery */
> -	wake_up_all(&mp->m_zone_info->zi_zone_wait);
> +	/*
> +	 * Don't wake up if there is no m_zone_info.  This is complicated by the
> +	 * fact that unmount can't atomically clear m_zone_info and thus we need
> +	 * to check SB_ACTIVE for that, but mount temporarily enables SB_ACTIVE
> +	 * during log recovery so we can't entirely rely on that either.
> +	 */
> +	if ((mp->m_super->s_flags & SB_ACTIVE) && mp->m_zone_info)
> +		wake_up_all(&mp->m_zone_info->zi_zone_wait);
>  }
>  
>  /*

Looks good,

Reviewed-by: Hans Holmberg <hans.holmberg@wdc.com>



^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 1/3] xfs: fix a missing unlock in xfs_growfs_data
  2025-03-17  5:44 ` [PATCH 1/3] xfs: fix a missing unlock in xfs_growfs_data Christoph Hellwig
@ 2025-03-18 11:54   ` Carlos Maiolino
  2025-03-24  8:52   ` Carlos Maiolino
  1 sibling, 0 replies; 9+ messages in thread
From: Carlos Maiolino @ 2025-03-18 11:54 UTC (permalink / raw)
  To: Christoph Hellwig
  Cc: Darrick J. Wong, Dan Carpenter, Hans Holmberg, linux-xfs

On Mon, Mar 17, 2025 at 06:44:52AM +0100, Christoph Hellwig wrote:
> The newly added check for the internal RT device needs to unlock
> m_growlock just like all ther other error cases.
> 
> Fixes: bdc03eb5f98f ("xfs: allow internal RT devices for zoned mode")
> Reported-by: Dan Carpenter <dan.carpenter@linaro.org>
> Signed-off-by: Christoph Hellwig <hch@lst.de>

Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com>

> ---
>  fs/xfs/xfs_fsops.c | 8 +++++---
>  1 file changed, 5 insertions(+), 3 deletions(-)
> 
> diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c
> index ee2cefbd5df8..d7658b7dcdbd 100644
> --- a/fs/xfs/xfs_fsops.c
> +++ b/fs/xfs/xfs_fsops.c
> @@ -301,7 +301,7 @@ xfs_growfs_data(
>  	struct xfs_mount	*mp,
>  	struct xfs_growfs_data	*in)
>  {
> -	int			error = 0;
> +	int			error;
> 
>  	if (!capable(CAP_SYS_ADMIN))
>  		return -EPERM;
> @@ -309,8 +309,10 @@ xfs_growfs_data(
>  		return -EWOULDBLOCK;
> 
>  	/* we can't grow the data section when an internal RT section exists */
> -	if (in->newblocks != mp->m_sb.sb_dblocks && mp->m_sb.sb_rtstart)
> -		return -EINVAL;
> +	if (in->newblocks != mp->m_sb.sb_dblocks && mp->m_sb.sb_rtstart) {
> +		error = -EINVAL;
> +		goto out_error;
> +	}
> 
>  	/* update imaxpct separately to the physical grow of the filesystem */
>  	if (in->imaxpct != mp->m_sb.sb_imax_pct) {
> --
> 2.45.2
> 

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 2/3] xfs: don't increment m_generation for all errors in xfs_growfs_data
  2025-03-17  5:44 ` [PATCH 2/3] xfs: don't increment m_generation for all errors " Christoph Hellwig
@ 2025-03-18 12:01   ` Carlos Maiolino
  0 siblings, 0 replies; 9+ messages in thread
From: Carlos Maiolino @ 2025-03-18 12:01 UTC (permalink / raw)
  To: Christoph Hellwig
  Cc: Darrick J. Wong, Dan Carpenter, Hans Holmberg, linux-xfs

On Mon, Mar 17, 2025 at 06:44:53AM +0100, Christoph Hellwig wrote:
> xfs_growfs_data needs to increment m_generation as soon as the primary
> superblock has been updated.  As the update of the secondary superblocks
> was part of xfs_growfs_data_private that mean the incremented had to be
> done unconditionally once that was called.  Later, commit 83a7f86e39ff
> ("xfs: separate secondary sb update in growfs") split the secondary
> superblock update into a separate helper, so now the increment on error
> can be limited to failed calls to xfs_update_secondary_sbs.
> 
> Signed-off-by: Christoph Hellwig <hch@lst.de>

Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com>

> ---
>  fs/xfs/xfs_fsops.c | 13 ++++++-------
>  1 file changed, 6 insertions(+), 7 deletions(-)
> 
> diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c
> index d7658b7dcdbd..b6f3d7abdae5 100644
> --- a/fs/xfs/xfs_fsops.c
> +++ b/fs/xfs/xfs_fsops.c
> @@ -311,20 +311,20 @@ xfs_growfs_data(
>  	/* we can't grow the data section when an internal RT section exists */
>  	if (in->newblocks != mp->m_sb.sb_dblocks && mp->m_sb.sb_rtstart) {
>  		error = -EINVAL;
> -		goto out_error;
> +		goto out_unlock;
>  	}
> 
>  	/* update imaxpct separately to the physical grow of the filesystem */
>  	if (in->imaxpct != mp->m_sb.sb_imax_pct) {
>  		error = xfs_growfs_imaxpct(mp, in->imaxpct);
>  		if (error)
> -			goto out_error;
> +			goto out_unlock;
>  	}
> 
>  	if (in->newblocks != mp->m_sb.sb_dblocks) {
>  		error = xfs_growfs_data_private(mp, in);
>  		if (error)
> -			goto out_error;
> +			goto out_unlock;
>  	}
> 
>  	/* Post growfs calculations needed to reflect new state in operations */
> @@ -338,13 +338,12 @@ xfs_growfs_data(
>  	/* Update secondary superblocks now the physical grow has completed */
>  	error = xfs_update_secondary_sbs(mp);
> 
> -out_error:
>  	/*
> -	 * Increment the generation unconditionally, the error could be from
> -	 * updating the secondary superblocks, in which case the new size
> -	 * is live already.
> +	 * Increment the generation unconditionally, after trying to update the
> +	 * secondary superblocks, as the new size is live already at this point.
>  	 */
>  	mp->m_generation++;
> +out_unlock:
>  	mutex_unlock(&mp->m_growlock);
>  	return error;
>  }
> --
> 2.45.2
> 
> 

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 3/3] xfs: don't wake zone space waiters without m_zone_info
  2025-03-17  5:44 ` [PATCH 3/3] xfs: don't wake zone space waiters without m_zone_info Christoph Hellwig
  2025-03-17 14:46   ` Hans Holmberg
@ 2025-03-18 12:04   ` Carlos Maiolino
  1 sibling, 0 replies; 9+ messages in thread
From: Carlos Maiolino @ 2025-03-18 12:04 UTC (permalink / raw)
  To: Christoph Hellwig
  Cc: Darrick J. Wong, Dan Carpenter, Hans Holmberg, linux-xfs

On Mon, Mar 17, 2025 at 06:44:54AM +0100, Christoph Hellwig wrote:
> From: "Darrick J. Wong" <djwong@kernel.org>
> 
> xfs_zoned_wake_all checks SB_ACTIVE to make sure it does the right thing
> when a shutdown happens during unmount, but it fails to account for the
> log recovery special case that sets SB_ACTIVE temporarily.  Add a NULL
> check to cover both cases.
> 
> Signed-off-by: Darrick J. Wong <djwong@kernel.org>
> [hch: added a commit log and comment]
> Signed-off-by: Christoph Hellwig <hch@lst.de>

Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com>

> ---
>  fs/xfs/xfs_zone_alloc.c | 15 ++++++++++++---
>  1 file changed, 12 insertions(+), 3 deletions(-)
> 
> diff --git a/fs/xfs/xfs_zone_alloc.c b/fs/xfs/xfs_zone_alloc.c
> index fd4c60a050e6..52af234936a2 100644
> --- a/fs/xfs/xfs_zone_alloc.c
> +++ b/fs/xfs/xfs_zone_alloc.c
> @@ -853,13 +853,22 @@ xfs_zone_alloc_and_submit(
>  	bio_io_error(&ioend->io_bio);
>  }
> 
> +/*
> + * Wake up all threads waiting for a zoned space allocation when the file system
> + * is shut down.
> + */
>  void
>  xfs_zoned_wake_all(
>  	struct xfs_mount	*mp)
>  {
> -	if (!(mp->m_super->s_flags & SB_ACTIVE))
> -		return; /* can happen during log recovery */
> -	wake_up_all(&mp->m_zone_info->zi_zone_wait);
> +	/*
> +	 * Don't wake up if there is no m_zone_info.  This is complicated by the
> +	 * fact that unmount can't atomically clear m_zone_info and thus we need
> +	 * to check SB_ACTIVE for that, but mount temporarily enables SB_ACTIVE
> +	 * during log recovery so we can't entirely rely on that either.
> +	 */
> +	if ((mp->m_super->s_flags & SB_ACTIVE) && mp->m_zone_info)
> +		wake_up_all(&mp->m_zone_info->zi_zone_wait);
>  }
> 
>  /*
> --
> 2.45.2
> 

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 1/3] xfs: fix a missing unlock in xfs_growfs_data
  2025-03-17  5:44 ` [PATCH 1/3] xfs: fix a missing unlock in xfs_growfs_data Christoph Hellwig
  2025-03-18 11:54   ` Carlos Maiolino
@ 2025-03-24  8:52   ` Carlos Maiolino
  1 sibling, 0 replies; 9+ messages in thread
From: Carlos Maiolino @ 2025-03-24  8:52 UTC (permalink / raw)
  To: Christoph Hellwig
  Cc: Darrick J. Wong, Dan Carpenter, Hans Holmberg, linux-xfs

On Mon, 17 Mar 2025 06:44:52 +0100, Christoph Hellwig wrote:
> The newly added check for the internal RT device needs to unlock
> m_growlock just like all ther other error cases.
> 
> 

Applied to for-next, thanks!

[1/3] xfs: fix a missing unlock in xfs_growfs_data
      commit: beba9487138151c17dec17105364b35935f21562
[2/3] xfs: don't increment m_generation for all errors in xfs_growfs_data
      commit: 9ec3f7977a32f2045ef14445f165bcd96e596344
[3/3] xfs: don't wake zone space waiters without m_zone_info
      commit: f56f73ebf8bb13d72b93e490c1f175a0a2c836f2

Best regards,
-- 
Carlos Maiolino <cem@kernel.org>


^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2025-03-24  8:52 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-03-17  5:44 zoned fixes Christoph Hellwig
2025-03-17  5:44 ` [PATCH 1/3] xfs: fix a missing unlock in xfs_growfs_data Christoph Hellwig
2025-03-18 11:54   ` Carlos Maiolino
2025-03-24  8:52   ` Carlos Maiolino
2025-03-17  5:44 ` [PATCH 2/3] xfs: don't increment m_generation for all errors " Christoph Hellwig
2025-03-18 12:01   ` Carlos Maiolino
2025-03-17  5:44 ` [PATCH 3/3] xfs: don't wake zone space waiters without m_zone_info Christoph Hellwig
2025-03-17 14:46   ` Hans Holmberg
2025-03-18 12:04   ` Carlos Maiolino

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox