--- /dev/null
+Subject: block: blk_cleanup_queue() should call blk_sync_queue()
+From: Jens Axboe <jens.axboe@oracle.com>
+Date: Thu Oct 9 08:56:18 2008 +0200:
+Git: e3335de94067dbebe22e3962632ead34e832cb60
+
+When a driver calls blk_cleanup_queue(), the device should be fully idle.
+However, the block layer may have pending plugging timers and the IO
+schedulers may have pending work in the work queues. So quisce the device
+by waiting for the timer and flushing the work queues.
+
+Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
+Signed-off-by: Hannes Reinecke <hare@suse.de>
+
+---
+ block/blk-core.c | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+--- a/block/blk-core.c
++++ b/block/blk-core.c
+@@ -435,6 +435,14 @@ void blk_put_queue(struct request_queue
+
+ void blk_cleanup_queue(struct request_queue *q)
+ {
++ /*
++ * We know we have process context here, so we can be a little
++ * cautious and ensure that pending block actions on this device
++ * are done before moving on. Going into this function, we should
++ * not have processes doing IO to this device.
++ */
++ blk_sync_queue(q);
++
+ mutex_lock(&q->sysfs_lock);
+ queue_flag_set_unlocked(QUEUE_FLAG_DEAD, q);
+ mutex_unlock(&q->sysfs_lock);