diff options
Diffstat (limited to 'net/smc/smc_close.c')
-rw-r--r-- | net/smc/smc_close.c | 27 |
1 files changed, 15 insertions, 12 deletions
diff --git a/net/smc/smc_close.c b/net/smc/smc_close.c index 3c2e166b5d22..f0d16fb825f7 100644 --- a/net/smc/smc_close.c +++ b/net/smc/smc_close.c | |||
@@ -174,15 +174,15 @@ int smc_close_active(struct smc_sock *smc) | |||
174 | { | 174 | { |
175 | struct smc_cdc_conn_state_flags *txflags = | 175 | struct smc_cdc_conn_state_flags *txflags = |
176 | &smc->conn.local_tx_ctrl.conn_state_flags; | 176 | &smc->conn.local_tx_ctrl.conn_state_flags; |
177 | long timeout = SMC_MAX_STREAM_WAIT_TIMEOUT; | ||
178 | struct smc_connection *conn = &smc->conn; | 177 | struct smc_connection *conn = &smc->conn; |
179 | struct sock *sk = &smc->sk; | 178 | struct sock *sk = &smc->sk; |
180 | int old_state; | 179 | int old_state; |
180 | long timeout; | ||
181 | int rc = 0; | 181 | int rc = 0; |
182 | 182 | ||
183 | if (sock_flag(sk, SOCK_LINGER) && | 183 | timeout = current->flags & PF_EXITING ? |
184 | !(current->flags & PF_EXITING)) | 184 | 0 : sock_flag(sk, SOCK_LINGER) ? |
185 | timeout = sk->sk_lingertime; | 185 | sk->sk_lingertime : SMC_MAX_STREAM_WAIT_TIMEOUT; |
186 | 186 | ||
187 | again: | 187 | again: |
188 | old_state = sk->sk_state; | 188 | old_state = sk->sk_state; |
@@ -208,7 +208,7 @@ again: | |||
208 | case SMC_ACTIVE: | 208 | case SMC_ACTIVE: |
209 | smc_close_stream_wait(smc, timeout); | 209 | smc_close_stream_wait(smc, timeout); |
210 | release_sock(sk); | 210 | release_sock(sk); |
211 | cancel_work_sync(&conn->tx_work); | 211 | cancel_delayed_work_sync(&conn->tx_work); |
212 | lock_sock(sk); | 212 | lock_sock(sk); |
213 | if (sk->sk_state == SMC_ACTIVE) { | 213 | if (sk->sk_state == SMC_ACTIVE) { |
214 | /* send close request */ | 214 | /* send close request */ |
@@ -234,7 +234,7 @@ again: | |||
234 | if (!smc_cdc_rxed_any_close(conn)) | 234 | if (!smc_cdc_rxed_any_close(conn)) |
235 | smc_close_stream_wait(smc, timeout); | 235 | smc_close_stream_wait(smc, timeout); |
236 | release_sock(sk); | 236 | release_sock(sk); |
237 | cancel_work_sync(&conn->tx_work); | 237 | cancel_delayed_work_sync(&conn->tx_work); |
238 | lock_sock(sk); | 238 | lock_sock(sk); |
239 | if (sk->sk_err != ECONNABORTED) { | 239 | if (sk->sk_err != ECONNABORTED) { |
240 | /* confirm close from peer */ | 240 | /* confirm close from peer */ |
@@ -263,7 +263,9 @@ again: | |||
263 | /* peer sending PeerConnectionClosed will cause transition */ | 263 | /* peer sending PeerConnectionClosed will cause transition */ |
264 | break; | 264 | break; |
265 | case SMC_PROCESSABORT: | 265 | case SMC_PROCESSABORT: |
266 | cancel_work_sync(&conn->tx_work); | 266 | release_sock(sk); |
267 | cancel_delayed_work_sync(&conn->tx_work); | ||
268 | lock_sock(sk); | ||
267 | smc_close_abort(conn); | 269 | smc_close_abort(conn); |
268 | sk->sk_state = SMC_CLOSED; | 270 | sk->sk_state = SMC_CLOSED; |
269 | smc_close_wait_tx_pends(smc); | 271 | smc_close_wait_tx_pends(smc); |
@@ -411,13 +413,14 @@ void smc_close_sock_put_work(struct work_struct *work) | |||
411 | int smc_close_shutdown_write(struct smc_sock *smc) | 413 | int smc_close_shutdown_write(struct smc_sock *smc) |
412 | { | 414 | { |
413 | struct smc_connection *conn = &smc->conn; | 415 | struct smc_connection *conn = &smc->conn; |
414 | long timeout = SMC_MAX_STREAM_WAIT_TIMEOUT; | ||
415 | struct sock *sk = &smc->sk; | 416 | struct sock *sk = &smc->sk; |
416 | int old_state; | 417 | int old_state; |
418 | long timeout; | ||
417 | int rc = 0; | 419 | int rc = 0; |
418 | 420 | ||
419 | if (sock_flag(sk, SOCK_LINGER)) | 421 | timeout = current->flags & PF_EXITING ? |
420 | timeout = sk->sk_lingertime; | 422 | 0 : sock_flag(sk, SOCK_LINGER) ? |
423 | sk->sk_lingertime : SMC_MAX_STREAM_WAIT_TIMEOUT; | ||
421 | 424 | ||
422 | again: | 425 | again: |
423 | old_state = sk->sk_state; | 426 | old_state = sk->sk_state; |
@@ -425,7 +428,7 @@ again: | |||
425 | case SMC_ACTIVE: | 428 | case SMC_ACTIVE: |
426 | smc_close_stream_wait(smc, timeout); | 429 | smc_close_stream_wait(smc, timeout); |
427 | release_sock(sk); | 430 | release_sock(sk); |
428 | cancel_work_sync(&conn->tx_work); | 431 | cancel_delayed_work_sync(&conn->tx_work); |
429 | lock_sock(sk); | 432 | lock_sock(sk); |
430 | /* send close wr request */ | 433 | /* send close wr request */ |
431 | rc = smc_close_wr(conn); | 434 | rc = smc_close_wr(conn); |
@@ -439,7 +442,7 @@ again: | |||
439 | if (!smc_cdc_rxed_any_close(conn)) | 442 | if (!smc_cdc_rxed_any_close(conn)) |
440 | smc_close_stream_wait(smc, timeout); | 443 | smc_close_stream_wait(smc, timeout); |
441 | release_sock(sk); | 444 | release_sock(sk); |
442 | cancel_work_sync(&conn->tx_work); | 445 | cancel_delayed_work_sync(&conn->tx_work); |
443 | lock_sock(sk); | 446 | lock_sock(sk); |
444 | /* confirm close from peer */ | 447 | /* confirm close from peer */ |
445 | rc = smc_close_wr(conn); | 448 | rc = smc_close_wr(conn); |