SUNRPC: Cleanup xs_tcp_read_common()
authorTrond Myklebust <trond.myklebust@primarydata.com>
Sun, 13 Aug 2017 06:13:45 +0000 (02:13 -0400)
committerTrond Myklebust <trond.myklebust@primarydata.com>
Wed, 16 Aug 2017 19:10:17 +0000 (15:10 -0400)
Simplify the code to avoid a full copy of the struct xdr_skb_reader.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
net/sunrpc/xprtsock.c

index e8f44fc76754e1708f83f1be908ddf0c51c10d0b..a344bea15fc73e1ec80a154fa84796d976031609 100644 (file)
@@ -1287,25 +1287,12 @@ static inline void xs_tcp_read_common(struct rpc_xprt *xprt,
        }
 
        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
@@ -1325,6 +1312,10 @@ static inline void xs_tcp_read_common(struct rpc_xprt *xprt,
                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, "