From: Ursula Braun <ubr...@linux.ibm.com>

There are common steps when releasing an accepted or unaccepted socket.
Move this code into a common routine.

Signed-off-by: Ursula Braun <ubr...@linux.ibm.com>
Signed-off-by: Karsten Graul <kgr...@linux.ibm.com>
---
 net/smc/af_smc.c | 73 +++++++++++++++++++++---------------------------
 1 file changed, 32 insertions(+), 41 deletions(-)

diff --git a/net/smc/af_smc.c b/net/smc/af_smc.c
index 7621ec2f539c..302e355f2ebc 100644
--- a/net/smc/af_smc.c
+++ b/net/smc/af_smc.c
@@ -123,30 +123,11 @@ struct proto smc_proto6 = {
 };
 EXPORT_SYMBOL_GPL(smc_proto6);
 
-static int smc_release(struct socket *sock)
+static int __smc_release(struct smc_sock *smc)
 {
-       struct sock *sk = sock->sk;
-       struct smc_sock *smc;
+       struct sock *sk = &smc->sk;
        int rc = 0;
 
-       if (!sk)
-               goto out;
-
-       smc = smc_sk(sk);
-
-       /* cleanup for a dangling non-blocking connect */
-       if (smc->connect_nonblock && sk->sk_state == SMC_INIT)
-               tcp_abort(smc->clcsock->sk, ECONNABORTED);
-       flush_work(&smc->connect_work);
-
-       if (sk->sk_state == SMC_LISTEN)
-               /* smc_close_non_accepted() is called and acquires
-                * sock lock for child sockets again
-                */
-               lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
-       else
-               lock_sock(sk);
-
        if (!smc->use_fallback) {
                rc = smc_close_active(smc);
                sock_set_flag(sk, SOCK_DEAD);
@@ -174,6 +155,35 @@ static int smc_release(struct socket *sock)
                        smc_conn_free(&smc->conn);
        }
 
+       return rc;
+}
+
+static int smc_release(struct socket *sock)
+{
+       struct sock *sk = sock->sk;
+       struct smc_sock *smc;
+       int rc = 0;
+
+       if (!sk)
+               goto out;
+
+       smc = smc_sk(sk);
+
+       /* cleanup for a dangling non-blocking connect */
+       if (smc->connect_nonblock && sk->sk_state == SMC_INIT)
+               tcp_abort(smc->clcsock->sk, ECONNABORTED);
+       flush_work(&smc->connect_work);
+
+       if (sk->sk_state == SMC_LISTEN)
+               /* smc_close_non_accepted() is called and acquires
+                * sock lock for child sockets again
+                */
+               lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
+       else
+               lock_sock(sk);
+
+       rc = __smc_release(smc);
+
        /* detach socket */
        sock_orphan(sk);
        sock->sk = NULL;
@@ -964,26 +974,7 @@ void smc_close_non_accepted(struct sock *sk)
        if (!sk->sk_lingertime)
                /* wait for peer closing */
                sk->sk_lingertime = SMC_MAX_STREAM_WAIT_TIMEOUT;
-       if (!smc->use_fallback) {
-               smc_close_active(smc);
-               sock_set_flag(sk, SOCK_DEAD);
-               sk->sk_shutdown |= SHUTDOWN_MASK;
-       }
-       sk->sk_prot->unhash(sk);
-       if (smc->clcsock) {
-               struct socket *tcp;
-
-               tcp = smc->clcsock;
-               smc->clcsock = NULL;
-               sock_release(tcp);
-       }
-       if (smc->use_fallback) {
-               sock_put(sk); /* passive closing */
-               sk->sk_state = SMC_CLOSED;
-       } else {
-               if (sk->sk_state == SMC_CLOSED)
-                       smc_conn_free(&smc->conn);
-       }
+       __smc_release(smc);
        release_sock(sk);
        sock_put(sk); /* final sock_put */
 }
-- 
2.21.0

Reply via email to