File tree Expand file tree Collapse file tree 2 files changed +9
-6
lines changed Expand file tree Collapse file tree 2 files changed +9
-6
lines changed Original file line number Diff line number Diff line change @@ -638,7 +638,8 @@ struct sock *smc_accept_dequeue(struct sock *parent,
638
638
639
639
smc_accept_unlink (new_sk );
640
640
if (new_sk -> sk_state == SMC_CLOSED ) {
641
- /* tbd in follow-on patch: close this sock */
641
+ new_sk -> sk_prot -> unhash (new_sk );
642
+ sock_put (new_sk );
642
643
continue ;
643
644
}
644
645
if (new_sock )
@@ -658,20 +659,23 @@ void smc_close_non_accepted(struct sock *sk)
658
659
if (!sk -> sk_lingertime )
659
660
/* wait for peer closing */
660
661
sk -> sk_lingertime = SMC_MAX_STREAM_WAIT_TIMEOUT ;
661
- if (!smc -> use_fallback )
662
+ if (smc -> use_fallback ) {
663
+ sk -> sk_state = SMC_CLOSED ;
664
+ } else {
662
665
smc_close_active (smc );
666
+ sock_set_flag (sk , SOCK_DEAD );
667
+ sk -> sk_shutdown |= SHUTDOWN_MASK ;
668
+ }
663
669
if (smc -> clcsock ) {
664
670
struct socket * tcp ;
665
671
666
672
tcp = smc -> clcsock ;
667
673
smc -> clcsock = NULL ;
668
674
sock_release (tcp );
669
675
}
670
- sock_set_flag (sk , SOCK_DEAD );
671
- sk -> sk_shutdown |= SHUTDOWN_MASK ;
672
676
if (smc -> use_fallback ) {
673
677
schedule_delayed_work (& smc -> sock_put_work , TCP_TIMEWAIT_LEN );
674
- } else {
678
+ } else if ( sk -> sk_state == SMC_CLOSED ) {
675
679
smc_conn_free (& smc -> conn );
676
680
schedule_delayed_work (& smc -> sock_put_work ,
677
681
SMC_CLOSE_SOCK_PUT_DELAY );
Original file line number Diff line number Diff line change @@ -191,7 +191,6 @@ int smc_close_active(struct smc_sock *smc)
191
191
sk -> sk_state = SMC_CLOSED ;
192
192
if (smc -> smc_listen_work .func )
193
193
cancel_work_sync (& smc -> smc_listen_work );
194
- sock_put (sk );
195
194
break ;
196
195
case SMC_LISTEN :
197
196
sk -> sk_state = SMC_CLOSED ;
You can’t perform that action at this time.
0 commit comments