aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/dm.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/md/dm.c')
-rw-r--r--drivers/md/dm.c29
1 files changed, 16 insertions, 13 deletions
diff --git a/drivers/md/dm.c b/drivers/md/dm.c
index 628ba001bb3c..e66f4040d84b 100644
--- a/drivers/md/dm.c
+++ b/drivers/md/dm.c
@@ -986,26 +986,29 @@ static void flush_current_bio_list(struct blk_plug_cb *cb, bool from_schedule)
986 struct dm_offload *o = container_of(cb, struct dm_offload, cb); 986 struct dm_offload *o = container_of(cb, struct dm_offload, cb);
987 struct bio_list list; 987 struct bio_list list;
988 struct bio *bio; 988 struct bio *bio;
989 int i;
989 990
990 INIT_LIST_HEAD(&o->cb.list); 991 INIT_LIST_HEAD(&o->cb.list);
991 992
992 if (unlikely(!current->bio_list)) 993 if (unlikely(!current->bio_list))
993 return; 994 return;
994 995
995 list = *current->bio_list; 996 for (i = 0; i < 2; i++) {
996 bio_list_init(current->bio_list); 997 list = current->bio_list[i];
997 998 bio_list_init(&current->bio_list[i]);
998 while ((bio = bio_list_pop(&list))) { 999
999 struct bio_set *bs = bio->bi_pool; 1000 while ((bio = bio_list_pop(&list))) {
1000 if (unlikely(!bs) || bs == fs_bio_set) { 1001 struct bio_set *bs = bio->bi_pool;
1001 bio_list_add(current->bio_list, bio); 1002 if (unlikely(!bs) || bs == fs_bio_set) {
1002 continue; 1003 bio_list_add(&current->bio_list[i], bio);
1004 continue;
1005 }
1006
1007 spin_lock(&bs->rescue_lock);
1008 bio_list_add(&bs->rescue_list, bio);
1009 queue_work(bs->rescue_workqueue, &bs->rescue_work);
1010 spin_unlock(&bs->rescue_lock);
1003 } 1011 }
1004
1005 spin_lock(&bs->rescue_lock);
1006 bio_list_add(&bs->rescue_list, bio);
1007 queue_work(bs->rescue_workqueue, &bs->rescue_work);
1008 spin_unlock(&bs->rescue_lock);
1009 } 1012 }
1010} 1013}
1011 1014