From 64c075c3f4381df02d206008b94498248cc49324 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Tue, 11 Oct 2011 09:59:02 -0700 Subject: [PATCH] Properly destroy work items in spl_kmem_cache_destroy() In a non-debug build the ASSERT() would be optimized away which could cause pending work items to not be cancelled. We must also use cancel_delayed_work_sync() rather than just cancel_delayed_work() to actually wait until work items have completed. Otherwise they might accidentally access free'd memory. Signed-off-by: Brian Behlendorf Closes ZFS bugs #279, #62, #363, #418 --- module/spl/spl-kmem.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/module/spl/spl-kmem.c b/module/spl/spl-kmem.c index d71ab11b..a916f7ef 100644 --- a/module/spl/spl-kmem.c +++ b/module/spl/spl-kmem.c @@ -1491,10 +1491,10 @@ spl_kmem_cache_destroy(spl_kmem_cache_t *skc) up_write(&spl_kmem_cache_sem); /* Cancel any and wait for any pending delayed work */ - ASSERT(!test_and_set_bit(KMC_BIT_DESTROY, &skc->skc_flags)); - cancel_delayed_work(&skc->skc_work); + VERIFY(!test_and_set_bit(KMC_BIT_DESTROY, &skc->skc_flags)); + cancel_delayed_work_sync(&skc->skc_work); for_each_online_cpu(i) - cancel_delayed_work(&skc->skc_mag[i]->skm_work); + cancel_delayed_work_sync(&skc->skc_mag[i]->skm_work); flush_scheduled_work();