Merge branch 'linus' into locking/urgent, to pick up fixes
[GitHub/moto-9609/android_kernel_motorola_exynos9610.git] / net / sunrpc / svcsock.c
index bc3ef0734f2f7903c723c216f73d3660e8c981f0..57625f64efd56edaa65fe0940aaa7979fe65ef87 100644 (file)
@@ -763,8 +763,10 @@ static void svc_tcp_state_change(struct sock *sk)
                printk("svc: socket %p: no user data\n", sk);
        else {
                svsk->sk_ostate(sk);
-               set_bit(XPT_CLOSE, &svsk->sk_xprt.xpt_flags);
-               svc_xprt_enqueue(&svsk->sk_xprt);
+               if (sk->sk_state != TCP_ESTABLISHED) {
+                       set_bit(XPT_CLOSE, &svsk->sk_xprt.xpt_flags);
+                       svc_xprt_enqueue(&svsk->sk_xprt);
+               }
        }
 }
 
@@ -1290,8 +1292,13 @@ static void svc_tcp_init(struct svc_sock *svsk, struct svc_serv *serv)
                tcp_sk(sk)->nonagle |= TCP_NAGLE_OFF;
 
                set_bit(XPT_DATA, &svsk->sk_xprt.xpt_flags);
-               if (sk->sk_state != TCP_ESTABLISHED)
+               switch (sk->sk_state) {
+               case TCP_SYN_RECV:
+               case TCP_ESTABLISHED:
+                       break;
+               default:
                        set_bit(XPT_CLOSE, &svsk->sk_xprt.xpt_flags);
+               }
        }
 }
 
@@ -1353,8 +1360,11 @@ static struct svc_sock *svc_setup_socket(struct svc_serv *serv,
        else
                svc_tcp_init(svsk, serv);
 
-       dprintk("svc: svc_setup_socket created %p (inet %p)\n",
-                               svsk, svsk->sk_sk);
+       dprintk("svc: svc_setup_socket created %p (inet %p), "
+                       "listen %d close %d\n",
+                       svsk, svsk->sk_sk,
+                       test_bit(XPT_LISTENER, &svsk->sk_xprt.xpt_flags),
+                       test_bit(XPT_CLOSE, &svsk->sk_xprt.xpt_flags));
 
        return svsk;
 }