summaryrefslogtreecommitdiffstats
path: root/drivers/block/drbd/drbd_receiver.c
diff options
context:
space:
mode:
authorPhilipp Reisner2012-11-08 15:04:36 +0100
committerPhilipp Reisner2012-11-08 16:57:59 +0100
commit823bd832a60dcf4bf9c162112f34f2f1783d0eaa (patch)
tree6bc4707730dda8f597079008fdcc29209fcd0bd8 /drivers/block/drbd/drbd_receiver.c
parentdrbd: Fix the data-integrity-alg setting (diff)
downloadkernel-qcow2-linux-823bd832a60dcf4bf9c162112f34f2f1783d0eaa.tar.gz
kernel-qcow2-linux-823bd832a60dcf4bf9c162112f34f2f1783d0eaa.tar.xz
kernel-qcow2-linux-823bd832a60dcf4bf9c162112f34f2f1783d0eaa.zip
drbd: Bugfix for the connection behavior
If we get into the C_BROKEN_PIPE cstate once, the state engine set the thi->t_state of the receiver thread to restarting. But with the while loop in drbdd_init() a new connection gets established. After the call into drbdd() returns immediately since the thi->t_state is not RUNNING. The restart of drbd_init() then resets thi->t_state to RUNNING. I.e. after entering C_BROKEN_PIPE once, the next successful established connection gets wasted. The two parts of the fix: * Do not cause the thread to restart if we detect the issue with the sockets while we are in C_WF_CONNECTION. * Make sure that all actions that would have set us to C_BROKEN_PIPE happen before the state change to C_WF_REPORT_PARAMS. Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com> Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
Diffstat (limited to 'drivers/block/drbd/drbd_receiver.c')
-rw-r--r--drivers/block/drbd/drbd_receiver.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c
index 8d5212194806..fff55657e0da 100644
--- a/drivers/block/drbd/drbd_receiver.c
+++ b/drivers/block/drbd/drbd_receiver.c
@@ -987,14 +987,9 @@ retry:
}
}
- if (conn_request_state(tconn, NS(conn, C_WF_REPORT_PARAMS), CS_VERBOSE) < SS_SUCCESS)
- return 0;
-
sock->sk->sk_sndtimeo = timeout;
sock->sk->sk_rcvtimeo = MAX_SCHEDULE_TIMEOUT;
- drbd_thread_start(&tconn->asender);
-
if (drbd_send_protocol(tconn) == -EOPNOTSUPP)
return -1;
@@ -1008,6 +1003,11 @@ retry:
}
rcu_read_unlock();
+ if (conn_request_state(tconn, NS(conn, C_WF_REPORT_PARAMS), CS_VERBOSE) < SS_SUCCESS)
+ return 0;
+
+ drbd_thread_start(&tconn->asender);
+
return h;
out_release_sockets: