aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHans Wippel <hwippel@linux.ibm.com>2018-11-20 16:46:39 +0100
committerDavid S. Miller <davem@davemloft.net>2018-11-21 16:14:56 -0800
commitf07920ad9c6f5781c90ac4915f8254d999d8c1cc (patch)
tree73c7617e7b78bf570c380a7041b6d1916e02b68e
parent1e2b1046b53f356e663fd145d0c57bea04a0343a (diff)
downloadlinux-f07920ad9c6f5781c90ac4915f8254d999d8c1cc.tar.gz
net/smc: abort CLC connection in smc_release
In case of a non-blocking SMC socket, the initial CLC handshake is performed over a blocking TCP connection in a worker. If the SMC socket is released, smc_release has to wait for the blocking CLC socket operations (e.g., kernel_connect) inside the worker. This patch aborts a CLC connection when the respective non-blocking SMC socket is released to avoid waiting on socket operations or timeouts. Signed-off-by: Hans Wippel <hwippel@linux.ibm.com> Signed-off-by: Ursula Braun <ubraun@linux.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--net/smc/af_smc.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/net/smc/af_smc.c b/net/smc/af_smc.c
index 80e2119f1c7010..84f67f601838e0 100644
--- a/net/smc/af_smc.c
+++ b/net/smc/af_smc.c
@@ -127,6 +127,8 @@ static int smc_release(struct socket *sock)
smc = smc_sk(sk);
/* cleanup for a dangling non-blocking connect */
+ if (smc->connect_info && sk->sk_state == SMC_INIT)
+ tcp_abort(smc->clcsock->sk, ECONNABORTED);
flush_work(&smc->connect_work);
kfree(smc->connect_info);
smc->connect_info = NULL;