aboutsummaryrefslogtreecommitdiffstats
path: root/net/smc/smc_close.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/smc/smc_close.c')
-rw-r--r--net/smc/smc_close.c27
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
187again: 187again:
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)
411int smc_close_shutdown_write(struct smc_sock *smc) 413int 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
422again: 425again:
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);