aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/raid1.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/md/raid1.c')
-rw-r--r--drivers/md/raid1.c17
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++;