From: Amiram Perlmutter Date: Thu, 18 Jan 2007 16:50:30 +0000 (+0200) Subject: IB/sdp: handle shutdown recv on listening socket X-Git-Tag: v4.1.12-92~264^2~5^2~366 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=e7d583c2ac96d627e78b88644c158ebb9b17ba9c;p=users%2Fjedix%2Flinux-maple.git IB/sdp: handle shutdown recv on listening socket Signed-off-by: Amiram Perlmutter --- diff --git a/drivers/infiniband/ulp/sdp/sdp_main.c b/drivers/infiniband/ulp/sdp/sdp_main.c index ef8e2eb737fa3..87ae56bf569ce 100644 --- a/drivers/infiniband/ulp/sdp/sdp_main.c +++ b/drivers/infiniband/ulp/sdp/sdp_main.c @@ -490,10 +490,33 @@ static int sdp_disconnect(struct sock *sk, int flags) { struct sdp_sock *ssk = sdp_sk(sk); int rc = 0; + int old_state = sk->sk_state; + struct sdp_sock *s, *t; + struct rdma_cm_id *id = ssk->id; + sdp_dbg(sk, "%s\n", __func__); if (ssk->id) rc = rdma_disconnect(ssk->id); - return rc; + + if (old_state != TCP_LISTEN) + return rc; + + sdp_set_state(sk, TCP_CLOSE); + ssk->id = NULL; + release_sock(sk); /* release socket since locking semantics is parent + inside child */ + rdma_destroy_id(ssk->id); + + list_for_each_entry_safe(s, t, &ssk->backlog_queue, backlog_queue) { + sk_common_release(&s->isk.sk); + } + list_for_each_entry_safe(s, t, &ssk->accept_queue, accept_queue) { + sk_common_release(&s->isk.sk); + } + + lock_sock(sk); + + return 0; } /* Like inet_csk_wait_for_connect */