diff options
author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2008-02-25 21:40:51 -0800 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2008-02-28 23:26:27 -0800 |
commit | ff2d7db848f8db7cade39e55f78f86d77e0de01a (patch) | |
tree | fb40ecbcad821ec6e31f4324c0483e13242f36c7 /net/sunrpc/xprtsock.c | |
parent | f5fb7b06e4e4ab18326f067f4317b2016ce18af2 (diff) | |
download | op-kernel-dev-ff2d7db848f8db7cade39e55f78f86d77e0de01a.zip op-kernel-dev-ff2d7db848f8db7cade39e55f78f86d77e0de01a.tar.gz |
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/sunrpc/xprtsock.c')
-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 30e7ac2..8bd3b0f 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) { struct rpc_xprt *xprt; read_descriptor_t rd_desc; + int read; dprintk("RPC: xs_tcp_data_ready...\n"); @@ -1084,8 +1085,10 @@ static void xs_tcp_data_ready(struct sock *sk, int bytes) /* We use rd_desc to pass struct xprt to xs_tcp_data_recv */ rd_desc.arg.data = xprt; - rd_desc.count = 65536; - tcp_read_sock(sk, &rd_desc, xs_tcp_data_recv); + do { + rd_desc.count = 65536; + read = tcp_read_sock(sk, &rd_desc, xs_tcp_data_recv); + } while (read > 0); out: read_unlock(&sk->sk_callback_lock); } |