From: Darrick J. Wong Date: Mon, 17 Mar 2025 05:44:54 +0000 (+0100) Subject: xfs: don't wake zone space waiters without m_zone_info X-Git-Tag: v6.15-rc1~149^2~7^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f56f73ebf8bb13d72b93e490c1f175a0a2c836f2;p=thirdparty%2Fkernel%2Flinux.git 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 [hch: added a commit log and comment] Signed-off-by: Christoph Hellwig Reviewed-by: Carlos Maiolino Reviewed-by: Hans Holmberg Signed-off-by: Carlos Maiolino --- diff --git a/fs/xfs/xfs_zone_alloc.c b/fs/xfs/xfs_zone_alloc.c index fd4c60a050e61..52af234936a23 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); } /*