From fea2c8e95eb4fef89d54cc661debe0c4712afb0a Mon Sep 17 00:00:00 2001 From: Philipp Reisner Date: Tue, 13 Dec 2011 11:09:16 +0100 Subject: [PATCH] --- yaml --- r: 346151 b: refs/heads/master c: b8853dbd8c6410d1faef2785e8ee4c990b068a77 h: refs/heads/master i: 346149: f12fe3bd6e546b651c92d5e0f0d325f6eca4b196 346147: 1f46c328a6c77de7425db84aaed8a77f6d902126 346143: 558dcac8d13c80980e581b599d004fd09744368c v: v3 --- [refs] | 2 +- trunk/drivers/block/drbd/drbd_receiver.c | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 86bcb6c6b18a..c2cf80fbb289 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 57bcb6cf1ddb1593face20a13b140be19af9f6cd +refs/heads/master: b8853dbd8c6410d1faef2785e8ee4c990b068a77 diff --git a/trunk/drivers/block/drbd/drbd_receiver.c b/trunk/drivers/block/drbd/drbd_receiver.c index 733b8bd663d5..1b6845a6ba8d 100644 --- a/trunk/drivers/block/drbd/drbd_receiver.c +++ b/trunk/drivers/block/drbd/drbd_receiver.c @@ -3787,6 +3787,12 @@ static int receive_state(struct drbd_tconn *tconn, struct packet_info *pi) os = ns = drbd_read_state(mdev); spin_unlock_irq(&mdev->tconn->req_lock); + /* If some other part of the code (asender thread, timeout) + * already decided to close the connection again, + * we must not "re-establish" it here. */ + if (os.conn <= C_TEAR_DOWN) + return false; + /* If this is the "end of sync" confirmation, usually the peer disk * transitions from D_INCONSISTENT to D_UP_TO_DATE. For empty (0 bits * set) resync started in PausedSyncT, or if the timing of pause-/ @@ -4368,6 +4374,13 @@ static void conn_disconnect(struct drbd_tconn *tconn) if (tconn->cstate == C_STANDALONE) return; + /* We are about to start the cleanup after connection loss. + * Make sure drbd_make_request knows about that. + * Usually we should be in some network failure state already, + * but just in case we are not, we fix it up here. + */ + conn_request_state(tconn, NS(conn, C_NETWORK_FAILURE), CS_HARD); + /* asender does not clean up anything. it must not interfere, either */ drbd_thread_stop(&tconn->asender); drbd_free_sock(tconn);