Message ID | 20211125061932.74874-3-tonylu@linux.alibaba.com (mailing list archive) |
---|---|
State | Not Applicable |
Headers | show |
Series | Fixes for clcsock shutdown behaviors | expand |
On 25/11/2021 07:19, Tony Lu wrote: > diff --git a/net/smc/af_smc.c b/net/smc/af_smc.c > index 4b62c925a13e..7b04cb4d15f4 100644 > --- a/net/smc/af_smc.c > +++ b/net/smc/af_smc.c > @@ -2373,6 +2373,7 @@ static int smc_shutdown(struct socket *sock, int how) > struct smc_sock *smc; > int rc = -EINVAL; > int rc1 = 0; > + int old_state; Reverse Christmas tree formatting, please. > > smc = smc_sk(sk); > > @@ -2398,7 +2399,12 @@ static int smc_shutdown(struct socket *sock, int how) > } > switch (how) { > case SHUT_RDWR: /* shutdown in both directions */ > + old_state = sk->sk_state; > rc = smc_close_active(smc); > + if (old_state == SMC_ACTIVE && > + sk->sk_state == SMC_PEERCLOSEWAIT1) > + goto out_no_shutdown; > + I would prefer a new "bool do_shutdown" instead of a goto for this skip of the shutdown. What do you think? > break; > case SHUT_WR: > rc = smc_close_shutdown_write(smc); > @@ -2410,6 +2416,8 @@ static int smc_shutdown(struct socket *sock, int how) > } > if (smc->clcsock) > rc1 = kernel_sock_shutdown(smc->clcsock, how); > + > +out_no_shutdown: > /* map sock_shutdown_cmd constants to sk_shutdown value range */ > sk->sk_shutdown |= how + 1; > >
On Thu, Nov 25, 2021 at 12:02:06PM +0100, Karsten Graul wrote: > On 25/11/2021 07:19, Tony Lu wrote: > > diff --git a/net/smc/af_smc.c b/net/smc/af_smc.c > > index 4b62c925a13e..7b04cb4d15f4 100644 > > --- a/net/smc/af_smc.c > > +++ b/net/smc/af_smc.c > > @@ -2373,6 +2373,7 @@ static int smc_shutdown(struct socket *sock, int how) > > struct smc_sock *smc; > > int rc = -EINVAL; > > int rc1 = 0; > > + int old_state; > > Reverse Christmas tree formatting, please. Sorry for that, I will fix it in the next patch. > > > > > smc = smc_sk(sk); > > > > @@ -2398,7 +2399,12 @@ static int smc_shutdown(struct socket *sock, int how) > > } > > switch (how) { > > case SHUT_RDWR: /* shutdown in both directions */ > > + old_state = sk->sk_state; > > rc = smc_close_active(smc); > > + if (old_state == SMC_ACTIVE && > > + sk->sk_state == SMC_PEERCLOSEWAIT1) > > + goto out_no_shutdown; > > + > > I would prefer a new "bool do_shutdown" instead of a goto for this skip > of the shutdown. What do you think? I agree with you, I'd like bool condition rather than goto, which will disturb the continuity of reading code. I will fix it soon. Thank you. Tony Lu > > > break; > > case SHUT_WR: > > rc = smc_close_shutdown_write(smc); > > @@ -2410,6 +2416,8 @@ static int smc_shutdown(struct socket *sock, int how) > > } > > if (smc->clcsock) > > rc1 = kernel_sock_shutdown(smc->clcsock, how); > > + > > +out_no_shutdown: > > /* map sock_shutdown_cmd constants to sk_shutdown value range */ > > sk->sk_shutdown |= how + 1; > > > > > > -- > Karsten
diff --git a/net/smc/af_smc.c b/net/smc/af_smc.c index 4b62c925a13e..7b04cb4d15f4 100644 --- a/net/smc/af_smc.c +++ b/net/smc/af_smc.c @@ -2373,6 +2373,7 @@ static int smc_shutdown(struct socket *sock, int how) struct smc_sock *smc; int rc = -EINVAL; int rc1 = 0; + int old_state; smc = smc_sk(sk); @@ -2398,7 +2399,12 @@ static int smc_shutdown(struct socket *sock, int how) } switch (how) { case SHUT_RDWR: /* shutdown in both directions */ + old_state = sk->sk_state; rc = smc_close_active(smc); + if (old_state == SMC_ACTIVE && + sk->sk_state == SMC_PEERCLOSEWAIT1) + goto out_no_shutdown; + break; case SHUT_WR: rc = smc_close_shutdown_write(smc); @@ -2410,6 +2416,8 @@ static int smc_shutdown(struct socket *sock, int how) } if (smc->clcsock) rc1 = kernel_sock_shutdown(smc->clcsock, how); + +out_no_shutdown: /* map sock_shutdown_cmd constants to sk_shutdown value range */ sk->sk_shutdown |= how + 1;