diff options
author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2008-02-26 00:40:51 -0500 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2008-02-29 02:26:27 -0500 |
commit | ff2d7db848f8db7cade39e55f78f86d77e0de01a (patch) | |
tree | fb40ecbcad821ec6e31f4324c0483e13242f36c7 /net | |
parent | f5fb7b06e4e4ab18326f067f4317b2016ce18af2 (diff) |
SUNRPC: Ensure that we read all available tcp data
Don't stop until we run out of data, or we hit an error.
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'net')
-rw-r--r-- | net/sunrpc/xprtsock.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c index 30e7ac243a90..8bd3b0f73ac0 100644 --- a/net/sunrpc/xprtsock.c +++ b/net/sunrpc/xprtsock.c | |||
@@ -1073,6 +1073,7 @@ static void xs_tcp_data_ready(struct sock *sk, int bytes) | |||
1073 | { | 1073 | { |
1074 | struct rpc_xprt *xprt; | 1074 | struct rpc_xprt *xprt; |
1075 | read_descriptor_t rd_desc; | 1075 | read_descriptor_t rd_desc; |
1076 | int read; | ||
1076 | 1077 | ||
1077 | dprintk("RPC: xs_tcp_data_ready...\n"); | 1078 | dprintk("RPC: xs_tcp_data_ready...\n"); |
1078 | 1079 | ||
@@ -1084,8 +1085,10 @@ static void xs_tcp_data_ready(struct sock *sk, int bytes) | |||
1084 | 1085 | ||
1085 | /* We use rd_desc to pass struct xprt to xs_tcp_data_recv */ | 1086 | /* We use rd_desc to pass struct xprt to xs_tcp_data_recv */ |
1086 | rd_desc.arg.data = xprt; | 1087 | rd_desc.arg.data = xprt; |
1087 | rd_desc.count = 65536; | 1088 | do { |
1088 | tcp_read_sock(sk, &rd_desc, xs_tcp_data_recv); | 1089 | rd_desc.count = 65536; |
1090 | read = tcp_read_sock(sk, &rd_desc, xs_tcp_data_recv); | ||
1091 | } while (read > 0); | ||
1089 | out: | 1092 | out: |
1090 | read_unlock(&sk->sk_callback_lock); | 1093 | read_unlock(&sk->sk_callback_lock); |
1091 | } | 1094 | } |