Lines Matching refs:xdr

132 xdr_inline_pages(struct xdr_buf *xdr, unsigned int offset,  in xdr_inline_pages()  argument
135 struct kvec *head = xdr->head; in xdr_inline_pages()
136 struct kvec *tail = xdr->tail; in xdr_inline_pages()
142 xdr->pages = pages; in xdr_inline_pages()
143 xdr->page_base = base; in xdr_inline_pages()
144 xdr->page_len = len; in xdr_inline_pages()
149 xdr->buflen += len; in xdr_inline_pages()
441 unsigned int xdr_stream_pos(const struct xdr_stream *xdr) in xdr_stream_pos() argument
443 return (unsigned int)(XDR_QUADLEN(xdr->buf->len) - xdr->nwords) << 2; in xdr_stream_pos()
460 void xdr_init_encode(struct xdr_stream *xdr, struct xdr_buf *buf, __be32 *p) in xdr_init_encode() argument
465 xdr_set_scratch_buffer(xdr, NULL, 0); in xdr_init_encode()
467 xdr->buf = buf; in xdr_init_encode()
468 xdr->iov = iov; in xdr_init_encode()
469 xdr->p = (__be32 *)((char *)iov->iov_base + iov->iov_len); in xdr_init_encode()
470 xdr->end = (__be32 *)((char *)iov->iov_base + scratch_len); in xdr_init_encode()
473 if (p != xdr->p && p != NULL) { in xdr_init_encode()
476 BUG_ON(p < xdr->p || p > xdr->end); in xdr_init_encode()
477 len = (char *)p - (char *)xdr->p; in xdr_init_encode()
478 xdr->p = p; in xdr_init_encode()
498 void xdr_commit_encode(struct xdr_stream *xdr) in xdr_commit_encode() argument
500 int shift = xdr->scratch.iov_len; in xdr_commit_encode()
505 page = page_address(*xdr->page_ptr); in xdr_commit_encode()
506 memcpy(xdr->scratch.iov_base, page, shift); in xdr_commit_encode()
507 memmove(page, page + shift, (void *)xdr->p - page); in xdr_commit_encode()
508 xdr->scratch.iov_len = 0; in xdr_commit_encode()
512 static __be32 *xdr_get_next_encode_buffer(struct xdr_stream *xdr, in xdr_get_next_encode_buffer() argument
521 if (xdr->buf->len + nbytes > xdr->buf->buflen) in xdr_get_next_encode_buffer()
523 frag1bytes = (xdr->end - xdr->p) << 2; in xdr_get_next_encode_buffer()
525 if (xdr->iov) in xdr_get_next_encode_buffer()
526 xdr->iov->iov_len += frag1bytes; in xdr_get_next_encode_buffer()
528 xdr->buf->page_len += frag1bytes; in xdr_get_next_encode_buffer()
529 xdr->page_ptr++; in xdr_get_next_encode_buffer()
530 xdr->iov = NULL; in xdr_get_next_encode_buffer()
538 xdr->scratch.iov_base = xdr->p; in xdr_get_next_encode_buffer()
539 xdr->scratch.iov_len = frag1bytes; in xdr_get_next_encode_buffer()
540 p = page_address(*xdr->page_ptr); in xdr_get_next_encode_buffer()
545 xdr->p = (void *)p + frag2bytes; in xdr_get_next_encode_buffer()
546 space_left = xdr->buf->buflen - xdr->buf->len; in xdr_get_next_encode_buffer()
547 xdr->end = (void *)p + min_t(int, space_left, PAGE_SIZE); in xdr_get_next_encode_buffer()
548 xdr->buf->page_len += frag2bytes; in xdr_get_next_encode_buffer()
549 xdr->buf->len += nbytes; in xdr_get_next_encode_buffer()
562 __be32 * xdr_reserve_space(struct xdr_stream *xdr, size_t nbytes) in xdr_reserve_space() argument
564 __be32 *p = xdr->p; in xdr_reserve_space()
567 xdr_commit_encode(xdr); in xdr_reserve_space()
572 if (unlikely(q > xdr->end || q < p)) in xdr_reserve_space()
573 return xdr_get_next_encode_buffer(xdr, nbytes); in xdr_reserve_space()
574 xdr->p = q; in xdr_reserve_space()
575 if (xdr->iov) in xdr_reserve_space()
576 xdr->iov->iov_len += nbytes; in xdr_reserve_space()
578 xdr->buf->page_len += nbytes; in xdr_reserve_space()
579 xdr->buf->len += nbytes; in xdr_reserve_space()
603 void xdr_truncate_encode(struct xdr_stream *xdr, size_t len) in xdr_truncate_encode() argument
605 struct xdr_buf *buf = xdr->buf; in xdr_truncate_encode()
615 xdr_commit_encode(xdr); in xdr_truncate_encode()
621 xdr->p = tail->iov_base + tail->iov_len; in xdr_truncate_encode()
622 WARN_ON_ONCE(!xdr->end); in xdr_truncate_encode()
623 WARN_ON_ONCE(!xdr->iov); in xdr_truncate_encode()
633 xdr->page_ptr = buf->pages + (new >> PAGE_SHIFT); in xdr_truncate_encode()
636 xdr->p = page_address(*xdr->page_ptr); in xdr_truncate_encode()
637 xdr->end = (void *)xdr->p + PAGE_SIZE; in xdr_truncate_encode()
638 xdr->p = (void *)xdr->p + (new % PAGE_SIZE); in xdr_truncate_encode()
639 WARN_ON_ONCE(xdr->iov); in xdr_truncate_encode()
643 xdr->end = head->iov_base + head->iov_len; in xdr_truncate_encode()
644 xdr->page_ptr--; in xdr_truncate_encode()
649 xdr->p = head->iov_base + head->iov_len; in xdr_truncate_encode()
650 xdr->iov = buf->head; in xdr_truncate_encode()
666 int xdr_restrict_buflen(struct xdr_stream *xdr, int newbuflen) in xdr_restrict_buflen() argument
668 struct xdr_buf *buf = xdr->buf; in xdr_restrict_buflen()
669 int left_in_this_buf = (void *)xdr->end - (void *)xdr->p; in xdr_restrict_buflen()
677 xdr->end = (void *)xdr->end + newbuflen - end_offset; in xdr_restrict_buflen()
691 void xdr_write_pages(struct xdr_stream *xdr, struct page **pages, unsigned int base, in xdr_write_pages() argument
694 struct xdr_buf *buf = xdr->buf; in xdr_write_pages()
700 iov->iov_base = (char *)xdr->p; in xdr_write_pages()
702 xdr->iov = iov; in xdr_write_pages()
707 BUG_ON(xdr->p >= xdr->end); in xdr_write_pages()
708 iov->iov_base = (char *)xdr->p + (len & 3); in xdr_write_pages()
711 *xdr->p++ = 0; in xdr_write_pages()
718 static void xdr_set_iov(struct xdr_stream *xdr, struct kvec *iov, in xdr_set_iov() argument
723 xdr->p = (__be32*)iov->iov_base; in xdr_set_iov()
724 xdr->end = (__be32*)(iov->iov_base + len); in xdr_set_iov()
725 xdr->iov = iov; in xdr_set_iov()
726 xdr->page_ptr = NULL; in xdr_set_iov()
729 static int xdr_set_page_base(struct xdr_stream *xdr, in xdr_set_page_base() argument
738 maxlen = xdr->buf->page_len; in xdr_set_page_base()
745 base += xdr->buf->page_base; in xdr_set_page_base()
748 xdr->page_ptr = &xdr->buf->pages[pgnr]; in xdr_set_page_base()
749 kaddr = page_address(*xdr->page_ptr); in xdr_set_page_base()
752 xdr->p = (__be32*)(kaddr + pgoff); in xdr_set_page_base()
757 xdr->end = (__be32*)(kaddr + pgend); in xdr_set_page_base()
758 xdr->iov = NULL; in xdr_set_page_base()
762 static void xdr_set_next_page(struct xdr_stream *xdr) in xdr_set_next_page() argument
766 newbase = (1 + xdr->page_ptr - xdr->buf->pages) << PAGE_SHIFT; in xdr_set_next_page()
767 newbase -= xdr->buf->page_base; in xdr_set_next_page()
769 if (xdr_set_page_base(xdr, newbase, PAGE_SIZE) < 0) in xdr_set_next_page()
770 xdr_set_iov(xdr, xdr->buf->tail, xdr->buf->len); in xdr_set_next_page()
773 static bool xdr_set_next_buffer(struct xdr_stream *xdr) in xdr_set_next_buffer() argument
775 if (xdr->page_ptr != NULL) in xdr_set_next_buffer()
776 xdr_set_next_page(xdr); in xdr_set_next_buffer()
777 else if (xdr->iov == xdr->buf->head) { in xdr_set_next_buffer()
778 if (xdr_set_page_base(xdr, 0, PAGE_SIZE) < 0) in xdr_set_next_buffer()
779 xdr_set_iov(xdr, xdr->buf->tail, xdr->buf->len); in xdr_set_next_buffer()
781 return xdr->p != xdr->end; in xdr_set_next_buffer()
790 void xdr_init_decode(struct xdr_stream *xdr, struct xdr_buf *buf, __be32 *p) in xdr_init_decode() argument
792 xdr->buf = buf; in xdr_init_decode()
793 xdr->scratch.iov_base = NULL; in xdr_init_decode()
794 xdr->scratch.iov_len = 0; in xdr_init_decode()
795 xdr->nwords = XDR_QUADLEN(buf->len); in xdr_init_decode()
797 xdr_set_iov(xdr, buf->head, buf->len); in xdr_init_decode()
799 xdr_set_page_base(xdr, 0, buf->len); in xdr_init_decode()
800 if (p != NULL && p > xdr->p && xdr->end >= p) { in xdr_init_decode()
801 xdr->nwords -= p - xdr->p; in xdr_init_decode()
802 xdr->p = p; in xdr_init_decode()
814 void xdr_init_decode_pages(struct xdr_stream *xdr, struct xdr_buf *buf, in xdr_init_decode_pages() argument
822 xdr_init_decode(xdr, buf, NULL); in xdr_init_decode_pages()
826 static __be32 * __xdr_inline_decode(struct xdr_stream *xdr, size_t nbytes) in __xdr_inline_decode() argument
829 __be32 *p = xdr->p; in __xdr_inline_decode()
832 if (unlikely(nwords > xdr->nwords || q > xdr->end || q < p)) in __xdr_inline_decode()
834 xdr->p = q; in __xdr_inline_decode()
835 xdr->nwords -= nwords; in __xdr_inline_decode()
850 void xdr_set_scratch_buffer(struct xdr_stream *xdr, void *buf, size_t buflen) in xdr_set_scratch_buffer() argument
852 xdr->scratch.iov_base = buf; in xdr_set_scratch_buffer()
853 xdr->scratch.iov_len = buflen; in xdr_set_scratch_buffer()
857 static __be32 *xdr_copy_to_scratch(struct xdr_stream *xdr, size_t nbytes) in xdr_copy_to_scratch() argument
860 void *cpdest = xdr->scratch.iov_base; in xdr_copy_to_scratch()
861 size_t cplen = (char *)xdr->end - (char *)xdr->p; in xdr_copy_to_scratch()
863 if (nbytes > xdr->scratch.iov_len) in xdr_copy_to_scratch()
865 memcpy(cpdest, xdr->p, cplen); in xdr_copy_to_scratch()
868 if (!xdr_set_next_buffer(xdr)) in xdr_copy_to_scratch()
870 p = __xdr_inline_decode(xdr, nbytes); in xdr_copy_to_scratch()
874 return xdr->scratch.iov_base; in xdr_copy_to_scratch()
887 __be32 * xdr_inline_decode(struct xdr_stream *xdr, size_t nbytes) in xdr_inline_decode() argument
892 return xdr->p; in xdr_inline_decode()
893 if (xdr->p == xdr->end && !xdr_set_next_buffer(xdr)) in xdr_inline_decode()
895 p = __xdr_inline_decode(xdr, nbytes); in xdr_inline_decode()
898 return xdr_copy_to_scratch(xdr, nbytes); in xdr_inline_decode()
902 static unsigned int xdr_align_pages(struct xdr_stream *xdr, unsigned int len) in xdr_align_pages() argument
904 struct xdr_buf *buf = xdr->buf; in xdr_align_pages()
907 unsigned int cur = xdr_stream_pos(xdr); in xdr_align_pages()
909 if (xdr->nwords == 0) in xdr_align_pages()
915 xdr->nwords = XDR_QUADLEN(buf->len - cur); in xdr_align_pages()
918 if (nwords > xdr->nwords) { in xdr_align_pages()
919 nwords = xdr->nwords; in xdr_align_pages()
924 else if (nwords < xdr->nwords) { in xdr_align_pages()
927 xdr->nwords = XDR_QUADLEN(buf->len - cur); in xdr_align_pages()
943 unsigned int xdr_read_pages(struct xdr_stream *xdr, unsigned int len) in xdr_read_pages() argument
945 struct xdr_buf *buf = xdr->buf; in xdr_read_pages()
951 len = xdr_align_pages(xdr, len); in xdr_read_pages()
956 xdr->iov = iov = buf->tail; in xdr_read_pages()
958 end = ((xdr->nwords - nwords) << 2) + padding; in xdr_read_pages()
966 xdr->p = (__be32 *)((char *)iov->iov_base + padding); in xdr_read_pages()
967 xdr->end = (__be32 *)((char *)iov->iov_base + end); in xdr_read_pages()
968 xdr->page_ptr = NULL; in xdr_read_pages()
969 xdr->nwords = XDR_QUADLEN(end - padding); in xdr_read_pages()
984 void xdr_enter_page(struct xdr_stream *xdr, unsigned int len) in xdr_enter_page() argument
986 len = xdr_align_pages(xdr, len); in xdr_enter_page()
992 xdr_set_page_base(xdr, 0, len); in xdr_enter_page()