aboutsummaryrefslogtreecommitdiffstats
path: root/cmd/ztest
diff options
context:
space:
mode:
authorTom Caputi <[email protected]>2018-12-04 12:43:31 -0500
committerBrian Behlendorf <[email protected]>2018-12-04 09:43:31 -0800
commit0b606cb33fd1c43a4eea416e48d81127373c20ea (patch)
tree60c1e81a4ec9d1f862ea337e518a59a7d31f3054 /cmd/ztest
parentbdbd5477bcba03b1df1e02b3b89e795c99e2f4c8 (diff)
Fix ztest deadlock in ztest_zil_remount()
This patch fixes a small race condition in ztest_zil_remount() that could result in a deadlock. ztest_device_removal() calls spa_vdev_remove() which may eventually call spa_reset_logs(). If ztest_zil_remount() attempts to call zil_close() while this is happening, it may fail when it asserts !zilog_is_dirty(zilog). This patch simply adds locking to correct the issue. Reviewed-by: Brian Behlendorf <[email protected]> Signed-off-by: Tom Caputi <[email protected]> Closes #8154
Diffstat (limited to 'cmd/ztest')
-rw-r--r--cmd/ztest/ztest.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/cmd/ztest/ztest.c b/cmd/ztest/ztest.c
index 111d45b9d..0d9495a28 100644
--- a/cmd/ztest/ztest.c
+++ b/cmd/ztest/ztest.c
@@ -2674,6 +2674,13 @@ ztest_zil_remount(ztest_ds_t *zd, uint64_t id)
objset_t *os = zd->zd_os;
/*
+ * We hold the ztest_vdev_lock so we don't cause problems with
+ * other threads that wish to remove a log device, such as
+ * ztest_device_removal().
+ */
+ mutex_enter(&ztest_vdev_lock);
+
+ /*
* We grab the zd_dirobj_lock to ensure that no other thread is
* updating the zil (i.e. adding in-memory log records) and the
* zd_zilog_lock to block any I/O.
@@ -2690,6 +2697,7 @@ ztest_zil_remount(ztest_ds_t *zd, uint64_t id)
(void) pthread_rwlock_unlock(&zd->zd_zilog_lock);
mutex_exit(&zd->zd_dirobj_lock);
+ mutex_exit(&ztest_vdev_lock);
}
/*