Skip to content

Commit

Permalink
Remove zl_issuer_lock from zil_suspend().
Browse files Browse the repository at this point in the history
This locking was recently added as part of openzfs#14979. But appears it
is illegal to take zl_issuer_lock while holding dp_config_rwlock,
taken by dsl_pool_hold().  It causes deadlock with sync thread in
spa_sync_upgrades().  On a second thought, we should not
need this locking, since zil_commit_impl() we call below takes
zl_issuer_lock, that should sufficiently protect zl_suspend reads,
combined with other logic from openzfs#14979.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by:	Alexander Motin <mav@FreeBSD.org>
Sponsored by:	iXsystems, Inc.
Closes openzfs#15103
  • Loading branch information
amotin committed Jul 25, 2023
1 parent 01a265d commit 676fc30
Showing 1 changed file with 0 additions and 4 deletions.
4 changes: 0 additions & 4 deletions module/zfs/zil.c
Original file line number Diff line number Diff line change
Expand Up @@ -3941,13 +3941,11 @@ zil_suspend(const char *osname, void **cookiep)
return (error);
zilog = dmu_objset_zil(os);

mutex_enter(&zilog->zl_issuer_lock);
mutex_enter(&zilog->zl_lock);
zh = zilog->zl_header;

if (zh->zh_flags & ZIL_REPLAY_NEEDED) { /* unplayed log */
mutex_exit(&zilog->zl_lock);
mutex_exit(&zilog->zl_issuer_lock);
dmu_objset_rele(os, suspend_tag);
return (SET_ERROR(EBUSY));
}
Expand All @@ -3961,7 +3959,6 @@ zil_suspend(const char *osname, void **cookiep)
if (cookiep == NULL && !zilog->zl_suspending &&
(zilog->zl_suspend > 0 || BP_IS_HOLE(&zh->zh_log))) {
mutex_exit(&zilog->zl_lock);
mutex_exit(&zilog->zl_issuer_lock);
dmu_objset_rele(os, suspend_tag);
return (0);
}
Expand All @@ -3970,7 +3967,6 @@ zil_suspend(const char *osname, void **cookiep)
dsl_pool_rele(dmu_objset_pool(os), suspend_tag);

zilog->zl_suspend++;
mutex_exit(&zilog->zl_issuer_lock);

if (zilog->zl_suspend > 1) {
/*
Expand Down

0 comments on commit 676fc30

Please sign in to comment.