diff options
Diffstat (limited to 'drivers/md/raid10.c')
| -rw-r--r-- | drivers/md/raid10.c | 17 | 
1 files changed, 15 insertions, 2 deletions
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index f4f3edcdaf8d..2ae7021320e1 100644 --- a/drivers/md/raid10.c +++ b/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++;  | 
