|
@@ -747,13 +747,20 @@ static void freeze_array(conf_t *conf)
|
|
|
/* stop syncio and normal IO and wait for everything to
|
|
|
* go quiet.
|
|
|
* We increment barrier and nr_waiting, and then
|
|
|
- * wait until barrier+nr_pending match nr_queued+2
|
|
|
+ * wait until nr_pending match nr_queued+1
|
|
|
+ * This is called in the context of one normal IO request
|
|
|
+ * that has failed. Thus any sync request that might be pending
|
|
|
+ * will be blocked by nr_pending, and we need to wait for
|
|
|
+ * pending IO requests to complete or be queued for re-try.
|
|
|
+ * Thus the number queued (nr_queued) plus this request (1)
|
|
|
+ * must match the number of pending IOs (nr_pending) before
|
|
|
+ * we continue.
|
|
|
*/
|
|
|
spin_lock_irq(&conf->resync_lock);
|
|
|
conf->barrier++;
|
|
|
conf->nr_waiting++;
|
|
|
wait_event_lock_irq(conf->wait_barrier,
|
|
|
- conf->barrier+conf->nr_pending == conf->nr_queued+2,
|
|
|
+ conf->nr_pending == conf->nr_queued+1,
|
|
|
conf->resync_lock,
|
|
|
({ flush_pending_writes(conf);
|
|
|
raid10_unplug(conf->mddev->queue); }));
|