@@ -165,9 +165,9 @@ int smc_close_active(struct smc_sock *smc)
165
165
0 : sock_flag (sk , SOCK_LINGER ) ?
166
166
sk -> sk_lingertime : SMC_MAX_STREAM_WAIT_TIMEOUT ;
167
167
168
- again :
169
168
old_state = sk -> sk_state ;
170
- switch (old_state ) {
169
+ again :
170
+ switch (sk -> sk_state ) {
171
171
case SMC_INIT :
172
172
sk -> sk_state = SMC_CLOSED ;
173
173
if (smc -> smc_listen_work .func )
@@ -194,6 +194,8 @@ int smc_close_active(struct smc_sock *smc)
194
194
if (sk -> sk_state == SMC_ACTIVE ) {
195
195
/* send close request */
196
196
rc = smc_close_final (conn );
197
+ if (rc )
198
+ break ;
197
199
sk -> sk_state = SMC_PEERCLOSEWAIT1 ;
198
200
} else {
199
201
/* peer event has changed the state */
@@ -206,6 +208,8 @@ int smc_close_active(struct smc_sock *smc)
206
208
!smc_close_sent_any_close (conn )) {
207
209
/* just shutdown wr done, send close request */
208
210
rc = smc_close_final (conn );
211
+ if (rc )
212
+ break ;
209
213
}
210
214
sk -> sk_state = SMC_CLOSED ;
211
215
break ;
@@ -216,12 +220,13 @@ int smc_close_active(struct smc_sock *smc)
216
220
release_sock (sk );
217
221
cancel_delayed_work_sync (& conn -> tx_work );
218
222
lock_sock (sk );
219
- if (sk -> sk_err != ECONNABORTED ) {
220
- /* confirm close from peer */
221
- rc = smc_close_final (conn );
222
- if (rc )
223
- break ;
224
- }
223
+ if (sk -> sk_state != SMC_APPCLOSEWAIT1 &&
224
+ sk -> sk_state != SMC_APPCLOSEWAIT2 )
225
+ goto again ;
226
+ /* confirm close from peer */
227
+ rc = smc_close_final (conn );
228
+ if (rc )
229
+ break ;
225
230
if (smc_cdc_rxed_any_close (conn ))
226
231
/* peer has closed the socket already */
227
232
sk -> sk_state = SMC_CLOSED ;
@@ -235,6 +240,8 @@ int smc_close_active(struct smc_sock *smc)
235
240
!smc_close_sent_any_close (conn )) {
236
241
/* just shutdown wr done, send close request */
237
242
rc = smc_close_final (conn );
243
+ if (rc )
244
+ break ;
238
245
}
239
246
/* peer sending PeerConnectionClosed will cause transition */
240
247
break ;
@@ -401,20 +408,21 @@ int smc_close_shutdown_write(struct smc_sock *smc)
401
408
0 : sock_flag (sk , SOCK_LINGER ) ?
402
409
sk -> sk_lingertime : SMC_MAX_STREAM_WAIT_TIMEOUT ;
403
410
404
- again :
405
411
old_state = sk -> sk_state ;
406
- switch (old_state ) {
412
+ again :
413
+ switch (sk -> sk_state ) {
407
414
case SMC_ACTIVE :
408
415
smc_close_stream_wait (smc , timeout );
409
416
release_sock (sk );
410
417
cancel_delayed_work_sync (& conn -> tx_work );
411
418
lock_sock (sk );
419
+ if (sk -> sk_state != SMC_ACTIVE )
420
+ goto again ;
412
421
/* send close wr request */
413
422
rc = smc_close_wr (conn );
414
- if (sk -> sk_state == SMC_ACTIVE )
415
- sk -> sk_state = SMC_PEERCLOSEWAIT1 ;
416
- else
417
- goto again ;
423
+ if (rc )
424
+ break ;
425
+ sk -> sk_state = SMC_PEERCLOSEWAIT1 ;
418
426
break ;
419
427
case SMC_APPCLOSEWAIT1 :
420
428
/* passive close */
@@ -423,8 +431,12 @@ int smc_close_shutdown_write(struct smc_sock *smc)
423
431
release_sock (sk );
424
432
cancel_delayed_work_sync (& conn -> tx_work );
425
433
lock_sock (sk );
434
+ if (sk -> sk_state != SMC_APPCLOSEWAIT1 )
435
+ goto again ;
426
436
/* confirm close from peer */
427
437
rc = smc_close_wr (conn );
438
+ if (rc )
439
+ break ;
428
440
sk -> sk_state = SMC_APPCLOSEWAIT2 ;
429
441
break ;
430
442
case SMC_APPCLOSEWAIT2 :
0 commit comments