]> git.proxmox.com Git - mirror_spl-debian.git/commitdiff
Properly destroy work items in spl_kmem_cache_destroy()
authorGunnar Beutner <gunnar@beutner.name>
Tue, 11 Oct 2011 16:59:02 +0000 (09:59 -0700)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Tue, 11 Oct 2011 16:59:19 +0000 (09:59 -0700)
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

module/spl/spl-kmem.c

index d71ab11bb981dee3122e43db68c10f714631c427..a916f7ef0075735a25d7ebd5ae39a0eca893fbb2 100644 (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();