mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 14:11:52 +00:00
net/smc: fix fallback failed while sendmsg with fastopen
Before determining whether the msg has unsupported options, it has been
prematurely terminated by the wrong status check.
For the application, the general usages of MSG_FASTOPEN likes
fd = socket(...)
/* rather than connect */
sendto(fd, data, len, MSG_FASTOPEN)
Hence, We need to check the flag before state check, because the sock
state here is always SMC_INIT when applications tries MSG_FASTOPEN.
Once we found unsupported options, fallback it to TCP.
Fixes: ee9dfbef02
("net/smc: handle sockopts forcing fallback")
Signed-off-by: D. Wythe <alibuda@linux.alibaba.com>
Signed-off-by: Simon Horman <simon.horman@corigine.com>
v2 -> v1: Optimize code style
Reviewed-by: Tony Lu <tonylu@linux.alibaba.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
37d9df224d
commit
ce7ca79471
@ -2657,16 +2657,14 @@ static int smc_sendmsg(struct socket *sock, struct msghdr *msg, size_t len)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
struct smc_sock *smc;
|
||||
int rc = -EPIPE;
|
||||
int rc;
|
||||
|
||||
smc = smc_sk(sk);
|
||||
lock_sock(sk);
|
||||
if ((sk->sk_state != SMC_ACTIVE) &&
|
||||
(sk->sk_state != SMC_APPCLOSEWAIT1) &&
|
||||
(sk->sk_state != SMC_INIT))
|
||||
goto out;
|
||||
|
||||
/* SMC does not support connect with fastopen */
|
||||
if (msg->msg_flags & MSG_FASTOPEN) {
|
||||
/* not connected yet, fallback */
|
||||
if (sk->sk_state == SMC_INIT && !smc->connect_nonblock) {
|
||||
rc = smc_switch_to_fallback(smc, SMC_CLC_DECL_OPTUNSUPP);
|
||||
if (rc)
|
||||
@ -2675,6 +2673,11 @@ static int smc_sendmsg(struct socket *sock, struct msghdr *msg, size_t len)
|
||||
rc = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
} else if ((sk->sk_state != SMC_ACTIVE) &&
|
||||
(sk->sk_state != SMC_APPCLOSEWAIT1) &&
|
||||
(sk->sk_state != SMC_INIT)) {
|
||||
rc = -EPIPE;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (smc->use_fallback) {
|
||||
|
Loading…
Reference in New Issue
Block a user