net/smc: recvmsg and splice_read should return 0 after shutdown
When a socket was connected and is now shut down for read, return 0 to indicate end of data in recvmsg and splice_read (like TCP) and do not return ENOTCONN. This behavior is required by the socket api. Signed-off-by: Karsten Graul <kgraul@linux.ibm.com> Signed-off-by: Ursula Braun <ubraun@linux.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
6889b36da7
commit
51c5aba3b6
|
@ -1505,6 +1505,11 @@ static int smc_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
|
|||
|
||||
smc = smc_sk(sk);
|
||||
lock_sock(sk);
|
||||
if (sk->sk_state == SMC_CLOSED && (sk->sk_shutdown & RCV_SHUTDOWN)) {
|
||||
/* socket was connected before, no more data to read */
|
||||
rc = 0;
|
||||
goto out;
|
||||
}
|
||||
if ((sk->sk_state == SMC_INIT) ||
|
||||
(sk->sk_state == SMC_LISTEN) ||
|
||||
(sk->sk_state == SMC_CLOSED))
|
||||
|
@ -1840,7 +1845,11 @@ static ssize_t smc_splice_read(struct socket *sock, loff_t *ppos,
|
|||
|
||||
smc = smc_sk(sk);
|
||||
lock_sock(sk);
|
||||
|
||||
if (sk->sk_state == SMC_CLOSED && (sk->sk_shutdown & RCV_SHUTDOWN)) {
|
||||
/* socket was connected before, no more data to read */
|
||||
rc = 0;
|
||||
goto out;
|
||||
}
|
||||
if (sk->sk_state == SMC_INIT ||
|
||||
sk->sk_state == SMC_LISTEN ||
|
||||
sk->sk_state == SMC_CLOSED)
|
||||
|
|
Loading…
Reference in New Issue