| From 874807a83139abc094f939e93623c5623573d543 Mon Sep 17 00:00:00 2001 |
| From: NeilBrown <neilb@suse.de> |
| Date: Tue, 27 Nov 2012 12:14:40 +1100 |
| Subject: md/raid1{,0}: fix deadlock in bitmap_unplug. |
| |
| From: NeilBrown <neilb@suse.de> |
| |
| commit 874807a83139abc094f939e93623c5623573d543 upstream. |
| |
| If the raid1 or raid10 unplug function gets called |
| from a make_request function (which is very possible) when |
| there are bios on the current->bio_list list, then it will not |
| be able to successfully call bitmap_unplug() and it could |
| need to submit more bios and wait for them to complete. |
| But they won't complete while current->bio_list is non-empty. |
| |
| So detect that case and handle the unplugging off to another thread |
| just like we already do when called from within the scheduler. |
| |
| RAID1 version of bug was introduced in 3.6, so that part of fix is |
| suitable for 3.6.y. RAID10 part won't apply. |
| |
| Reported-by: Torsten Kaiser <just.for.lkml@googlemail.com> |
| Reported-by: Peter Maloney <peter.maloney@brockmann-consult.de> |
| Signed-off-by: NeilBrown <neilb@suse.de> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/md/raid1.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/drivers/md/raid1.c |
| +++ b/drivers/md/raid1.c |
| @@ -958,7 +958,7 @@ static void raid1_unplug(struct blk_plug |
| struct r1conf *conf = mddev->private; |
| struct bio *bio; |
| |
| - if (from_schedule) { |
| + if (from_schedule || current->bio_list) { |
| spin_lock_irq(&conf->device_lock); |
| bio_list_merge(&conf->pending_bio_list, &plug->pending); |
| conf->pending_count += plug->pending_cnt; |