summaryrefslogtreecommitdiff
path: root/fs/xfs/xfs_zone_alloc.c
diff options
context:
space:
mode:
authorDarrick J. Wong <djwong@kernel.org>2025-03-17 06:44:54 +0100
committerCarlos Maiolino <cem@kernel.org>2025-03-18 13:06:00 +0100
commitf56f73ebf8bb13d72b93e490c1f175a0a2c836f2 (patch)
treeed6a407682a0c6ebcf28466e88d21638b8561932 /fs/xfs/xfs_zone_alloc.c
parent9ec3f7977a32f2045ef14445f165bcd96e596344 (diff)
xfs: don't wake zone space waiters without m_zone_info
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> Reviewed-by: Hans Holmberg <hans.holmberg@wdc.com> Signed-off-by: Carlos Maiolino <cem@kernel.org>
Diffstat (limited to 'fs/xfs/xfs_zone_alloc.c')
-rw-r--r--fs/xfs/xfs_zone_alloc.c15
1 files 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 @@ out_error:
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);
}
/*