aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/md')
-rw-r--r--drivers/md/dm.c18
1 files changed, 7 insertions, 11 deletions
diff --git a/drivers/md/dm.c b/drivers/md/dm.c
index 385c2e8f90c8..4ba0811f28c5 100644
--- a/drivers/md/dm.c
+++ b/drivers/md/dm.c
@@ -1401,14 +1401,20 @@ static int dm_wait_for_completion(struct mapped_device *md)
1401/* 1401/*
1402 * Process the deferred bios 1402 * Process the deferred bios
1403 */ 1403 */
1404static void __flush_deferred_io(struct mapped_device *md) 1404static void dm_wq_work(struct work_struct *work)
1405{ 1405{
1406 struct mapped_device *md = container_of(work, struct mapped_device,
1407 work);
1406 struct bio *c; 1408 struct bio *c;
1407 1409
1410 down_write(&md->io_lock);
1411
1408 while ((c = bio_list_pop(&md->deferred))) 1412 while ((c = bio_list_pop(&md->deferred)))
1409 __split_and_process_bio(md, c); 1413 __split_and_process_bio(md, c);
1410 1414
1411 clear_bit(DMF_BLOCK_IO, &md->flags); 1415 clear_bit(DMF_BLOCK_IO, &md->flags);
1416
1417 up_write(&md->io_lock);
1412} 1418}
1413 1419
1414static void __merge_pushback_list(struct mapped_device *md) 1420static void __merge_pushback_list(struct mapped_device *md)
@@ -1422,16 +1428,6 @@ static void __merge_pushback_list(struct mapped_device *md)
1422 spin_unlock_irqrestore(&md->pushback_lock, flags); 1428 spin_unlock_irqrestore(&md->pushback_lock, flags);
1423} 1429}
1424 1430
1425static void dm_wq_work(struct work_struct *work)
1426{
1427 struct mapped_device *md = container_of(work, struct mapped_device,
1428 work);
1429
1430 down_write(&md->io_lock);
1431 __flush_deferred_io(md);
1432 up_write(&md->io_lock);
1433}
1434
1435static void dm_queue_flush(struct mapped_device *md) 1431static void dm_queue_flush(struct mapped_device *md)
1436{ 1432{
1437 queue_work(md->wq, &md->work); 1433 queue_work(md->wq, &md->work);