]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/md/raid10.c
md/raid1,raid10: avoid deadlock during resync/recovery.
[mv-sheeva.git] / drivers / md / raid10.c
index f4f3edcdaf8d85bbdbd241d8ccb647da2ca8bf54..2ae7021320e178d0b40b93fcbd24842e11c2a713 100644 (file)
@@ -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++;