zvol: Fix suspend lock leaks (#16270)

In several functions, we use a flag variable to track whether
zv_suspend_lock is held.  This flag was not getting reset in a
particular case where we need to retry the underlying operation,
resulting in a lock leak.  Make sure to update the flag where necessary.

Signed-off-by: Mark Johnston <markj@FreeBSD.org>
Reviewed-by: Allan Jude <allan@klarasystems.com>
Reviewed-by: Alexander Motin <mav@FreeBSD.org>
Reviewed-by: Tino Reichardt <milky-zfs@mcmilk.de>
Reviewed-by: Tony Hutter <hutter2@llnl.gov>
This commit is contained in:
Mark Johnston 2024-07-10 16:27:44 -05:00 committed by GitHub
parent 326040b285
commit 4367312760
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 3 additions and 0 deletions

View File

@ -292,6 +292,7 @@ retry:
if (!mutex_tryenter(&spa_namespace_lock)) { if (!mutex_tryenter(&spa_namespace_lock)) {
mutex_exit(&zv->zv_state_lock); mutex_exit(&zv->zv_state_lock);
rw_exit(&zv->zv_suspend_lock); rw_exit(&zv->zv_suspend_lock);
drop_suspend = B_FALSE;
kern_yield(PRI_USER); kern_yield(PRI_USER);
goto retry; goto retry;
} else { } else {
@ -983,6 +984,7 @@ retry:
if (!mutex_tryenter(&spa_namespace_lock)) { if (!mutex_tryenter(&spa_namespace_lock)) {
mutex_exit(&zv->zv_state_lock); mutex_exit(&zv->zv_state_lock);
rw_exit(&zv->zv_suspend_lock); rw_exit(&zv->zv_suspend_lock);
drop_suspend = B_FALSE;
kern_yield(PRI_USER); kern_yield(PRI_USER);
goto retry; goto retry;
} else { } else {

View File

@ -791,6 +791,7 @@ retry:
if (!mutex_tryenter(&spa_namespace_lock)) { if (!mutex_tryenter(&spa_namespace_lock)) {
mutex_exit(&zv->zv_state_lock); mutex_exit(&zv->zv_state_lock);
rw_exit(&zv->zv_suspend_lock); rw_exit(&zv->zv_suspend_lock);
drop_suspend = B_FALSE;
#ifdef HAVE_BLKDEV_GET_ERESTARTSYS #ifdef HAVE_BLKDEV_GET_ERESTARTSYS
schedule(); schedule();