md_exit calls mddev_put on each mddev during module exit. mddev_put
calls blk_put_queue under spinlock, although it can sleep (it clearly
calls kblockd_flush). This patch lifts the spinlock to do the flush.
--- md.c.orig Fri Dec 24 22:34:29 2004
+++ md.c Sun Mar 27 14:14:22 2005
@@ -173,7 +173,10 @@
return;
if (!mddev->raid_disks && list_empty(&mddev->disks)) {
list_del(&mddev->all_mddevs);
+ spin_unlock(&all_mddevs_lock);
+ /* blk_put_queue calls kblockd_flush, which sleeps */
blk_put_queue(mddev->queue);
+ spin_lock(&all_mddevs_lock);
kfree(mddev);
}
spin_unlock(&all_mddevs_lock);
Here's a trace
[__might_sleep+166/176] __might_sleep+0xa6/0xb0
[flush_workqueue+21/144] flush_workqueue+0x15/0x90
[kblockd_flush+10/12] kblockd_flush+0xa/0xc
[blk_cleanup_queue+49/108] blk_cleanup_queue+0x31/0x6c
[pg0+273956980/1069723648] mddev_put+0x5c/0x8c [md]
[pg0+273983937/1069723648] md_exit+0x121/0x18d [md]
Peter
-
To unsubscribe from this list: send the line "unsubscribe linux-raid" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html