diff options
Diffstat (limited to 'drivers/md/dm.c')
-rw-r--r-- | drivers/md/dm.c | 29 |
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(¤t->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(¤t->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 | ||