diff options
Diffstat (limited to 'net/smc/af_smc.c')
| -rw-r--r-- | net/smc/af_smc.c | 15 |
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 */ |
| 175 | out: | 177 | out: |
| 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) |
