DLM: fix to reschedule rwork

When an error occurs in kernel_recvmsg or kernel_sendpage and
close_connection is called and receive work is already scheduled,
receive work is canceled. In that case, the receive work will not
be scheduled forever after reconnection, because CF_READ_PENDING
flag is established.

Signed-off-by: Tadashi Miyauchi <[email protected]>
Signed-off-by: Tsutomu Owa <[email protected]>
Signed-off-by: David Teigland <[email protected]>
This commit is contained in:
[email protected] 2017-09-12 09:02:02 +00:00 • committed by David Teigland
commit 0aa18464c8

View file

@ -593,10 +593,14 @@ static void close_connection(struct connection *con, bool and_other,
{
bool closing = test_and_set_bit(CF_CLOSING, &con->flags);
if (tx && !closing && cancel_work_sync(&con->swork))
if (tx && !closing && cancel_work_sync(&con->swork)) {
log_print("canceled swork for node %d", con->nodeid);
if (rx && !closing && cancel_work_sync(&con->rwork))
clear_bit(CF_WRITE_PENDING, &con->flags);
}
if (rx && !closing && cancel_work_sync(&con->rwork)) {
log_print("canceled rwork for node %d", con->nodeid);
clear_bit(CF_READ_PENDING, &con->flags);
}
mutex_lock(&con->sock_mutex);
if (con->sock) {