diff options
| author | Darrick J. Wong <[email protected]> | 2025-03-17 05:44:54 +0000 |
|---|---|---|
| committer | Carlos Maiolino <[email protected]> | 2025-03-18 12:06:00 +0000 |
| commit | f56f73ebf8bb13d72b93e490c1f175a0a2c836f2 (patch) | |
| tree | ed6a407682a0c6ebcf28466e88d21638b8561932 /fs/xfs/xfs_zone_alloc.c | |
| parent | xfs: don't increment m_generation for all errors in xfs_growfs_data (diff) | |
| download | kernel-f56f73ebf8bb13d72b93e490c1f175a0a2c836f2.tar.gz kernel-f56f73ebf8bb13d72b93e490c1f175a0a2c836f2.zip | |
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 <[email protected]>
[hch: added a commit log and comment]
Signed-off-by: Christoph Hellwig <[email protected]>
Reviewed-by: Carlos Maiolino <[email protected]>
Reviewed-by: Hans Holmberg <[email protected]>
Signed-off-by: Carlos Maiolino <[email protected]>
Diffstat (limited to 'fs/xfs/xfs_zone_alloc.c')
| -rw-r--r-- | fs/xfs/xfs_zone_alloc.c | 15 |
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); } /* |
