diff options
Diffstat (limited to 'drivers/md/raid1.c')
-rw-r--r-- | drivers/md/raid1.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index a0b225eb4ac4..118e0f69f224 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c | |||
@@ -737,9 +737,22 @@ static void wait_barrier(struct r1conf *conf) | |||
737 | spin_lock_irq(&conf->resync_lock); | 737 | spin_lock_irq(&conf->resync_lock); |
738 | if (conf->barrier) { | 738 | if (conf->barrier) { |
739 | conf->nr_waiting++; | 739 | conf->nr_waiting++; |
740 | wait_event_lock_irq(conf->wait_barrier, !conf->barrier, | 740 | /* Wait for the barrier to drop. |
741 | * However if there are already pending | ||
742 | * requests (preventing the barrier from | ||
743 | * rising completely), and the | ||
744 | * pre-process bio queue isn't empty, | ||
745 | * then don't wait, as we need to empty | ||
746 | * that queue to get the nr_pending | ||
747 | * count down. | ||
748 | */ | ||
749 | wait_event_lock_irq(conf->wait_barrier, | ||
750 | !conf->barrier || | ||
751 | (conf->nr_pending && | ||
752 | current->bio_list && | ||
753 | !bio_list_empty(current->bio_list)), | ||
741 | conf->resync_lock, | 754 | conf->resync_lock, |
742 | ); | 755 | ); |
743 | conf->nr_waiting--; | 756 | conf->nr_waiting--; |
744 | } | 757 | } |
745 | conf->nr_pending++; | 758 | conf->nr_pending++; |