diff options
Diffstat (limited to 'net/smc/smc_close.c')
-rw-r--r-- | net/smc/smc_close.c | 25 |
1 files changed, 3 insertions, 22 deletions
diff --git a/net/smc/smc_close.c b/net/smc/smc_close.c index e339c0186dcf..fa41d9881741 100644 --- a/net/smc/smc_close.c +++ b/net/smc/smc_close.c | |||
@@ -30,27 +30,6 @@ static void smc_close_cleanup_listen(struct sock *parent) | |||
30 | smc_close_non_accepted(sk); | 30 | smc_close_non_accepted(sk); |
31 | } | 31 | } |
32 | 32 | ||
33 | static void smc_close_wait_listen_clcsock(struct smc_sock *smc) | ||
34 | { | ||
35 | DEFINE_WAIT_FUNC(wait, woken_wake_function); | ||
36 | struct sock *sk = &smc->sk; | ||
37 | signed long timeout; | ||
38 | |||
39 | timeout = SMC_CLOSE_WAIT_LISTEN_CLCSOCK_TIME; | ||
40 | add_wait_queue(sk_sleep(sk), &wait); | ||
41 | do { | ||
42 | release_sock(sk); | ||
43 | if (smc->clcsock) | ||
44 | timeout = wait_woken(&wait, TASK_UNINTERRUPTIBLE, | ||
45 | timeout); | ||
46 | sched_annotate_sleep(); | ||
47 | lock_sock(sk); | ||
48 | if (!smc->clcsock) | ||
49 | break; | ||
50 | } while (timeout); | ||
51 | remove_wait_queue(sk_sleep(sk), &wait); | ||
52 | } | ||
53 | |||
54 | /* wait for sndbuf data being transmitted */ | 33 | /* wait for sndbuf data being transmitted */ |
55 | static void smc_close_stream_wait(struct smc_sock *smc, long timeout) | 34 | static void smc_close_stream_wait(struct smc_sock *smc, long timeout) |
56 | { | 35 | { |
@@ -204,9 +183,11 @@ again: | |||
204 | rc = kernel_sock_shutdown(smc->clcsock, SHUT_RDWR); | 183 | rc = kernel_sock_shutdown(smc->clcsock, SHUT_RDWR); |
205 | /* wake up kernel_accept of smc_tcp_listen_worker */ | 184 | /* wake up kernel_accept of smc_tcp_listen_worker */ |
206 | smc->clcsock->sk->sk_data_ready(smc->clcsock->sk); | 185 | smc->clcsock->sk->sk_data_ready(smc->clcsock->sk); |
207 | smc_close_wait_listen_clcsock(smc); | ||
208 | } | 186 | } |
209 | smc_close_cleanup_listen(sk); | 187 | smc_close_cleanup_listen(sk); |
188 | release_sock(sk); | ||
189 | flush_work(&smc->tcp_listen_work); | ||
190 | lock_sock(sk); | ||
210 | break; | 191 | break; |
211 | case SMC_ACTIVE: | 192 | case SMC_ACTIVE: |
212 | smc_close_stream_wait(smc, timeout); | 193 | smc_close_stream_wait(smc, timeout); |