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,
638638
639639 smc_accept_unlink (new_sk );
640640 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 );
642643 continue ;
643644 }
644645 if (new_sock )
@@ -658,20 +659,23 @@ void smc_close_non_accepted(struct sock *sk)
658659 if (!sk -> sk_lingertime )
659660 /* wait for peer closing */
660661 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 {
662665 smc_close_active (smc );
666+ sock_set_flag (sk , SOCK_DEAD );
667+ sk -> sk_shutdown |= SHUTDOWN_MASK ;
668+ }
663669 if (smc -> clcsock ) {
664670 struct socket * tcp ;
665671
666672 tcp = smc -> clcsock ;
667673 smc -> clcsock = NULL ;
668674 sock_release (tcp );
669675 }
670- sock_set_flag (sk , SOCK_DEAD );
671- sk -> sk_shutdown |= SHUTDOWN_MASK ;
672676 if (smc -> use_fallback ) {
673677 schedule_delayed_work (& smc -> sock_put_work , TCP_TIMEWAIT_LEN );
674- } else {
678+ } else if ( sk -> sk_state == SMC_CLOSED ) {
675679 smc_conn_free (& smc -> conn );
676680 schedule_delayed_work (& smc -> sock_put_work ,
677681 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)
191191 sk -> sk_state = SMC_CLOSED ;
192192 if (smc -> smc_listen_work .func )
193193 cancel_work_sync (& smc -> smc_listen_work );
194- sock_put (sk );
195194 break ;
196195 case SMC_LISTEN :
197196 sk -> sk_state = SMC_CLOSED ;
You can’t perform that action at this time.
0 commit comments