summaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
Diffstat (limited to 'net')
-rw-r--r--net/sunrpc/svcsock.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c
index bc3ef0734f2f..a11ddc8975c3 100644
--- a/net/sunrpc/svcsock.c
+++ b/net/sunrpc/svcsock.c
@@ -763,8 +763,10 @@ static void svc_tcp_state_change(struct sock *sk)
763 printk("svc: socket %p: no user data\n", sk); 763 printk("svc: socket %p: no user data\n", sk);
764 else { 764 else {
765 svsk->sk_ostate(sk); 765 svsk->sk_ostate(sk);
766 set_bit(XPT_CLOSE, &svsk->sk_xprt.xpt_flags); 766 if (sk->sk_state != TCP_ESTABLISHED) {
767 svc_xprt_enqueue(&svsk->sk_xprt); 767 set_bit(XPT_CLOSE, &svsk->sk_xprt.xpt_flags);
768 svc_xprt_enqueue(&svsk->sk_xprt);
769 }
768 } 770 }
769} 771}
770 772
@@ -1290,8 +1292,13 @@ static void svc_tcp_init(struct svc_sock *svsk, struct svc_serv *serv)
1290 tcp_sk(sk)->nonagle |= TCP_NAGLE_OFF; 1292 tcp_sk(sk)->nonagle |= TCP_NAGLE_OFF;
1291 1293
1292 set_bit(XPT_DATA, &svsk->sk_xprt.xpt_flags); 1294 set_bit(XPT_DATA, &svsk->sk_xprt.xpt_flags);
1293 if (sk->sk_state != TCP_ESTABLISHED) 1295 switch (sk->sk_state) {
1296 case TCP_SYN_RECV:
1297 case TCP_ESTABLISHED:
1298 break;
1299 default:
1294 set_bit(XPT_CLOSE, &svsk->sk_xprt.xpt_flags); 1300 set_bit(XPT_CLOSE, &svsk->sk_xprt.xpt_flags);
1301 }
1295 } 1302 }
1296} 1303}
1297 1304