From 21f681ca5ae822c2b2fd4be81a33305a39cda480 Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Mon, 19 Mar 2012 12:46:38 +1100 Subject: [PATCH] --- yaml --- r: 292793 b: refs/heads/master c: d6b42dcb995e6acd7cc276774e751ffc9f0ef4bf h: refs/heads/master i: 292791: 94bf4e0d138d25ce11359487717d24c1e9ecdb9d v: v3 --- [refs] | 2 +- trunk/drivers/md/raid1.c | 17 +++++++++++++++-- trunk/drivers/md/raid10.c | 17 +++++++++++++++-- 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/[refs] b/[refs] index a95e4ade6037..0402c891448c 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 4474ca42e2577563a919fd3ed782e2ec55bf11a2 +refs/heads/master: d6b42dcb995e6acd7cc276774e751ffc9f0ef4bf diff --git a/trunk/drivers/md/raid1.c b/trunk/drivers/md/raid1.c index a0b225eb4ac4..118e0f69f224 100644 --- a/trunk/drivers/md/raid1.c +++ b/trunk/drivers/md/raid1.c @@ -737,9 +737,22 @@ static void wait_barrier(struct r1conf *conf) spin_lock_irq(&conf->resync_lock); if (conf->barrier) { conf->nr_waiting++; - wait_event_lock_irq(conf->wait_barrier, !conf->barrier, + /* Wait for the barrier to drop. + * However if there are already pending + * requests (preventing the barrier from + * rising completely), and the + * pre-process bio queue isn't empty, + * then don't wait, as we need to empty + * that queue to get the nr_pending + * count down. + */ + wait_event_lock_irq(conf->wait_barrier, + !conf->barrier || + (conf->nr_pending && + current->bio_list && + !bio_list_empty(current->bio_list)), conf->resync_lock, - ); + ); conf->nr_waiting--; } conf->nr_pending++; diff --git a/trunk/drivers/md/raid10.c b/trunk/drivers/md/raid10.c index f4f3edcdaf8d..2ae7021320e1 100644 --- a/trunk/drivers/md/raid10.c +++ b/trunk/drivers/md/raid10.c @@ -863,9 +863,22 @@ static void wait_barrier(struct r10conf *conf) spin_lock_irq(&conf->resync_lock); if (conf->barrier) { conf->nr_waiting++; - wait_event_lock_irq(conf->wait_barrier, !conf->barrier, + /* Wait for the barrier to drop. + * However if there are already pending + * requests (preventing the barrier from + * rising completely), and the + * pre-process bio queue isn't empty, + * then don't wait, as we need to empty + * that queue to get the nr_pending + * count down. + */ + wait_event_lock_irq(conf->wait_barrier, + !conf->barrier || + (conf->nr_pending && + current->bio_list && + !bio_list_empty(current->bio_list)), conf->resync_lock, - ); + ); conf->nr_waiting--; } conf->nr_pending++;