Loading net/mptcp/pm_netlink.c +8 −1 Original line number Diff line number Diff line Loading @@ -426,15 +426,22 @@ void mptcp_pm_nl_rm_addr_received(struct mptcp_sock *msk) struct sock *ssk = mptcp_subflow_tcp_sock(subflow); int how = RCV_SHUTDOWN | SEND_SHUTDOWN; long timeout = 0; bool removed = false; if (msk->pm.rm_id != subflow->remote_id) continue; spin_unlock_bh(&msk->pm.lock); mptcp_subflow_shutdown(sk, ssk, how); removed |= subflow->request_join; __mptcp_close_ssk(sk, ssk, subflow, timeout); spin_lock_bh(&msk->pm.lock); if(removed && msk->pm.rm_id && !WARN_ON_ONCE(msk->pm.add_addr_accepted == 0)) /* Note: if the subflow has been closed before, this * add_addr_accepted counter will not be decremented. */ msk->pm.add_addr_accepted--; msk->pm.subflows--; WRITE_ONCE(msk->pm.accept_addr, true); Loading Loading
net/mptcp/pm_netlink.c +8 −1 Original line number Diff line number Diff line Loading @@ -426,15 +426,22 @@ void mptcp_pm_nl_rm_addr_received(struct mptcp_sock *msk) struct sock *ssk = mptcp_subflow_tcp_sock(subflow); int how = RCV_SHUTDOWN | SEND_SHUTDOWN; long timeout = 0; bool removed = false; if (msk->pm.rm_id != subflow->remote_id) continue; spin_unlock_bh(&msk->pm.lock); mptcp_subflow_shutdown(sk, ssk, how); removed |= subflow->request_join; __mptcp_close_ssk(sk, ssk, subflow, timeout); spin_lock_bh(&msk->pm.lock); if(removed && msk->pm.rm_id && !WARN_ON_ONCE(msk->pm.add_addr_accepted == 0)) /* Note: if the subflow has been closed before, this * add_addr_accepted counter will not be decremented. */ msk->pm.add_addr_accepted--; msk->pm.subflows--; WRITE_ONCE(msk->pm.accept_addr, true); Loading