From: Andrew Morton Switch the kblockd flushing from a global flush to a more specific flush_work(). Cc: "Maciej W. Rozycki" Cc: David Howells Cc: Jens Axboe Cc: Nick Piggin Cc: Oleg Nesterov Signed-off-by: Andrew Morton --- block/as-iosched.c | 2 +- block/ll_rw_blk.c | 7 +++---- include/linux/blkdev.h | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) diff -puN block/as-iosched.c~kblockd-use-flush_work block/as-iosched.c --- a/block/as-iosched.c~kblockd-use-flush_work +++ a/block/as-iosched.c @@ -1292,7 +1292,7 @@ static void as_exit_queue(elevator_t *e) struct as_data *ad = e->elevator_data; del_timer_sync(&ad->antic_timer); - kblockd_flush(); + kblockd_flush_work(&ad->antic_work); BUG_ON(!list_empty(&ad->fifo_list[REQ_SYNC])); BUG_ON(!list_empty(&ad->fifo_list[REQ_ASYNC])); diff -puN block/ll_rw_blk.c~kblockd-use-flush_work block/ll_rw_blk.c --- a/block/ll_rw_blk.c~kblockd-use-flush_work +++ a/block/ll_rw_blk.c @@ -1649,7 +1649,6 @@ void blk_sync_queue(struct request_queue { queue_sync_plugs(q); cancel_delayed_work(&q->delay_work); - kblockd_flush(); } EXPORT_SYMBOL(blk_sync_queue); @@ -3595,11 +3594,11 @@ int kblockd_schedule_work(struct work_st EXPORT_SYMBOL(kblockd_schedule_work); -void kblockd_flush(void) +void kblockd_flush_work(struct work_struct *work) { - flush_workqueue(kblockd_workqueue); + flush_work(kblockd_workqueue, work); } -EXPORT_SYMBOL(kblockd_flush); +EXPORT_SYMBOL(kblockd_flush_work); int __init blk_dev_init(void) { diff -puN include/linux/blkdev.h~kblockd-use-flush_work include/linux/blkdev.h --- a/include/linux/blkdev.h~kblockd-use-flush_work +++ a/include/linux/blkdev.h @@ -875,7 +875,7 @@ static inline void put_dev_sector(Sector struct work_struct; int kblockd_schedule_work(struct work_struct *work); -void kblockd_flush(void); +void kblockd_flush_work(struct work_struct *work); #define MODULE_ALIAS_BLOCKDEV(major,minor) \ MODULE_ALIAS("block-major-" __stringify(major) "-" __stringify(minor)) _