diff options
Diffstat (limited to 'net/mptcp/subflow.c')
| -rw-r--r-- | net/mptcp/subflow.c | 33 | 
1 files changed, 7 insertions, 26 deletions
diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c index c7d49fb6e7bd..07dd23d0fe04 100644 --- a/net/mptcp/subflow.c +++ b/net/mptcp/subflow.c @@ -602,30 +602,6 @@ static bool subflow_hmac_valid(const struct request_sock *req,  	return !crypto_memneq(hmac, mp_opt->hmac, MPTCPOPT_HMAC_LEN);  } -static void mptcp_sock_destruct(struct sock *sk) -{ -	/* if new mptcp socket isn't accepted, it is free'd -	 * from the tcp listener sockets request queue, linked -	 * from req->sk.  The tcp socket is released. -	 * This calls the ULP release function which will -	 * also remove the mptcp socket, via -	 * sock_put(ctx->conn). -	 * -	 * Problem is that the mptcp socket will be in -	 * ESTABLISHED state and will not have the SOCK_DEAD flag. -	 * Both result in warnings from inet_sock_destruct. -	 */ -	if ((1 << sk->sk_state) & (TCPF_ESTABLISHED | TCPF_CLOSE_WAIT)) { -		sk->sk_state = TCP_CLOSE; -		WARN_ON_ONCE(sk->sk_socket); -		sock_orphan(sk); -	} - -	/* We don't need to clear msk->subflow, as it's still NULL at this point */ -	mptcp_destroy_common(mptcp_sk(sk), 0); -	inet_sock_destruct(sk); -} -  static void mptcp_force_close(struct sock *sk)  {  	/* the msk is not yet exposed to user-space */ @@ -768,7 +744,6 @@ create_child:  			/* new mpc subflow takes ownership of the newly  			 * created mptcp socket  			 */ -			new_msk->sk_destruct = mptcp_sock_destruct;  			mptcp_sk(new_msk)->setsockopt_seq = ctx->setsockopt_seq;  			mptcp_pm_new_connection(mptcp_sk(new_msk), child, 1);  			mptcp_token_accept(subflow_req, mptcp_sk(new_msk)); @@ -1763,13 +1738,19 @@ void mptcp_subflow_queue_clean(struct sock *listener_ssk)  	for (msk = head; msk; msk = next) {  		struct sock *sk = (struct sock *)msk; -		bool slow; +		bool slow, do_cancel_work; +		sock_hold(sk);  		slow = lock_sock_fast_nested(sk);  		next = msk->dl_next;  		msk->first = NULL;  		msk->dl_next = NULL; + +		do_cancel_work = __mptcp_close(sk, 0);  		unlock_sock_fast(sk, slow); +		if (do_cancel_work) +			mptcp_cancel_work(sk); +		sock_put(sk);  	}  	/* we are still under the listener msk socket lock */  |