summaryrefslogtreecommitdiffstats
path: root/module/zfs/spa.c
diff options
context:
space:
mode:
authorSerapheim Dimitropoulos <[email protected]>2019-01-13 10:09:46 -0800
committerBrian Behlendorf <[email protected]>2019-01-13 10:09:46 -0800
commit61c3391acc988573aaf9e59550f863de4affcb68 (patch)
tree915910c51e0bef4cf4ee0d792c75602e3d814ea3 /module/zfs/spa.c
parent83c796c5e9d9ecb28e9553338f079a5d6b015b10 (diff)
Serialize ZTHR operations to eliminate races
Adds a new lock for serializing operations on zthrs. The commit also includes some code cleanup and refactoring. Reviewed by: Matt Ahrens <[email protected]> Reviewed by: Tom Caputi <[email protected]> Reviewed-by: Brian Behlendorf <[email protected]> Signed-off-by: Serapheim Dimitropoulos <[email protected]> Closes #8229
Diffstat (limited to 'module/zfs/spa.c')
-rw-r--r--module/zfs/spa.c14
1 files changed, 6 insertions, 8 deletions
diff --git a/module/zfs/spa.c b/module/zfs/spa.c
index c4ff5002b..c98daab49 100644
--- a/module/zfs/spa.c
+++ b/module/zfs/spa.c
@@ -1486,13 +1486,11 @@ spa_unload(spa_t *spa)
}
if (spa->spa_condense_zthr != NULL) {
- ASSERT(!zthr_isrunning(spa->spa_condense_zthr));
zthr_destroy(spa->spa_condense_zthr);
spa->spa_condense_zthr = NULL;
}
if (spa->spa_checkpoint_discard_zthr != NULL) {
- ASSERT(!zthr_isrunning(spa->spa_checkpoint_discard_zthr));
zthr_destroy(spa->spa_checkpoint_discard_zthr);
spa->spa_checkpoint_discard_zthr = NULL;
}
@@ -7214,12 +7212,12 @@ spa_async_suspend(spa_t *spa)
spa_vdev_remove_suspend(spa);
zthr_t *condense_thread = spa->spa_condense_zthr;
- if (condense_thread != NULL && zthr_isrunning(condense_thread))
- VERIFY0(zthr_cancel(condense_thread));
+ if (condense_thread != NULL)
+ zthr_cancel(condense_thread);
zthr_t *discard_thread = spa->spa_checkpoint_discard_zthr;
- if (discard_thread != NULL && zthr_isrunning(discard_thread))
- VERIFY0(zthr_cancel(discard_thread));
+ if (discard_thread != NULL)
+ zthr_cancel(discard_thread);
}
void
@@ -7232,11 +7230,11 @@ spa_async_resume(spa_t *spa)
spa_restart_removal(spa);
zthr_t *condense_thread = spa->spa_condense_zthr;
- if (condense_thread != NULL && !zthr_isrunning(condense_thread))
+ if (condense_thread != NULL)
zthr_resume(condense_thread);
zthr_t *discard_thread = spa->spa_checkpoint_discard_zthr;
- if (discard_thread != NULL && !zthr_isrunning(discard_thread))
+ if (discard_thread != NULL)
zthr_resume(discard_thread);
}