diff --git a/net/smc/af_smc.c b/net/smc/af_smc.c index 9d4e302e194da953ef501d3fd3b61082df25b6d5..15d34699c0d589f823e500ad7678376bfaaaf10f 100644 --- a/net/smc/af_smc.c +++ b/net/smc/af_smc.c @@ -2263,11 +2263,12 @@ static void smc_listen_out(struct smc_sock *new_smc) SMC_NEGOTIATION_SMC); release_sock(newsmcsk); /* lock in smc_listen_work() */ + lock_sock_nested(&lsmc->sk, SINGLE_DEPTH_NESTING); if (smc_sk_state(&lsmc->sk) == SMC_LISTEN) { - lock_sock_nested(&lsmc->sk, SINGLE_DEPTH_NESTING); smc_accept_enqueue(&lsmc->sk, newsmcsk); release_sock(&lsmc->sk); } else { /* no longer listening */ + release_sock(&lsmc->sk); smc_close_non_accepted(newsmcsk); }