diff options
author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2012-06-26 12:34:05 -0400 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2012-06-28 17:20:46 -0400 |
commit | 3994ee6fbf5185b3183f4585432226e786bfe86c (patch) | |
tree | afa20b81b7cddd6fce09da05f7df7edca5e411a4 /net/sunrpc/xdr.c | |
parent | bd00f84bc57f42df32c728e86329a5c30f221657 (diff) |
SUNRPC: Clean up xdr_read_pages
Move the page alignment code into a separate helper.
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'net/sunrpc/xdr.c')
-rw-r--r-- | net/sunrpc/xdr.c | 40 |
1 files changed, 26 insertions, 14 deletions
diff --git a/net/sunrpc/xdr.c b/net/sunrpc/xdr.c index 834d4da9cdb0..03603f332fe6 100644 --- a/net/sunrpc/xdr.c +++ b/net/sunrpc/xdr.c | |||
@@ -747,25 +747,12 @@ __be32 * xdr_inline_decode(struct xdr_stream *xdr, size_t nbytes) | |||
747 | } | 747 | } |
748 | EXPORT_SYMBOL_GPL(xdr_inline_decode); | 748 | EXPORT_SYMBOL_GPL(xdr_inline_decode); |
749 | 749 | ||
750 | /** | 750 | static unsigned int xdr_align_pages(struct xdr_stream *xdr, unsigned int len) |
751 | * xdr_read_pages - Ensure page-based XDR data to decode is aligned at current pointer position | ||
752 | * @xdr: pointer to xdr_stream struct | ||
753 | * @len: number of bytes of page data | ||
754 | * | ||
755 | * Moves data beyond the current pointer position from the XDR head[] buffer | ||
756 | * into the page list. Any data that lies beyond current position + "len" | ||
757 | * bytes is moved into the XDR tail[]. | ||
758 | * | ||
759 | * Returns the number of XDR encoded bytes now contained in the pages | ||
760 | */ | ||
761 | unsigned int xdr_read_pages(struct xdr_stream *xdr, unsigned int len) | ||
762 | { | 751 | { |
763 | struct xdr_buf *buf = xdr->buf; | 752 | struct xdr_buf *buf = xdr->buf; |
764 | struct kvec *iov; | 753 | struct kvec *iov; |
765 | unsigned int nwords = XDR_QUADLEN(len); | 754 | unsigned int nwords = XDR_QUADLEN(len); |
766 | unsigned int cur = xdr_stream_pos(xdr); | 755 | unsigned int cur = xdr_stream_pos(xdr); |
767 | unsigned int end; | ||
768 | unsigned int padding; | ||
769 | 756 | ||
770 | if (xdr->nwords == 0) | 757 | if (xdr->nwords == 0) |
771 | return 0; | 758 | return 0; |
@@ -782,7 +769,32 @@ unsigned int xdr_read_pages(struct xdr_stream *xdr, unsigned int len) | |||
782 | if (buf->page_len > len) | 769 | if (buf->page_len > len) |
783 | xdr_shrink_pagelen(buf, buf->page_len - len); | 770 | xdr_shrink_pagelen(buf, buf->page_len - len); |
784 | xdr->nwords = XDR_QUADLEN(buf->len - cur); | 771 | xdr->nwords = XDR_QUADLEN(buf->len - cur); |
772 | return len; | ||
773 | } | ||
774 | |||
775 | /** | ||
776 | * xdr_read_pages - Ensure page-based XDR data to decode is aligned at current pointer position | ||
777 | * @xdr: pointer to xdr_stream struct | ||
778 | * @len: number of bytes of page data | ||
779 | * | ||
780 | * Moves data beyond the current pointer position from the XDR head[] buffer | ||
781 | * into the page list. Any data that lies beyond current position + "len" | ||
782 | * bytes is moved into the XDR tail[]. | ||
783 | * | ||
784 | * Returns the number of XDR encoded bytes now contained in the pages | ||
785 | */ | ||
786 | unsigned int xdr_read_pages(struct xdr_stream *xdr, unsigned int len) | ||
787 | { | ||
788 | struct xdr_buf *buf = xdr->buf; | ||
789 | struct kvec *iov; | ||
790 | unsigned int nwords; | ||
791 | unsigned int end; | ||
792 | unsigned int padding; | ||
785 | 793 | ||
794 | len = xdr_align_pages(xdr, len); | ||
795 | if (len == 0) | ||
796 | return 0; | ||
797 | nwords = XDR_QUADLEN(len); | ||
786 | padding = (nwords << 2) - len; | 798 | padding = (nwords << 2) - len; |
787 | xdr->iov = iov = buf->tail; | 799 | xdr->iov = iov = buf->tail; |
788 | /* Compute remaining message length. */ | 800 | /* Compute remaining message length. */ |