Move content of __flush_deferred_io to the calling function: dm_wq_work. There's no need to have a function that has only one caller. It makes further patches more clean (i.e. no more dropping a lock inside a subfunction that was took by the parent function) Signed-off-by: Mikulas Patocka --- drivers/md/dm.c | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) Index: linux-2.6.28-clean/drivers/md/dm.c =================================================================== --- linux-2.6.28-clean.orig/drivers/md/dm.c 2009-01-12 15:17:03.000000000 +0100 +++ linux-2.6.28-clean/drivers/md/dm.c 2009-01-12 15:17:06.000000000 +0100 @@ -1354,20 +1354,6 @@ static int dm_wait_for_completion(struct return r; } -/* - * Process the deferred bios - */ -static void __flush_deferred_io(struct mapped_device *md) -{ - struct bio *c; - - while ((c = bio_list_pop(&md->deferred))) { - __process_bio(md, c); - } - - clear_bit(DMF_BLOCK_IO, &md->flags); -} - static void __merge_pushback_list(struct mapped_device *md) { unsigned long flags; @@ -1379,12 +1365,21 @@ static void __merge_pushback_list(struct spin_unlock_irqrestore(&md->pushback_lock, flags); } +/* + * Process the deferred bios + */ static void dm_wq_work(struct work_struct *work) { struct mapped_device *md = container_of(work, struct mapped_device, work); + struct bio *c; down_write(&md->io_lock); - __flush_deferred_io(md); + + while ((c = bio_list_pop(&md->deferred))) { + __process_bio(md, c); + } + clear_bit(DMF_BLOCK_IO, &md->flags); + up_write(&md->io_lock); }