forked from mirrors/linux
		
	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:
		
							parent
							
								
									582737f990
								
							
						
					
					
						commit
						39f41f367b
					
				
					 1 changed files with 32 additions and 41 deletions
				
			
		| 
						 | 
				
			
			@ -123,30 +123,11 @@ struct proto 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 smc_sock *smc;
 | 
			
		||||
	struct sock *sk = &smc->sk;
 | 
			
		||||
	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) {
 | 
			
		||||
		rc = smc_close_active(smc);
 | 
			
		||||
		sock_set_flag(sk, SOCK_DEAD);
 | 
			
		||||
| 
						 | 
				
			
			@ -174,6 +155,35 @@ static int smc_release(struct socket *sock)
 | 
			
		|||
			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 */
 | 
			
		||||
	sock_orphan(sk);
 | 
			
		||||
	sock->sk = NULL;
 | 
			
		||||
| 
						 | 
				
			
			@ -964,26 +974,7 @@ void smc_close_non_accepted(struct sock *sk)
 | 
			
		|||
	if (!sk->sk_lingertime)
 | 
			
		||||
		/* wait for peer closing */
 | 
			
		||||
		sk->sk_lingertime = SMC_MAX_STREAM_WAIT_TIMEOUT;
 | 
			
		||||
	if (!smc->use_fallback) {
 | 
			
		||||
		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);
 | 
			
		||||
	}
 | 
			
		||||
	__smc_release(smc);
 | 
			
		||||
	release_sock(sk);
 | 
			
		||||
	sock_put(sk); /* final sock_put */
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue