From 4fc4126b8056cb4b9ecdceca1801dc37a7053dd9 Mon Sep 17 00:00:00 2001 From: Trond Myklebust Date: Thu, 2 Aug 2012 13:21:43 -0400 Subject: [PATCH] --- yaml --- r: 333117 b: refs/heads/master c: a11a2bf4de5679fa0b63474c7d39bea2dac7d061 h: refs/heads/master i: 333115: cf2541c7d5b78500cb14ca56b8978f3930e216b4 v: v3 --- [refs] | 2 +- trunk/net/sunrpc/xdr.c | 23 +++++++++++++---------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/[refs] b/[refs] index e0ab8030f6f5..02fc3892164f 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 13fe4ba1b64c099843c75b4f0633ad30a4526637 +refs/heads/master: a11a2bf4de5679fa0b63474c7d39bea2dac7d061 diff --git a/trunk/net/sunrpc/xdr.c b/trunk/net/sunrpc/xdr.c index fbbd1c475b43..08f50afd5f2a 100644 --- a/trunk/net/sunrpc/xdr.c +++ b/trunk/net/sunrpc/xdr.c @@ -730,21 +730,24 @@ static unsigned int xdr_align_pages(struct xdr_stream *xdr, unsigned int len) if (xdr->nwords == 0) return 0; - if (nwords > xdr->nwords) { - nwords = xdr->nwords; - len = nwords << 2; - } /* Realign pages to current pointer position */ iov = buf->head; - if (iov->iov_len > cur) + if (iov->iov_len > cur) { xdr_shrink_bufhead(buf, iov->iov_len - cur); + xdr->nwords = XDR_QUADLEN(buf->len - cur); + } - /* Truncate page data and move it into the tail */ - if (buf->page_len > len) - xdr_shrink_pagelen(buf, buf->page_len - len); - else + if (nwords > xdr->nwords) { + nwords = xdr->nwords; + len = nwords << 2; + } + if (buf->page_len <= len) len = buf->page_len; - xdr->nwords = XDR_QUADLEN(buf->len - cur); + else if (nwords < xdr->nwords) { + /* Truncate page data and move it into the tail */ + xdr_shrink_pagelen(buf, buf->page_len - len); + xdr->nwords = XDR_QUADLEN(buf->len - cur); + } return len; }