svcrpc: complete svsk processing on cb receive failure
authorJ. Bruce Fields <bfields@redhat.com>
Sat, 9 Apr 2011 14:03:10 +0000 (10:03 -0400)
committerJ. Bruce Fields <bfields@redhat.com>
Sun, 10 Apr 2011 14:47:46 +0000 (10:47 -0400)
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>
net/sunrpc/svcsock.c

index 213dea8..af04f77 100644 (file)
@@ -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)