}
 
        len = desc->count;
-       if (len > transport->tcp_reclen - transport->tcp_offset) {
-               struct xdr_skb_reader my_desc;
-
-               len = transport->tcp_reclen - transport->tcp_offset;
-               memcpy(&my_desc, desc, sizeof(my_desc));
-               my_desc.count = len;
-               r = xdr_partial_copy_from_skb(rcvbuf, transport->tcp_copied,
-                                         &my_desc, xdr_skb_read_bits);
-               desc->count -= r;
-               desc->offset += r;
-       } else
-               r = xdr_partial_copy_from_skb(rcvbuf, transport->tcp_copied,
+       if (len > transport->tcp_reclen - transport->tcp_offset)
+               desc->count = transport->tcp_reclen - transport->tcp_offset;
+       r = xdr_partial_copy_from_skb(rcvbuf, transport->tcp_copied,
                                          desc, xdr_skb_read_bits);
 
-       if (r > 0) {
-               transport->tcp_copied += r;
-               transport->tcp_offset += r;
-       }
-       if (r != len) {
+       if (desc->count) {
                /* Error when copying to the receive buffer,
                 * usually because we weren't able to allocate
                 * additional buffer pages. All we can do now
                return;
        }
 
+       transport->tcp_copied += r;
+       transport->tcp_offset += r;
+       desc->count = len - r;
+
        dprintk("RPC:       XID %08x read %zd bytes\n",
                        ntohl(transport->tcp_xid), r);
        dprintk("RPC:       xprt = %p, tcp_copied = %lu, tcp_offset = %u, "