]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
xfs: don't wake zone space waiters without m_zone_info
authorDarrick J. Wong <djwong@kernel.org>
Mon, 17 Mar 2025 05:44:54 +0000 (06:44 +0100)
committerCarlos Maiolino <cem@kernel.org>
Tue, 18 Mar 2025 12:06:00 +0000 (13:06 +0100)
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>
fs/xfs/xfs_zone_alloc.c

index fd4c60a050e61550dd242bbc4c45f9a85c9a3248..52af234936a238555b51b862c54a31b607b071d7 100644 (file)
@@ -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);
 }
 
 /*