diff options
author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2010-08-29 12:13:16 -0400 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2010-08-29 12:13:16 -0400 |
commit | cf187c2d7ec763cdd459fe43933a5cc4f5f48e1b (patch) | |
tree | 05e87ee64fb3243b7fedb66c9a64caa6adad2c07 /net/sunrpc/xdr.c | |
parent | 42d6d8ab51ca04afcb8a64759076da624cdb71e8 (diff) | |
download | op-kernel-dev-cf187c2d7ec763cdd459fe43933a5cc4f5f48e1b.zip op-kernel-dev-cf187c2d7ec763cdd459fe43933a5cc4f5f48e1b.tar.gz |
SUNRPC: Don't truncate tail data unnecessarily in xdr_shrink_pagelen
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>
Diffstat (limited to 'net/sunrpc/xdr.c')
-rw-r--r-- | net/sunrpc/xdr.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/net/sunrpc/xdr.c b/net/sunrpc/xdr.c index 3317db3..3bbef7f 100644 --- a/net/sunrpc/xdr.c +++ b/net/sunrpc/xdr.c @@ -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; |