SUNRPC: Don't truncate tail data unnecessarily in xdr_shrink_pagelen
authorTrond Myklebust <Trond.Myklebust@netapp.com>
Sun, 29 Aug 2010 16:13:16 +0000 (12:13 -0400)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Sun, 29 Aug 2010 16:13:16 +0000 (12:13 -0400)
If we have unused buffer space, then we should make use of that rather
than unnecessarily truncating the message.

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
net/sunrpc/xdr.c

index 3317db3cb102973407417d505ddfaedb2cf4a6bd..3bbef7f5f8260179de529471cadb1a970e0d0fb0 100644 (file)
@@ -396,12 +396,21 @@ xdr_shrink_pagelen(struct xdr_buf *buf, size_t len)
        struct kvec *tail;
        size_t copy;
        unsigned int pglen = buf->page_len;
+       unsigned int tailbuf_len;
 
        tail = buf->tail;
        BUG_ON (len > pglen);
 
+       tailbuf_len = buf->buflen - buf->head->iov_len - buf->page_len;
+
        /* Shift the tail first */
-       if (tail->iov_len != 0) {
+       if (tailbuf_len != 0) {
+               unsigned int free_space = tailbuf_len - tail->iov_len;
+
+               if (len < free_space)
+                       free_space = len;
+               tail->iov_len += free_space;
+
                copy = len;
                if (tail->iov_len > len) {
                        char *p = (char *)tail->iov_base + len;