aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJens Axboe <jens.axboe@oracle.com>2008-09-18 12:22:54 -0400
committerJens Axboe <jens.axboe@oracle.com>2008-10-09 02:56:18 -0400
commite3335de94067dbebe22e3962632ead34e832cb60 (patch)
tree93d88fd70ce8af33d9444e9af91a4e0635a64c96
parent9246b5f06deeea541e7c62437c2ad19a0b1172c0 (diff)
block: blk_cleanup_queue() should call blk_sync_queue()
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>
-rw-r--r--block/blk-core.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/block/blk-core.c b/block/blk-core.c
index d768a8ddc173..37fba001bdcf 100644
--- a/block/blk-core.c
+++ b/block/blk-core.c
@@ -436,6 +436,14 @@ void blk_put_queue(struct request_queue *q)
436 436
437void blk_cleanup_queue(struct request_queue *q) 437void blk_cleanup_queue(struct request_queue *q)
438{ 438{
439 /*
440 * We know we have process context here, so we can be a little
441 * cautious and ensure that pending block actions on this device
442 * are done before moving on. Going into this function, we should
443 * not have processes doing IO to this device.
444 */
445 blk_sync_queue(q);
446
439 mutex_lock(&q->sysfs_lock); 447 mutex_lock(&q->sysfs_lock);
440 queue_flag_set_unlocked(QUEUE_FLAG_DEAD, q); 448 queue_flag_set_unlocked(QUEUE_FLAG_DEAD, q);
441 mutex_unlock(&q->sysfs_lock); 449 mutex_unlock(&q->sysfs_lock);