Patchwork [3.5.y.z,extended,stable] Patch "drbd: fix for deadlock when using automatic" has been added to staging queue

mail settings
Submitter Luis Henriques
Date May 15, 2013, 10:34 a.m.
Message ID <>
Download mbox | patch
Permalink /patch/244032/
State New
Headers show


Luis Henriques - May 15, 2013, 10:34 a.m.
This is a note to let you know that I have just added a patch titled

    drbd: fix for deadlock when using automatic

to the linux-3.5.y-queue branch of the 3.5.y.z extended stable tree 
which can be found at:;a=shortlog;h=refs/heads/linux-3.5.y-queue

If you, or anyone else, feels it should not be added to this tree, please 
reply to this email.

For more information about the 3.5.y.z tree, see



From aef4894442eaea1f1b9d92cd432b358996189d1c Mon Sep 17 00:00:00 2001
From: Philipp Reisner <>
Date: Wed, 27 Mar 2013 14:08:47 +0100
Subject: [PATCH] drbd: fix for deadlock when using automatic

commit 7c689e63a847316c1b2500f86891b0a574ce7e69 upstream.

With an automatic after split-brain recovery policy of
"after-sb-1pri call-pri-lost-after-sb",
when trying to drbd_set_role() to R_SECONDARY,
we run into a deadlock.

This was first recognized and supposedly fixed by
2009-06-10 "Fixed a deadlock when using automatic split brain recovery when both nodes are"
replacing drbd_set_role() with drbd_change_state() in that code-path,
but the first hunk of that patch forgets to remove the drbd_set_role().

We apparently only ever tested the "two primaries" case.

Signed-off-by: Philipp Reisner <>
Signed-off-by: Lars Ellenberg <>
Signed-off-by: Jens Axboe <>
Signed-off-by: Jonghwan Choi <>
Signed-off-by: Luis Henriques <>
 drivers/block/drbd/drbd_receiver.c | 1 -
 1 file changed, 1 deletion(-)



diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c
index ea4836e..e81cc53 100644
--- a/drivers/block/drbd/drbd_receiver.c
+++ b/drivers/block/drbd/drbd_receiver.c
@@ -2260,7 +2260,6 @@  static int drbd_asb_recover_1p(struct drbd_conf *mdev) __must_hold(local)
 		if (hg == -1 && mdev->state.role == R_PRIMARY) {
 			enum drbd_state_rv rv2;

-			drbd_set_role(mdev, R_SECONDARY, 0);
 			 /* drbd_change_state() does not sleep while in SS_IN_TRANSIENT_STATE,
 			  * we might be here in C_WF_REPORT_PARAMS which is transient.
 			  * we do not need to wait for the after state change work either. */