aboutsummaryrefslogtreecommitdiffstats
path: root/net/smc/af_smc.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/smc/af_smc.c')
-rw-r--r--net/smc/af_smc.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/net/smc/af_smc.c b/net/smc/af_smc.c
index c4da4a78d369..b04a813fc865 100644
--- a/net/smc/af_smc.c
+++ b/net/smc/af_smc.c
@@ -146,6 +146,9 @@ static int smc_release(struct socket *sock)
146 sock_set_flag(sk, SOCK_DEAD); 146 sock_set_flag(sk, SOCK_DEAD);
147 sk->sk_shutdown |= SHUTDOWN_MASK; 147 sk->sk_shutdown |= SHUTDOWN_MASK;
148 } 148 }
149
150 sk->sk_prot->unhash(sk);
151
149 if (smc->clcsock) { 152 if (smc->clcsock) {
150 if (smc->use_fallback && sk->sk_state == SMC_LISTEN) { 153 if (smc->use_fallback && sk->sk_state == SMC_LISTEN) {
151 /* wake up clcsock accept */ 154 /* wake up clcsock accept */
@@ -170,7 +173,6 @@ static int smc_release(struct socket *sock)
170 smc_conn_free(&smc->conn); 173 smc_conn_free(&smc->conn);
171 release_sock(sk); 174 release_sock(sk);
172 175
173 sk->sk_prot->unhash(sk);
174 sock_put(sk); /* final sock_put */ 176 sock_put(sk); /* final sock_put */
175out: 177out:
176 return rc; 178 return rc;
@@ -1503,6 +1505,11 @@ static int smc_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
1503 1505
1504 smc = smc_sk(sk); 1506 smc = smc_sk(sk);
1505 lock_sock(sk); 1507 lock_sock(sk);
1508 if (sk->sk_state == SMC_CLOSED && (sk->sk_shutdown & RCV_SHUTDOWN)) {
1509 /* socket was connected before, no more data to read */
1510 rc = 0;
1511 goto out;
1512 }
1506 if ((sk->sk_state == SMC_INIT) || 1513 if ((sk->sk_state == SMC_INIT) ||
1507 (sk->sk_state == SMC_LISTEN) || 1514 (sk->sk_state == SMC_LISTEN) ||
1508 (sk->sk_state == SMC_CLOSED)) 1515 (sk->sk_state == SMC_CLOSED))
@@ -1838,7 +1845,11 @@ static ssize_t smc_splice_read(struct socket *sock, loff_t *ppos,
1838 1845
1839 smc = smc_sk(sk); 1846 smc = smc_sk(sk);
1840 lock_sock(sk); 1847 lock_sock(sk);
1841 1848 if (sk->sk_state == SMC_CLOSED && (sk->sk_shutdown & RCV_SHUTDOWN)) {
1849 /* socket was connected before, no more data to read */
1850 rc = 0;
1851 goto out;
1852 }
1842 if (sk->sk_state == SMC_INIT || 1853 if (sk->sk_state == SMC_INIT ||
1843 sk->sk_state == SMC_LISTEN || 1854 sk->sk_state == SMC_LISTEN ||
1844 sk->sk_state == SMC_CLOSED) 1855 sk->sk_state == SMC_CLOSED)