Commit 9ed28556 authored by Ursula Braun's avatar Ursula Braun Committed by David S. Miller

net/smc: allow fallback after clc timeouts

If connection initialization fails for the LLC CONFIRM LINK or the
LLC ADD LINK step, fallback to TCP should be enabled. Thus
the negative return code -EAGAIN should switch to a positive timeout
reason code in these cases, and the internal CLC socket should
not have a set sk_err.
Signed-off-by: default avatarUrsula Braun <ubraun@linux.ibm.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 6ae36bff
...@@ -336,7 +336,7 @@ static int smc_clnt_conf_first_link(struct smc_sock *smc) ...@@ -336,7 +336,7 @@ static int smc_clnt_conf_first_link(struct smc_sock *smc)
rc = smc_clc_wait_msg(smc, &dclc, sizeof(dclc), rc = smc_clc_wait_msg(smc, &dclc, sizeof(dclc),
SMC_CLC_DECLINE); SMC_CLC_DECLINE);
return rc; return rc == -EAGAIN ? SMC_CLC_DECL_TIMEOUT_CL : rc;
} }
if (link->llc_confirm_rc) if (link->llc_confirm_rc)
...@@ -364,7 +364,7 @@ static int smc_clnt_conf_first_link(struct smc_sock *smc) ...@@ -364,7 +364,7 @@ static int smc_clnt_conf_first_link(struct smc_sock *smc)
rc = smc_clc_wait_msg(smc, &dclc, sizeof(dclc), rc = smc_clc_wait_msg(smc, &dclc, sizeof(dclc),
SMC_CLC_DECLINE); SMC_CLC_DECLINE);
return rc; return rc == -EAGAIN ? SMC_CLC_DECL_TIMEOUT_AL : rc;
} }
/* send add link reject message, only one link supported for now */ /* send add link reject message, only one link supported for now */
...@@ -966,7 +966,7 @@ static int smc_serv_conf_first_link(struct smc_sock *smc) ...@@ -966,7 +966,7 @@ static int smc_serv_conf_first_link(struct smc_sock *smc)
rc = smc_clc_wait_msg(smc, &dclc, sizeof(dclc), rc = smc_clc_wait_msg(smc, &dclc, sizeof(dclc),
SMC_CLC_DECLINE); SMC_CLC_DECLINE);
return rc; return rc == -EAGAIN ? SMC_CLC_DECL_TIMEOUT_CL : rc;
} }
if (link->llc_confirm_resp_rc) if (link->llc_confirm_resp_rc)
...@@ -987,7 +987,7 @@ static int smc_serv_conf_first_link(struct smc_sock *smc) ...@@ -987,7 +987,7 @@ static int smc_serv_conf_first_link(struct smc_sock *smc)
rc = smc_clc_wait_msg(smc, &dclc, sizeof(dclc), rc = smc_clc_wait_msg(smc, &dclc, sizeof(dclc),
SMC_CLC_DECLINE); SMC_CLC_DECLINE);
return rc; return rc == -EAGAIN ? SMC_CLC_DECL_TIMEOUT_AL : rc;
} }
smc_llc_link_active(link, net->ipv4.sysctl_tcp_keepalive_time); smc_llc_link_active(link, net->ipv4.sysctl_tcp_keepalive_time);
......
...@@ -297,7 +297,11 @@ int smc_clc_wait_msg(struct smc_sock *smc, void *buf, int buflen, ...@@ -297,7 +297,11 @@ int smc_clc_wait_msg(struct smc_sock *smc, void *buf, int buflen,
} }
if (clc_sk->sk_err) { if (clc_sk->sk_err) {
reason_code = -clc_sk->sk_err; reason_code = -clc_sk->sk_err;
smc->sk.sk_err = clc_sk->sk_err; if (clc_sk->sk_err == EAGAIN &&
expected_type == SMC_CLC_DECLINE)
clc_sk->sk_err = 0; /* reset for fallback usage */
else
smc->sk.sk_err = clc_sk->sk_err;
goto out; goto out;
} }
if (!len) { /* peer has performed orderly shutdown */ if (!len) { /* peer has performed orderly shutdown */
...@@ -306,7 +310,8 @@ int smc_clc_wait_msg(struct smc_sock *smc, void *buf, int buflen, ...@@ -306,7 +310,8 @@ int smc_clc_wait_msg(struct smc_sock *smc, void *buf, int buflen,
goto out; goto out;
} }
if (len < 0) { if (len < 0) {
smc->sk.sk_err = -len; if (len != -EAGAIN || expected_type != SMC_CLC_DECLINE)
smc->sk.sk_err = -len;
reason_code = len; reason_code = len;
goto out; goto out;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment