diff options
author | David S. Miller <davem@davemloft.net> | 2021-11-23 11:42:24 +0000 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2021-11-23 11:42:24 +0000 |
commit | 5789d04b77126752ab1d70c7f7fc00d65401cb1d (patch) | |
tree | 53ebd6421a293b12831d3682f13b2a5451c86843 | |
parent | 1c743127cc54b112b155f434756bd4b5fa565a99 (diff) | |
parent | 606a63c9783a32a45bd2ef0eee393711d75b3284 (diff) |
Merge branch 'smc-fixes'
Tony Lu says:
====================
smc: Fixes for closing process and minor cleanup
Patch 1 is a minor cleanup for local struct sock variables.
Patch 2 ensures the active closing side enters TIME_WAIT.
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | net/smc/smc_close.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/net/smc/smc_close.c b/net/smc/smc_close.c index 0f9ffba07d26..3715d2f5ad55 100644 --- a/net/smc/smc_close.c +++ b/net/smc/smc_close.c @@ -228,6 +228,12 @@ again: /* send close request */ rc = smc_close_final(conn); sk->sk_state = SMC_PEERCLOSEWAIT1; + + /* actively shutdown clcsock before peer close it, + * prevent peer from entering TIME_WAIT state. + */ + if (smc->clcsock && smc->clcsock->sk) + rc = kernel_sock_shutdown(smc->clcsock, SHUT_RDWR); } else { /* peer event has changed the state */ goto again; @@ -354,9 +360,9 @@ static void smc_close_passive_work(struct work_struct *work) if (rxflags->peer_conn_abort) { /* peer has not received all data */ smc_close_passive_abort_received(smc); - release_sock(&smc->sk); + release_sock(sk); cancel_delayed_work_sync(&conn->tx_work); - lock_sock(&smc->sk); + lock_sock(sk); goto wakeup; } |