summaryrefslogtreecommitdiff
path: root/net
diff options
context:
space:
mode:
authorliuyacan <liuyacan@corp.netease.com>2022-04-21 17:40:27 +0800
committerDavid S. Miller <davem@davemloft.net>2022-04-25 11:10:49 +0100
commit4e2e65e2e56c6ceb4ea1719360080c0af083229e (patch)
tree7d87997394e9a8382237a7132abf1bf7456228c2 /net
parente85f8a9f162562af1a850b9e83ec384f2b6b56aa (diff)
net/smc: sync err code when tcp connection was refused
In the current implementation, when TCP initiates a connection to an unavailable [ip,port], ECONNREFUSED will be stored in the TCP socket, but SMC will not. However, some apps (like curl) use getsockopt(,,SO_ERROR,,) to get the error information, which makes them miss the error message and behave strangely. Fixes: 50717a37db03 ("net/smc: nonblocking connect rework") Signed-off-by: liuyacan <liuyacan@corp.netease.com> Reviewed-by: Tony Lu <tonylu@linux.alibaba.com> Acked-by: Karsten Graul <kgraul@linux.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to '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 fc7b6eb22143..bbb1a4ce5050 100644
--- a/net/smc/af_smc.c
+++ b/net/smc/af_smc.c
@@ -1475,6 +1475,8 @@ static void smc_connect_work(struct work_struct *work)
smc->sk.sk_state = SMC_CLOSED;
if (rc == -EPIPE || rc == -EAGAIN)
smc->sk.sk_err = EPIPE;
+ else if (rc == -ECONNREFUSED)
+ smc->sk.sk_err = ECONNREFUSED;
else if (signal_pending(current))
smc->sk.sk_err = -sock_intr_errno(timeo);
sock_put(&smc->sk); /* passive closing */