diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/sunrpc/svcsock.c | 13 |
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 | ||