diff options
| author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2006-10-17 13:47:24 -0400 |
|---|---|---|
| committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2006-12-06 10:46:32 -0500 |
| commit | 4e3e43ad14c574281034a27420abf1993694ac11 (patch) | |
| tree | f6c3e157581bcc7ac35ecace15d5018eb9675404 | |
| parent | 1e78957e0a8f882df6a3660b62f9aae441f54891 (diff) | |
SUNRPC: Add __(read|write)_bytes_from_xdr_buf
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
| -rw-r--r-- | net/sunrpc/xdr.c | 66 |
1 files changed, 37 insertions, 29 deletions
diff --git a/net/sunrpc/xdr.c b/net/sunrpc/xdr.c index b474edbab3f1..ebdff6beba31 100644 --- a/net/sunrpc/xdr.c +++ b/net/sunrpc/xdr.c | |||
| @@ -688,56 +688,64 @@ xdr_buf_subsegment(struct xdr_buf *buf, struct xdr_buf *subbuf, | |||
| 688 | return 0; | 688 | return 0; |
| 689 | } | 689 | } |
| 690 | 690 | ||
| 691 | /* obj is assumed to point to allocated memory of size at least len: */ | 691 | static void __read_bytes_from_xdr_buf(struct xdr_buf *subbuf, void *obj, unsigned int len) |
| 692 | int | ||
| 693 | read_bytes_from_xdr_buf(struct xdr_buf *buf, unsigned int base, void *obj, unsigned int len) | ||
| 694 | { | 692 | { |
| 695 | struct xdr_buf subbuf; | ||
| 696 | unsigned int this_len; | 693 | unsigned int this_len; |
| 697 | int status; | ||
| 698 | 694 | ||
| 699 | status = xdr_buf_subsegment(buf, &subbuf, base, len); | 695 | this_len = min_t(unsigned int, len, subbuf->head[0].iov_len); |
| 700 | if (status) | 696 | memcpy(obj, subbuf->head[0].iov_base, this_len); |
| 701 | goto out; | ||
| 702 | this_len = min_t(unsigned int, len, subbuf.head[0].iov_len); | ||
| 703 | memcpy(obj, subbuf.head[0].iov_base, this_len); | ||
| 704 | len -= this_len; | 697 | len -= this_len; |
| 705 | obj += this_len; | 698 | obj += this_len; |
| 706 | this_len = min_t(unsigned int, len, subbuf.page_len); | 699 | this_len = min_t(unsigned int, len, subbuf->page_len); |
| 707 | if (this_len) | 700 | if (this_len) |
| 708 | _copy_from_pages(obj, subbuf.pages, subbuf.page_base, this_len); | 701 | _copy_from_pages(obj, subbuf->pages, subbuf->page_base, this_len); |
| 709 | len -= this_len; | 702 | len -= this_len; |
| 710 | obj += this_len; | 703 | obj += this_len; |
| 711 | this_len = min_t(unsigned int, len, subbuf.tail[0].iov_len); | 704 | this_len = min_t(unsigned int, len, subbuf->tail[0].iov_len); |
| 712 | memcpy(obj, subbuf.tail[0].iov_base, this_len); | 705 | memcpy(obj, subbuf->tail[0].iov_base, this_len); |
| 713 | out: | ||
| 714 | return status; | ||
| 715 | } | 706 | } |
| 716 | 707 | ||
| 717 | /* obj is assumed to point to allocated memory of size at least len: */ | 708 | /* obj is assumed to point to allocated memory of size at least len: */ |
| 718 | int | 709 | int read_bytes_from_xdr_buf(struct xdr_buf *buf, unsigned int base, void *obj, unsigned int len) |
| 719 | write_bytes_to_xdr_buf(struct xdr_buf *buf, unsigned int base, void *obj, unsigned int len) | ||
| 720 | { | 710 | { |
| 721 | struct xdr_buf subbuf; | 711 | struct xdr_buf subbuf; |
| 722 | unsigned int this_len; | ||
| 723 | int status; | 712 | int status; |
| 724 | 713 | ||
| 725 | status = xdr_buf_subsegment(buf, &subbuf, base, len); | 714 | status = xdr_buf_subsegment(buf, &subbuf, base, len); |
| 726 | if (status) | 715 | if (status != 0) |
| 727 | goto out; | 716 | return status; |
| 728 | this_len = min_t(unsigned int, len, subbuf.head[0].iov_len); | 717 | __read_bytes_from_xdr_buf(&subbuf, obj, len); |
| 729 | memcpy(subbuf.head[0].iov_base, obj, this_len); | 718 | return 0; |
| 719 | } | ||
| 720 | |||
| 721 | static void __write_bytes_to_xdr_buf(struct xdr_buf *subbuf, void *obj, unsigned int len) | ||
| 722 | { | ||
| 723 | unsigned int this_len; | ||
| 724 | |||
| 725 | this_len = min_t(unsigned int, len, subbuf->head[0].iov_len); | ||
| 726 | memcpy(subbuf->head[0].iov_base, obj, this_len); | ||
| 730 | len -= this_len; | 727 | len -= this_len; |
| 731 | obj += this_len; | 728 | obj += this_len; |
| 732 | this_len = min_t(unsigned int, len, subbuf.page_len); | 729 | this_len = min_t(unsigned int, len, subbuf->page_len); |
| 733 | if (this_len) | 730 | if (this_len) |
| 734 | _copy_to_pages(subbuf.pages, subbuf.page_base, obj, this_len); | 731 | _copy_to_pages(subbuf->pages, subbuf->page_base, obj, this_len); |
| 735 | len -= this_len; | 732 | len -= this_len; |
| 736 | obj += this_len; | 733 | obj += this_len; |
| 737 | this_len = min_t(unsigned int, len, subbuf.tail[0].iov_len); | 734 | this_len = min_t(unsigned int, len, subbuf->tail[0].iov_len); |
| 738 | memcpy(subbuf.tail[0].iov_base, obj, this_len); | 735 | memcpy(subbuf->tail[0].iov_base, obj, this_len); |
| 739 | out: | 736 | } |
| 740 | return status; | 737 | |
| 738 | /* obj is assumed to point to allocated memory of size at least len: */ | ||
| 739 | int write_bytes_to_xdr_buf(struct xdr_buf *buf, unsigned int base, void *obj, unsigned int len) | ||
| 740 | { | ||
| 741 | struct xdr_buf subbuf; | ||
| 742 | int status; | ||
| 743 | |||
| 744 | status = xdr_buf_subsegment(buf, &subbuf, base, len); | ||
| 745 | if (status != 0) | ||
| 746 | return status; | ||
| 747 | __write_bytes_to_xdr_buf(&subbuf, obj, len); | ||
| 748 | return 0; | ||
| 741 | } | 749 | } |
| 742 | 750 | ||
| 743 | int | 751 | int |
