diff options
author | J. Bruce Fields <bfields@redhat.com> | 2011-04-09 10:03:10 -0400 |
---|---|---|
committer | J. Bruce Fields <bfields@redhat.com> | 2011-04-10 10:47:46 -0400 |
commit | 8985ef0b8af895c3b85a8c1b7108e0169fcbd20b (patch) | |
tree | 0e71ed0ca7c913b435a291cb975cd5f4f58809b8 /net/sunrpc/svcsock.c | |
parent | d6c558379abc27241c75b8c30fc8c94b82537d5e (diff) | |
download | op-kernel-dev-8985ef0b8af895c3b85a8c1b7108e0169fcbd20b.zip op-kernel-dev-8985ef0b8af895c3b85a8c1b7108e0169fcbd20b.tar.gz |
svcrpc: complete svsk processing on cb receive failure
Currently when there's some failure to receive a callback (because we
couldn't find a matching xid, for example), we exit svc_recv with
sk_tcplen still set but without any pages saved with the socket. This
will cause a crash later in svc_tcp_restore_pages.
Instead, make sure we reset that tcp information whether the callback
received failed or succeeded.
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Diffstat (limited to 'net/sunrpc/svcsock.c')
-rw-r--r-- | net/sunrpc/svcsock.c | 7 |
1 files changed, 3 insertions, 4 deletions
diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c index 213dea8..af04f77 100644 --- a/net/sunrpc/svcsock.c +++ b/net/sunrpc/svcsock.c @@ -1143,11 +1143,8 @@ static int svc_tcp_recvfrom(struct svc_rqst *rqstp) p = (__be32 *)rqstp->rq_arg.head[0].iov_base; calldir = p[1]; - if (calldir) { + if (calldir) len = receive_cb_reply(svsk, rqstp); - if (len < 0) - goto error; - } /* Reset TCP read info */ svsk->sk_reclen = 0; @@ -1156,6 +1153,8 @@ static int svc_tcp_recvfrom(struct svc_rqst *rqstp) if (svc_recv_available(svsk) > sizeof(rpc_fraghdr)) set_bit(XPT_DATA, &svsk->sk_xprt.xpt_flags); + if (len < 0) + goto error; svc_xprt_copy_addrs(rqstp, &svsk->sk_xprt); if (serv->sv_stats) |