drbd: struct drbd_request: Introduce a new collision flag
This flag is set when a processes puts itself to sleep to wait for a
conflicting request to complete.
Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c
index b4e1dab..d9f3f7f 100644
--- a/drivers/block/drbd/drbd_receiver.c
+++ b/drivers/block/drbd/drbd_receiver.c
@@ -1815,6 +1815,7 @@
first = 1;
for (;;) {
struct drbd_interval *i;
+ struct drbd_request *req2;
int have_unacked = 0;
int have_conflict = 0;
prepare_to_wait(&mdev->misc_wait, &wait,
@@ -1822,8 +1823,7 @@
i = drbd_find_overlap(&mdev->write_requests, sector, size);
if (i) {
- struct drbd_request *req2 =
- container_of(i, struct drbd_request, i);
+ req2 = container_of(i, struct drbd_request, i);
/* only ALERT on first iteration,
* we may be woken up early... */
@@ -1869,6 +1869,9 @@
goto out_interrupted;
}
+ /* Indicate to wake up mdev->misc_wait upon completion. */
+ req2->rq_state |= RQ_COLLISION;
+
spin_unlock_irq(&mdev->tconn->req_lock);
if (first) {
first = 0;