1313#include <linux/sched/signal.h>
1414
1515#include <net/sock.h>
16+ #include <net/tcp.h>
1617
1718#include "smc.h"
1819#include "smc_tx.h"
@@ -66,7 +67,8 @@ static void smc_close_stream_wait(struct smc_sock *smc, long timeout)
6667 rc = sk_wait_event (sk , & timeout ,
6768 !smc_tx_prepared_sends (& smc -> conn ) ||
6869 sk -> sk_err == ECONNABORTED ||
69- sk -> sk_err == ECONNRESET ,
70+ sk -> sk_err == ECONNRESET ||
71+ smc -> conn .killed ,
7072 & wait );
7173 if (rc )
7274 break ;
@@ -95,11 +97,13 @@ static int smc_close_final(struct smc_connection *conn)
9597 conn -> local_tx_ctrl .conn_state_flags .peer_conn_abort = 1 ;
9698 else
9799 conn -> local_tx_ctrl .conn_state_flags .peer_conn_closed = 1 ;
100+ if (conn -> killed )
101+ return - EPIPE ;
98102
99103 return smc_cdc_get_slot_and_msg_send (conn );
100104}
101105
102- static int smc_close_abort (struct smc_connection * conn )
106+ int smc_close_abort (struct smc_connection * conn )
103107{
104108 conn -> local_tx_ctrl .conn_state_flags .peer_conn_abort = 1 ;
105109
@@ -109,16 +113,15 @@ static int smc_close_abort(struct smc_connection *conn)
109113/* terminate smc socket abnormally - active abort
110114 * link group is terminated, i.e. RDMA communication no longer possible
111115 */
112- static void smc_close_active_abort (struct smc_sock * smc )
116+ void smc_close_active_abort (struct smc_sock * smc )
113117{
114118 struct sock * sk = & smc -> sk ;
119+ bool release_clcsock = false;
115120
116121 if (sk -> sk_state != SMC_INIT && smc -> clcsock && smc -> clcsock -> sk ) {
117122 sk -> sk_err = ECONNABORTED ;
118- if (smc -> clcsock && smc -> clcsock -> sk ) {
119- smc -> clcsock -> sk -> sk_err = ECONNABORTED ;
120- smc -> clcsock -> sk -> sk_state_change (smc -> clcsock -> sk );
121- }
123+ if (smc -> clcsock && smc -> clcsock -> sk )
124+ tcp_abort (smc -> clcsock -> sk , ECONNABORTED );
122125 }
123126 switch (sk -> sk_state ) {
124127 case SMC_ACTIVE :
@@ -135,11 +138,14 @@ static void smc_close_active_abort(struct smc_sock *smc)
135138 cancel_delayed_work_sync (& smc -> conn .tx_work );
136139 lock_sock (sk );
137140 sk -> sk_state = SMC_CLOSED ;
141+ sock_put (sk ); /* postponed passive closing */
138142 break ;
139143 case SMC_PEERCLOSEWAIT1 :
140144 case SMC_PEERCLOSEWAIT2 :
141145 case SMC_PEERFINCLOSEWAIT :
142146 sk -> sk_state = SMC_CLOSED ;
147+ smc_conn_free (& smc -> conn );
148+ release_clcsock = true;
143149 sock_put (sk ); /* passive closing */
144150 break ;
145151 case SMC_PROCESSABORT :
@@ -154,6 +160,12 @@ static void smc_close_active_abort(struct smc_sock *smc)
154160
155161 sock_set_flag (sk , SOCK_DEAD );
156162 sk -> sk_state_change (sk );
163+
164+ if (release_clcsock ) {
165+ release_sock (sk );
166+ smc_clcsock_release (smc );
167+ lock_sock (sk );
168+ }
157169}
158170
159171static inline bool smc_close_sent_any_close (struct smc_connection * conn )
@@ -326,12 +338,6 @@ static void smc_close_passive_work(struct work_struct *work)
326338 lock_sock (sk );
327339 old_state = sk -> sk_state ;
328340
329- if (!conn -> alert_token_local ) {
330- /* abnormal termination */
331- smc_close_active_abort (smc );
332- goto wakeup ;
333- }
334-
335341 rxflags = & conn -> local_rx_ctrl .conn_state_flags ;
336342 if (rxflags -> peer_conn_abort ) {
337343 /* peer has not received all data */
0 commit comments