net/smc: common release code for non-accepted sockets
There are common steps when releasing an accepted or unaccepted socket. Move this code into a common routine. Signed-off-by: Ursula Braun <ubraun@linux.ibm.com> Signed-off-by: Karsten Graul <kgraul@linux.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
582737f990
commit
39f41f367b
@ -123,30 +123,11 @@ struct proto smc_proto6 = {
|
|||||||
};
|
};
|
||||||
EXPORT_SYMBOL_GPL(smc_proto6);
|
EXPORT_SYMBOL_GPL(smc_proto6);
|
||||||
|
|
||||||
static int smc_release(struct socket *sock)
|
static int __smc_release(struct smc_sock *smc)
|
||||||
{
|
{
|
||||||
struct sock *sk = sock->sk;
|
struct sock *sk = &smc->sk;
|
||||||
struct smc_sock *smc;
|
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
|
|
||||||
if (!sk)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
smc = smc_sk(sk);
|
|
||||||
|
|
||||||
/* cleanup for a dangling non-blocking connect */
|
|
||||||
if (smc->connect_nonblock && sk->sk_state == SMC_INIT)
|
|
||||||
tcp_abort(smc->clcsock->sk, ECONNABORTED);
|
|
||||||
flush_work(&smc->connect_work);
|
|
||||||
|
|
||||||
if (sk->sk_state == SMC_LISTEN)
|
|
||||||
/* smc_close_non_accepted() is called and acquires
|
|
||||||
* sock lock for child sockets again
|
|
||||||
*/
|
|
||||||
lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
|
|
||||||
else
|
|
||||||
lock_sock(sk);
|
|
||||||
|
|
||||||
if (!smc->use_fallback) {
|
if (!smc->use_fallback) {
|
||||||
rc = smc_close_active(smc);
|
rc = smc_close_active(smc);
|
||||||
sock_set_flag(sk, SOCK_DEAD);
|
sock_set_flag(sk, SOCK_DEAD);
|
||||||
@ -174,6 +155,35 @@ static int smc_release(struct socket *sock)
|
|||||||
smc_conn_free(&smc->conn);
|
smc_conn_free(&smc->conn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int smc_release(struct socket *sock)
|
||||||
|
{
|
||||||
|
struct sock *sk = sock->sk;
|
||||||
|
struct smc_sock *smc;
|
||||||
|
int rc = 0;
|
||||||
|
|
||||||
|
if (!sk)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
smc = smc_sk(sk);
|
||||||
|
|
||||||
|
/* cleanup for a dangling non-blocking connect */
|
||||||
|
if (smc->connect_nonblock && sk->sk_state == SMC_INIT)
|
||||||
|
tcp_abort(smc->clcsock->sk, ECONNABORTED);
|
||||||
|
flush_work(&smc->connect_work);
|
||||||
|
|
||||||
|
if (sk->sk_state == SMC_LISTEN)
|
||||||
|
/* smc_close_non_accepted() is called and acquires
|
||||||
|
* sock lock for child sockets again
|
||||||
|
*/
|
||||||
|
lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
|
||||||
|
else
|
||||||
|
lock_sock(sk);
|
||||||
|
|
||||||
|
rc = __smc_release(smc);
|
||||||
|
|
||||||
/* detach socket */
|
/* detach socket */
|
||||||
sock_orphan(sk);
|
sock_orphan(sk);
|
||||||
sock->sk = NULL;
|
sock->sk = NULL;
|
||||||
@ -964,26 +974,7 @@ void smc_close_non_accepted(struct sock *sk)
|
|||||||
if (!sk->sk_lingertime)
|
if (!sk->sk_lingertime)
|
||||||
/* wait for peer closing */
|
/* wait for peer closing */
|
||||||
sk->sk_lingertime = SMC_MAX_STREAM_WAIT_TIMEOUT;
|
sk->sk_lingertime = SMC_MAX_STREAM_WAIT_TIMEOUT;
|
||||||
if (!smc->use_fallback) {
|
__smc_release(smc);
|
||||||
smc_close_active(smc);
|
|
||||||
sock_set_flag(sk, SOCK_DEAD);
|
|
||||||
sk->sk_shutdown |= SHUTDOWN_MASK;
|
|
||||||
}
|
|
||||||
sk->sk_prot->unhash(sk);
|
|
||||||
if (smc->clcsock) {
|
|
||||||
struct socket *tcp;
|
|
||||||
|
|
||||||
tcp = smc->clcsock;
|
|
||||||
smc->clcsock = NULL;
|
|
||||||
sock_release(tcp);
|
|
||||||
}
|
|
||||||
if (smc->use_fallback) {
|
|
||||||
sock_put(sk); /* passive closing */
|
|
||||||
sk->sk_state = SMC_CLOSED;
|
|
||||||
} else {
|
|
||||||
if (sk->sk_state == SMC_CLOSED)
|
|
||||||
smc_conn_free(&smc->conn);
|
|
||||||
}
|
|
||||||
release_sock(sk);
|
release_sock(sk);
|
||||||
sock_put(sk); /* final sock_put */
|
sock_put(sk); /* final sock_put */
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user