sector_t sector = req->i.sector;
        int size = req->i.size;
 
-       i = drbd_find_overlap(&device->write_requests, sector, size);
-       if (!i)
-               return;
-
        for (;;) {
-               prepare_to_wait(&device->misc_wait, &wait, TASK_UNINTERRUPTIBLE);
-               i = drbd_find_overlap(&device->write_requests, sector, size);
-               if (!i)
+               drbd_for_each_overlap(i, &device->write_requests, sector, size) {
+                       /* Ignore, if already completed to upper layers. */
+                       if (i->completed)
+                               continue;
+                       /* Handle the first found overlap.  After the schedule
+                        * we have to restart the tree walk. */
                        break;
+               }
+               if (!i) /* if any */
+                       break;
+
                /* Indicate to wake up device->misc_wait on progress.  */
+               prepare_to_wait(&device->misc_wait, &wait, TASK_UNINTERRUPTIBLE);
                i->waiting = true;
                spin_unlock_irq(&device->resource->req_lock);
                schedule();