From: Eldad Zinger Date: Thu, 24 Jun 2010 15:27:46 +0000 (+0300) Subject: sdp: Fix for deadlock between sdp_connect and sdp_destroy_work. X-Git-Tag: v4.1.12-92~264^2~5^2~154 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=1b3cdb5e4a109b6475cdc459254490b2bf912e8a;p=users%2Fjedix%2Flinux-maple.git sdp: Fix for deadlock between sdp_connect and sdp_destroy_work. Signed-off-by: Eldad Zinger --- diff --git a/drivers/infiniband/ulp/sdp/sdp_main.c b/drivers/infiniband/ulp/sdp/sdp_main.c index 65b57125637f0..9acff248984eb 100644 --- a/drivers/infiniband/ulp/sdp/sdp_main.c +++ b/drivers/infiniband/ulp/sdp/sdp_main.c @@ -768,7 +768,14 @@ static int sdp_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) .sin_addr.s_addr = inet_sk(sk)->saddr, }; int rc; + release_sock(sk); flush_workqueue(sdp_wq); + lock_sock(sk); + if (sk->sk_err) { + sdp_warn(sk, "Can't connect, socket marked with error: %d\n", + sk->sk_err); + return -sk->sk_err; + } if (addr_len < sizeof(struct sockaddr_in)) return -EINVAL;