]> Pileus Git - ~andy/linux/blobdiff - net/sunrpc/xdr.c
Merge tag 'sound-3.7' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound
[~andy/linux] / net / sunrpc / xdr.c
index 0afba1b4b65606437d141cb21a64e6d00f3855f4..08f50afd5f2a1d9dedc53ed1157d94be7e1e964d 100644 (file)
@@ -730,19 +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)
+       if (nwords > xdr->nwords) {
+               nwords = xdr->nwords;
+               len = nwords << 2;
+       }
+       if (buf->page_len <= len)
+               len = buf->page_len;
+       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);
+               xdr->nwords = XDR_QUADLEN(buf->len - cur);
+       }
        return len;
 }