aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorliuyacan <[email protected]>2022-04-21 17:40:27 +0800
committerDavid S. Miller <[email protected]>2022-04-25 11:10:49 +0100
commit4e2e65e2e56c6ceb4ea1719360080c0af083229e (patch)
tree7d87997394e9a8382237a7132abf1bf7456228c2
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 <[email protected]> Reviewed-by: Tony Lu <[email protected]> Acked-by: Karsten Graul <[email protected]> Signed-off-by: David S. Miller <[email protected]>
-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 */