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 <behlendorf1@llnl.gov>
Closes ZFS bugs #279, #62, #363, #418
This commit is contained in:
Gunnar Beutner 2011-10-11 09:59:02 -07:00 committed by Brian Behlendorf
parent 763b2f3b57
commit 64c075c3f4

View File

@ -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();