Lines Matching +full:data +full:- +full:shift

1 // SPDX-License-Identifier: GPL-2.0-only
31 unsigned int quadlen = XDR_QUADLEN(obj->len); in xdr_encode_netobj()
34 *p++ = cpu_to_be32(obj->len); in xdr_encode_netobj()
35 memcpy(p, obj->data, obj->len); in xdr_encode_netobj()
36 return p + XDR_QUADLEN(obj->len); in xdr_encode_netobj()
47 obj->len = len; in xdr_decode_netobj()
48 obj->data = (u8 *) p; in xdr_decode_netobj()
54 * xdr_encode_opaque_fixed - Encode fixed length opaque data
56 * @ptr: pointer to data to encode (or NULL)
57 * @nbytes: size of data.
59 * Copy the array of data of length nbytes at ptr to the XDR buffer
60 * at position p, then align to the next 32-bit boundary by padding
71 unsigned int padding = (quadlen << 2) - nbytes; in xdr_encode_opaque_fixed()
84 * xdr_encode_opaque - Encode variable length opaque data
86 * @ptr: pointer to data to encode (or NULL)
87 * @nbytes: size of data.
121 * xdr_terminate_string - '\0'-terminate a string residing in an xdr_buf
130 kaddr = kmap_atomic(buf->pages[0]); in xdr_terminate_string()
131 kaddr[buf->page_base + len] = '\0'; in xdr_terminate_string()
138 if (!buf->page_len) in xdr_buf_pagecount()
140 return (buf->page_base + buf->page_len + PAGE_SIZE - 1) >> PAGE_SHIFT; in xdr_buf_pagecount()
148 if (n != 0 && buf->bvec == NULL) { in xdr_alloc_bvec()
149 buf->bvec = kmalloc_array(n, sizeof(buf->bvec[0]), gfp); in xdr_alloc_bvec()
150 if (!buf->bvec) in xdr_alloc_bvec()
151 return -ENOMEM; in xdr_alloc_bvec()
153 buf->bvec[i].bv_page = buf->pages[i]; in xdr_alloc_bvec()
154 buf->bvec[i].bv_len = PAGE_SIZE; in xdr_alloc_bvec()
155 buf->bvec[i].bv_offset = 0; in xdr_alloc_bvec()
164 kfree(buf->bvec); in xdr_free_bvec()
165 buf->bvec = NULL; in xdr_free_bvec()
169 * xdr_inline_pages - Prepare receive buffer for a large reply
171 * @offset: expected offset where data payload will start, in bytes
174 * @len: expected size of the upper layer data payload, in bytes
181 struct kvec *head = xdr->head; in xdr_inline_pages()
182 struct kvec *tail = xdr->tail; in xdr_inline_pages()
183 char *buf = (char *)head->iov_base; in xdr_inline_pages()
184 unsigned int buflen = head->iov_len; in xdr_inline_pages()
186 head->iov_len = offset; in xdr_inline_pages()
188 xdr->pages = pages; in xdr_inline_pages()
189 xdr->page_base = base; in xdr_inline_pages()
190 xdr->page_len = len; in xdr_inline_pages()
192 tail->iov_base = buf + offset; in xdr_inline_pages()
193 tail->iov_len = buflen - offset; in xdr_inline_pages()
194 xdr->buflen += len; in xdr_inline_pages()
246 if (copy > (PAGE_SIZE - pgto_base)) in _shift_data_left_pages()
247 copy = PAGE_SIZE - pgto_base; in _shift_data_left_pages()
248 if (copy > (PAGE_SIZE - pgfrom_base)) in _shift_data_left_pages()
249 copy = PAGE_SIZE - pgfrom_base; in _shift_data_left_pages()
264 } while ((len -= copy) != 0); in _shift_data_left_pages()
307 pgto--; in _shift_data_right_pages()
311 pgfrom--; in _shift_data_right_pages()
319 pgto_base -= copy; in _shift_data_right_pages()
320 pgfrom_base -= copy; in _shift_data_right_pages()
332 } while ((len -= copy) != 0); in _shift_data_right_pages()
339 * @p: pointer to source data
342 * Copies data from an arbitrary memory location into an array of pages
343 * The copy is assumed to be non-overlapping.
359 copy = PAGE_SIZE - pgbase; in _copy_to_pages()
367 len -= copy; in _copy_to_pages()
386 * @pgbase: offset of source data
389 * Copies data into an arbitrary memory location from an array of pages
390 * The copy is assumed to be non-overlapping.
406 copy = PAGE_SIZE - pgbase; in _copy_from_pages()
421 } while ((len -= copy) != 0); in _copy_from_pages()
428 if (base >= iov->iov_len) in xdr_buf_iov_zero()
430 if (len > iov->iov_len - base) in xdr_buf_iov_zero()
431 len = iov->iov_len - base; in xdr_buf_iov_zero()
432 memset(iov->iov_base + base, 0, len); in xdr_buf_iov_zero()
444 struct page **pages = buf->pages; in xdr_buf_pages_zero()
451 if (pgbase >= buf->page_len) { in xdr_buf_pages_zero()
452 xdr_buf_iov_zero(buf->tail, pgbase - buf->page_len, len); in xdr_buf_pages_zero()
455 if (pgbase + len > buf->page_len) { in xdr_buf_pages_zero()
456 xdr_buf_iov_zero(buf->tail, 0, pgbase + len - buf->page_len); in xdr_buf_pages_zero()
457 len = buf->page_len - pgbase; in xdr_buf_pages_zero()
460 pgbase += buf->page_base; in xdr_buf_pages_zero()
466 zero = PAGE_SIZE - pgbase; in xdr_buf_pages_zero()
478 } while ((len -= zero) != 0); in xdr_buf_pages_zero()
486 if (!(buf->flags & XDRBUF_SPARSE_PAGES)) in xdr_buf_pages_fill_sparse()
488 if (buflen <= buf->head->iov_len) in xdr_buf_pages_fill_sparse()
490 pagelen = buflen - buf->head->iov_len; in xdr_buf_pages_fill_sparse()
491 if (pagelen > buf->page_len) in xdr_buf_pages_fill_sparse()
492 pagelen = buf->page_len; in xdr_buf_pages_fill_sparse()
493 npages = (pagelen + buf->page_base + PAGE_SIZE - 1) >> PAGE_SHIFT; in xdr_buf_pages_fill_sparse()
495 if (!buf->pages[i]) in xdr_buf_pages_fill_sparse()
497 buf->pages[i] = alloc_page(gfp); in xdr_buf_pages_fill_sparse()
498 if (likely(buf->pages[i])) in xdr_buf_pages_fill_sparse()
500 buflen -= pagelen; in xdr_buf_pages_fill_sparse()
502 if (pagelen > buf->page_base) in xdr_buf_pages_fill_sparse()
503 buflen += pagelen - buf->page_base; in xdr_buf_pages_fill_sparse()
511 struct kvec *head = buf->head; in xdr_buf_try_expand()
512 struct kvec *tail = buf->tail; in xdr_buf_try_expand()
513 unsigned int sum = head->iov_len + buf->page_len + tail->iov_len; in xdr_buf_try_expand()
516 if (sum > buf->len) { in xdr_buf_try_expand()
517 free_space = min_t(unsigned int, sum - buf->len, len); in xdr_buf_try_expand()
518 newlen = xdr_buf_pages_fill_sparse(buf, buf->len + free_space, in xdr_buf_try_expand()
520 free_space = newlen - buf->len; in xdr_buf_try_expand()
521 buf->len = newlen; in xdr_buf_try_expand()
522 len -= free_space; in xdr_buf_try_expand()
527 if (buf->buflen > sum) { in xdr_buf_try_expand()
529 free_space = min_t(unsigned int, buf->buflen - sum, len); in xdr_buf_try_expand()
530 tail->iov_len += free_space; in xdr_buf_try_expand()
531 buf->len += free_space; in xdr_buf_try_expand()
537 unsigned int shift) in xdr_buf_tail_copy_right() argument
539 const struct kvec *tail = buf->tail; in xdr_buf_tail_copy_right()
540 unsigned int to = base + shift; in xdr_buf_tail_copy_right()
542 if (to >= tail->iov_len) in xdr_buf_tail_copy_right()
544 if (len + to > tail->iov_len) in xdr_buf_tail_copy_right()
545 len = tail->iov_len - to; in xdr_buf_tail_copy_right()
546 memmove(tail->iov_base + to, tail->iov_base + base, len); in xdr_buf_tail_copy_right()
551 unsigned int shift) in xdr_buf_pages_copy_right() argument
553 const struct kvec *tail = buf->tail; in xdr_buf_pages_copy_right()
554 unsigned int to = base + shift; in xdr_buf_pages_copy_right()
558 if (base >= buf->page_len) in xdr_buf_pages_copy_right()
560 if (len > buf->page_len - base) in xdr_buf_pages_copy_right()
561 len = buf->page_len - base; in xdr_buf_pages_copy_right()
562 if (to >= buf->page_len) { in xdr_buf_pages_copy_right()
563 tato = to - buf->page_len; in xdr_buf_pages_copy_right()
564 if (tail->iov_len >= len + tato) in xdr_buf_pages_copy_right()
566 else if (tail->iov_len > tato) in xdr_buf_pages_copy_right()
567 talen = tail->iov_len - tato; in xdr_buf_pages_copy_right()
568 } else if (len + to >= buf->page_len) { in xdr_buf_pages_copy_right()
569 pglen = buf->page_len - to; in xdr_buf_pages_copy_right()
570 talen = len - pglen; in xdr_buf_pages_copy_right()
571 if (talen > tail->iov_len) in xdr_buf_pages_copy_right()
572 talen = tail->iov_len; in xdr_buf_pages_copy_right()
576 _copy_from_pages(tail->iov_base + tato, buf->pages, in xdr_buf_pages_copy_right()
577 buf->page_base + base + pglen, talen); in xdr_buf_pages_copy_right()
578 _shift_data_right_pages(buf->pages, buf->page_base + to, in xdr_buf_pages_copy_right()
579 buf->page_base + base, pglen); in xdr_buf_pages_copy_right()
584 unsigned int shift) in xdr_buf_head_copy_right() argument
586 const struct kvec *head = buf->head; in xdr_buf_head_copy_right()
587 const struct kvec *tail = buf->tail; in xdr_buf_head_copy_right()
588 unsigned int to = base + shift; in xdr_buf_head_copy_right()
592 if (base >= head->iov_len) in xdr_buf_head_copy_right()
594 if (len > head->iov_len - base) in xdr_buf_head_copy_right()
595 len = head->iov_len - base; in xdr_buf_head_copy_right()
596 if (to >= buf->page_len + head->iov_len) { in xdr_buf_head_copy_right()
597 tato = to - buf->page_len - head->iov_len; in xdr_buf_head_copy_right()
599 } else if (to >= head->iov_len) { in xdr_buf_head_copy_right()
600 pgto = to - head->iov_len; in xdr_buf_head_copy_right()
602 if (pgto + pglen > buf->page_len) { in xdr_buf_head_copy_right()
603 talen = pgto + pglen - buf->page_len; in xdr_buf_head_copy_right()
604 pglen -= talen; in xdr_buf_head_copy_right()
607 pglen = len - to; in xdr_buf_head_copy_right()
608 if (pglen > buf->page_len) { in xdr_buf_head_copy_right()
609 talen = pglen - buf->page_len; in xdr_buf_head_copy_right()
610 pglen = buf->page_len; in xdr_buf_head_copy_right()
614 len -= talen; in xdr_buf_head_copy_right()
616 if (talen + tato > tail->iov_len) in xdr_buf_head_copy_right()
617 talen = tail->iov_len > tato ? tail->iov_len - tato : 0; in xdr_buf_head_copy_right()
618 memcpy(tail->iov_base + tato, head->iov_base + base, talen); in xdr_buf_head_copy_right()
620 len -= pglen; in xdr_buf_head_copy_right()
621 base -= pglen; in xdr_buf_head_copy_right()
622 _copy_to_pages(buf->pages, buf->page_base + pgto, head->iov_base + base, in xdr_buf_head_copy_right()
625 base -= len; in xdr_buf_head_copy_right()
626 memmove(head->iov_base + to, head->iov_base + base, len); in xdr_buf_head_copy_right()
631 unsigned int shift) in xdr_buf_tail_shift_right() argument
633 const struct kvec *tail = buf->tail; in xdr_buf_tail_shift_right()
635 if (base >= tail->iov_len || !shift || !len) in xdr_buf_tail_shift_right()
637 xdr_buf_tail_copy_right(buf, base, len, shift); in xdr_buf_tail_shift_right()
642 unsigned int shift) in xdr_buf_pages_shift_right() argument
644 if (!shift || !len) in xdr_buf_pages_shift_right()
646 if (base >= buf->page_len) { in xdr_buf_pages_shift_right()
647 xdr_buf_tail_shift_right(buf, base - buf->page_len, len, shift); in xdr_buf_pages_shift_right()
650 if (base + len > buf->page_len) in xdr_buf_pages_shift_right()
651 xdr_buf_tail_shift_right(buf, 0, base + len - buf->page_len, in xdr_buf_pages_shift_right()
652 shift); in xdr_buf_pages_shift_right()
653 xdr_buf_pages_copy_right(buf, base, len, shift); in xdr_buf_pages_shift_right()
658 unsigned int shift) in xdr_buf_head_shift_right() argument
660 const struct kvec *head = buf->head; in xdr_buf_head_shift_right()
662 if (!shift) in xdr_buf_head_shift_right()
664 if (base >= head->iov_len) { in xdr_buf_head_shift_right()
665 xdr_buf_pages_shift_right(buf, head->iov_len - base, len, in xdr_buf_head_shift_right()
666 shift); in xdr_buf_head_shift_right()
669 if (base + len > head->iov_len) in xdr_buf_head_shift_right()
670 xdr_buf_pages_shift_right(buf, 0, base + len - head->iov_len, in xdr_buf_head_shift_right()
671 shift); in xdr_buf_head_shift_right()
672 xdr_buf_head_copy_right(buf, base, len, shift); in xdr_buf_head_shift_right()
676 unsigned int len, unsigned int shift) in xdr_buf_tail_copy_left() argument
678 const struct kvec *tail = buf->tail; in xdr_buf_tail_copy_left()
680 if (base >= tail->iov_len) in xdr_buf_tail_copy_left()
682 if (len > tail->iov_len - base) in xdr_buf_tail_copy_left()
683 len = tail->iov_len - base; in xdr_buf_tail_copy_left()
684 /* Shift data into head */ in xdr_buf_tail_copy_left()
685 if (shift > buf->page_len + base) { in xdr_buf_tail_copy_left()
686 const struct kvec *head = buf->head; in xdr_buf_tail_copy_left()
688 head->iov_len + buf->page_len + base - shift; in xdr_buf_tail_copy_left()
691 if (WARN_ONCE(shift > head->iov_len + buf->page_len + base, in xdr_buf_tail_copy_left()
692 "SUNRPC: Misaligned data.\n")) in xdr_buf_tail_copy_left()
694 if (hdto + hdlen > head->iov_len) in xdr_buf_tail_copy_left()
695 hdlen = head->iov_len - hdto; in xdr_buf_tail_copy_left()
696 memcpy(head->iov_base + hdto, tail->iov_base + base, hdlen); in xdr_buf_tail_copy_left()
698 len -= hdlen; in xdr_buf_tail_copy_left()
702 /* Shift data into pages */ in xdr_buf_tail_copy_left()
703 if (shift > base) { in xdr_buf_tail_copy_left()
704 unsigned int pgto = buf->page_len + base - shift; in xdr_buf_tail_copy_left()
707 if (pgto + pglen > buf->page_len) in xdr_buf_tail_copy_left()
708 pglen = buf->page_len - pgto; in xdr_buf_tail_copy_left()
709 _copy_to_pages(buf->pages, buf->page_base + pgto, in xdr_buf_tail_copy_left()
710 tail->iov_base + base, pglen); in xdr_buf_tail_copy_left()
712 len -= pglen; in xdr_buf_tail_copy_left()
716 memmove(tail->iov_base + base - shift, tail->iov_base + base, len); in xdr_buf_tail_copy_left()
721 unsigned int shift) in xdr_buf_pages_copy_left() argument
725 if (base >= buf->page_len) in xdr_buf_pages_copy_left()
727 if (len > buf->page_len - base) in xdr_buf_pages_copy_left()
728 len = buf->page_len - base; in xdr_buf_pages_copy_left()
729 /* Shift data into head */ in xdr_buf_pages_copy_left()
730 if (shift > base) { in xdr_buf_pages_copy_left()
731 const struct kvec *head = buf->head; in xdr_buf_pages_copy_left()
732 unsigned int hdto = head->iov_len + base - shift; in xdr_buf_pages_copy_left()
735 if (WARN_ONCE(shift > head->iov_len + base, in xdr_buf_pages_copy_left()
736 "SUNRPC: Misaligned data.\n")) in xdr_buf_pages_copy_left()
738 if (hdto + hdlen > head->iov_len) in xdr_buf_pages_copy_left()
739 hdlen = head->iov_len - hdto; in xdr_buf_pages_copy_left()
740 _copy_from_pages(head->iov_base + hdto, buf->pages, in xdr_buf_pages_copy_left()
741 buf->page_base + base, hdlen); in xdr_buf_pages_copy_left()
743 len -= hdlen; in xdr_buf_pages_copy_left()
747 pgto = base - shift; in xdr_buf_pages_copy_left()
748 _shift_data_left_pages(buf->pages, buf->page_base + pgto, in xdr_buf_pages_copy_left()
749 buf->page_base + base, len); in xdr_buf_pages_copy_left()
754 unsigned int shift) in xdr_buf_tail_shift_left() argument
756 if (!shift || !len) in xdr_buf_tail_shift_left()
758 xdr_buf_tail_copy_left(buf, base, len, shift); in xdr_buf_tail_shift_left()
763 unsigned int shift) in xdr_buf_pages_shift_left() argument
765 if (!shift || !len) in xdr_buf_pages_shift_left()
767 if (base >= buf->page_len) { in xdr_buf_pages_shift_left()
768 xdr_buf_tail_shift_left(buf, base - buf->page_len, len, shift); in xdr_buf_pages_shift_left()
771 xdr_buf_pages_copy_left(buf, base, len, shift); in xdr_buf_pages_shift_left()
773 if (len <= buf->page_len) in xdr_buf_pages_shift_left()
775 xdr_buf_tail_copy_left(buf, 0, len - buf->page_len, shift); in xdr_buf_pages_shift_left()
781 * @len: new length of buf->head[0]
783 * Shrinks XDR buffer's header kvec buf->head[0], setting it to
784 * 'len' bytes. The extra data is not lost, but is instead
789 struct kvec *head = buf->head; in xdr_shrink_bufhead()
790 unsigned int shift, buflen = max(buf->len, len); in xdr_shrink_bufhead() local
792 WARN_ON_ONCE(len > head->iov_len); in xdr_shrink_bufhead()
793 if (head->iov_len > buflen) { in xdr_shrink_bufhead()
794 buf->buflen -= head->iov_len - buflen; in xdr_shrink_bufhead()
795 head->iov_len = buflen; in xdr_shrink_bufhead()
797 if (len >= head->iov_len) in xdr_shrink_bufhead()
799 shift = head->iov_len - len; in xdr_shrink_bufhead()
800 xdr_buf_try_expand(buf, shift); in xdr_shrink_bufhead()
801 xdr_buf_head_shift_right(buf, len, buflen - len, shift); in xdr_shrink_bufhead()
802 head->iov_len = len; in xdr_shrink_bufhead()
803 buf->buflen -= shift; in xdr_shrink_bufhead()
804 buf->len -= shift; in xdr_shrink_bufhead()
805 return shift; in xdr_shrink_bufhead()
809 * xdr_shrink_pagelen - shrinks buf->pages to @len bytes
813 * The extra data is not lost, but is instead moved into buf->tail.
818 unsigned int shift, buflen = buf->len - buf->head->iov_len; in xdr_shrink_pagelen() local
820 WARN_ON_ONCE(len > buf->page_len); in xdr_shrink_pagelen()
821 if (buf->head->iov_len >= buf->len || len > buflen) in xdr_shrink_pagelen()
823 if (buf->page_len > buflen) { in xdr_shrink_pagelen()
824 buf->buflen -= buf->page_len - buflen; in xdr_shrink_pagelen()
825 buf->page_len = buflen; in xdr_shrink_pagelen()
827 if (len >= buf->page_len) in xdr_shrink_pagelen()
829 shift = buf->page_len - len; in xdr_shrink_pagelen()
830 xdr_buf_try_expand(buf, shift); in xdr_shrink_pagelen()
831 xdr_buf_pages_shift_right(buf, len, buflen - len, shift); in xdr_shrink_pagelen()
832 buf->page_len = len; in xdr_shrink_pagelen()
833 buf->len -= shift; in xdr_shrink_pagelen()
834 buf->buflen -= shift; in xdr_shrink_pagelen()
835 return shift; in xdr_shrink_pagelen()
841 xdr_shrink_bufhead(buf, buf->head->iov_len - len); in xdr_shift_buf()
846 * xdr_stream_pos - Return the current offset from the start of the xdr_stream
851 return (unsigned int)(XDR_QUADLEN(xdr->buf->len) - xdr->nwords) << 2; in xdr_stream_pos()
857 unsigned int blen = xdr->buf->len; in xdr_stream_set_pos()
859 xdr->nwords = blen > pos ? XDR_QUADLEN(blen) - XDR_QUADLEN(pos) : 0; in xdr_stream_set_pos()
864 xdr_stream_set_pos(xdr, pos + xdr->buf->head[0].iov_len); in xdr_stream_page_set_pos()
868 * xdr_page_pos - Return the current offset from the start of the xdr pages
875 WARN_ON(pos < xdr->buf->head[0].iov_len); in xdr_page_pos()
876 return pos - xdr->buf->head[0].iov_len; in xdr_page_pos()
881 * xdr_init_encode - Initialize a struct xdr_stream for sending data.
883 * @buf: pointer to XDR buffer in which to encode data
890 * data. With the new scheme, the xdr_stream manages the details
897 struct kvec *iov = buf->head; in xdr_init_encode()
898 int scratch_len = buf->buflen - buf->page_len - buf->tail[0].iov_len; in xdr_init_encode()
902 xdr->buf = buf; in xdr_init_encode()
903 xdr->iov = iov; in xdr_init_encode()
904 xdr->p = (__be32 *)((char *)iov->iov_base + iov->iov_len); in xdr_init_encode()
905 xdr->end = (__be32 *)((char *)iov->iov_base + scratch_len); in xdr_init_encode()
906 BUG_ON(iov->iov_len > scratch_len); in xdr_init_encode()
908 if (p != xdr->p && p != NULL) { in xdr_init_encode()
911 BUG_ON(p < xdr->p || p > xdr->end); in xdr_init_encode()
912 len = (char *)p - (char *)xdr->p; in xdr_init_encode()
913 xdr->p = p; in xdr_init_encode()
914 buf->len += len; in xdr_init_encode()
915 iov->iov_len += len; in xdr_init_encode()
917 xdr->rqst = rqst; in xdr_init_encode()
922 * xdr_commit_encode - Ensure all data is written to buffer
926 * temporary location to write to, then later copying the data into
932 * data might be read.
936 int shift = xdr->scratch.iov_len; in xdr_commit_encode() local
939 if (shift == 0) in xdr_commit_encode()
941 page = page_address(*xdr->page_ptr); in xdr_commit_encode()
942 memcpy(xdr->scratch.iov_base, page, shift); in xdr_commit_encode()
943 memmove(page, page + shift, (void *)xdr->p - page); in xdr_commit_encode()
957 if (xdr->buf->len + nbytes > xdr->buf->buflen) in xdr_get_next_encode_buffer()
959 frag1bytes = (xdr->end - xdr->p) << 2; in xdr_get_next_encode_buffer()
960 frag2bytes = nbytes - frag1bytes; in xdr_get_next_encode_buffer()
961 if (xdr->iov) in xdr_get_next_encode_buffer()
962 xdr->iov->iov_len += frag1bytes; in xdr_get_next_encode_buffer()
964 xdr->buf->page_len += frag1bytes; in xdr_get_next_encode_buffer()
965 xdr->page_ptr++; in xdr_get_next_encode_buffer()
966 xdr->iov = NULL; in xdr_get_next_encode_buffer()
974 xdr_set_scratch_buffer(xdr, xdr->p, frag1bytes); in xdr_get_next_encode_buffer()
975 p = page_address(*xdr->page_ptr); in xdr_get_next_encode_buffer()
980 xdr->p = (void *)p + frag2bytes; in xdr_get_next_encode_buffer()
981 space_left = xdr->buf->buflen - xdr->buf->len; in xdr_get_next_encode_buffer()
982 xdr->end = (void *)p + min_t(int, space_left, PAGE_SIZE); in xdr_get_next_encode_buffer()
983 xdr->buf->page_len += frag2bytes; in xdr_get_next_encode_buffer()
984 xdr->buf->len += nbytes; in xdr_get_next_encode_buffer()
992 * xdr_reserve_space - Reserve buffer space for sending
997 * bytes of data. If so, update the total xdr_buf length, and
1002 __be32 *p = xdr->p; in xdr_reserve_space()
1006 /* align nbytes on the next 32-bit boundary */ in xdr_reserve_space()
1010 if (unlikely(q > xdr->end || q < p)) in xdr_reserve_space()
1012 xdr->p = q; in xdr_reserve_space()
1013 if (xdr->iov) in xdr_reserve_space()
1014 xdr->iov->iov_len += nbytes; in xdr_reserve_space()
1016 xdr->buf->page_len += nbytes; in xdr_reserve_space()
1017 xdr->buf->len += nbytes; in xdr_reserve_space()
1024 * xdr_reserve_space_vec - Reserves a large amount of buffer space for sending
1029 * Reserves enough buffer space to encode 'nbytes' of data and stores the
1042 * in xdr->pages. in xdr_reserve_space_vec()
1044 if (xdr->iov == xdr->buf->head) { in xdr_reserve_space_vec()
1045 xdr->iov = NULL; in xdr_reserve_space_vec()
1046 xdr->end = xdr->p; in xdr_reserve_space_vec()
1050 thislen = xdr->buf->page_len % PAGE_SIZE; in xdr_reserve_space_vec()
1051 thislen = min_t(size_t, nbytes, PAGE_SIZE - thislen); in xdr_reserve_space_vec()
1055 return -EIO; in xdr_reserve_space_vec()
1060 nbytes -= thislen; in xdr_reserve_space_vec()
1068 * xdr_truncate_encode - truncate an encode buffer
1072 * Truncates the xdr stream, so that xdr->buf->len == len,
1073 * and xdr->p points at offset len from the start of the buffer, and
1076 * If this means moving xdr->p to a different buffer, we assume that
1082 * cache pages (as in a zero-copy server read reply), except for the
1088 struct xdr_buf *buf = xdr->buf; in xdr_truncate_encode()
1089 struct kvec *head = buf->head; in xdr_truncate_encode()
1090 struct kvec *tail = buf->tail; in xdr_truncate_encode()
1094 if (len > buf->len) { in xdr_truncate_encode()
1100 fraglen = min_t(int, buf->len - len, tail->iov_len); in xdr_truncate_encode()
1101 tail->iov_len -= fraglen; in xdr_truncate_encode()
1102 buf->len -= fraglen; in xdr_truncate_encode()
1103 if (tail->iov_len) { in xdr_truncate_encode()
1104 xdr->p = tail->iov_base + tail->iov_len; in xdr_truncate_encode()
1105 WARN_ON_ONCE(!xdr->end); in xdr_truncate_encode()
1106 WARN_ON_ONCE(!xdr->iov); in xdr_truncate_encode()
1110 fraglen = min_t(int, buf->len - len, buf->page_len); in xdr_truncate_encode()
1111 buf->page_len -= fraglen; in xdr_truncate_encode()
1112 buf->len -= fraglen; in xdr_truncate_encode()
1114 new = buf->page_base + buf->page_len; in xdr_truncate_encode()
1116 xdr->page_ptr = buf->pages + (new >> PAGE_SHIFT); in xdr_truncate_encode()
1118 if (buf->page_len) { in xdr_truncate_encode()
1119 xdr->p = page_address(*xdr->page_ptr); in xdr_truncate_encode()
1120 xdr->end = (void *)xdr->p + PAGE_SIZE; in xdr_truncate_encode()
1121 xdr->p = (void *)xdr->p + (new % PAGE_SIZE); in xdr_truncate_encode()
1122 WARN_ON_ONCE(xdr->iov); in xdr_truncate_encode()
1126 xdr->end = head->iov_base + head->iov_len; in xdr_truncate_encode()
1127 /* (otherwise assume xdr->end is already set) */ in xdr_truncate_encode()
1128 xdr->page_ptr--; in xdr_truncate_encode()
1129 head->iov_len = len; in xdr_truncate_encode()
1130 buf->len = len; in xdr_truncate_encode()
1131 xdr->p = head->iov_base + head->iov_len; in xdr_truncate_encode()
1132 xdr->iov = buf->head; in xdr_truncate_encode()
1137 * xdr_restrict_buflen - decrease available buffer space
1142 * If we've already used too much space in the buffer, returns -1.
1144 * and does nothing. Otherwise, adjusts xdr->buf->buflen to newbuflen
1145 * and ensures xdr->end is set at most offset newbuflen from the start
1150 struct xdr_buf *buf = xdr->buf; in xdr_restrict_buflen()
1151 int left_in_this_buf = (void *)xdr->end - (void *)xdr->p; in xdr_restrict_buflen()
1152 int end_offset = buf->len + left_in_this_buf; in xdr_restrict_buflen()
1154 if (newbuflen < 0 || newbuflen < buf->len) in xdr_restrict_buflen()
1155 return -1; in xdr_restrict_buflen()
1156 if (newbuflen > buf->buflen) in xdr_restrict_buflen()
1159 xdr->end = (void *)xdr->end + newbuflen - end_offset; in xdr_restrict_buflen()
1160 buf->buflen = newbuflen; in xdr_restrict_buflen()
1166 * xdr_write_pages - Insert a list of pages into an XDR buffer for sending
1170 * @len: length of data in bytes
1176 struct xdr_buf *buf = xdr->buf; in xdr_write_pages()
1177 struct kvec *iov = buf->tail; in xdr_write_pages()
1178 buf->pages = pages; in xdr_write_pages()
1179 buf->page_base = base; in xdr_write_pages()
1180 buf->page_len = len; in xdr_write_pages()
1182 iov->iov_base = (char *)xdr->p; in xdr_write_pages()
1183 iov->iov_len = 0; in xdr_write_pages()
1184 xdr->iov = iov; in xdr_write_pages()
1187 unsigned int pad = 4 - (len & 3); in xdr_write_pages()
1189 BUG_ON(xdr->p >= xdr->end); in xdr_write_pages()
1190 iov->iov_base = (char *)xdr->p + (len & 3); in xdr_write_pages()
1191 iov->iov_len += pad; in xdr_write_pages()
1193 *xdr->p++ = 0; in xdr_write_pages()
1195 buf->buflen += len; in xdr_write_pages()
1196 buf->len += len; in xdr_write_pages()
1203 if (len > iov->iov_len) in xdr_set_iov()
1204 len = iov->iov_len; in xdr_set_iov()
1207 xdr->p = (__be32*)(iov->iov_base + base); in xdr_set_iov()
1208 xdr->end = (__be32*)(iov->iov_base + len); in xdr_set_iov()
1209 xdr->iov = iov; in xdr_set_iov()
1210 xdr->page_ptr = NULL; in xdr_set_iov()
1211 return len - base; in xdr_set_iov()
1217 struct xdr_buf *buf = xdr->buf; in xdr_set_tail_base()
1219 xdr_stream_set_pos(xdr, base + buf->page_len + buf->head->iov_len); in xdr_set_tail_base()
1220 return xdr_set_iov(xdr, buf->tail, base, len); in xdr_set_tail_base()
1232 maxlen = xdr->buf->page_len; in xdr_set_page_base()
1236 maxlen -= base; in xdr_set_page_base()
1241 base += xdr->buf->page_base; in xdr_set_page_base()
1244 xdr->page_ptr = &xdr->buf->pages[pgnr]; in xdr_set_page_base()
1245 kaddr = page_address(*xdr->page_ptr); in xdr_set_page_base()
1248 xdr->p = (__be32*)(kaddr + pgoff); in xdr_set_page_base()
1253 xdr->end = (__be32*)(kaddr + pgend); in xdr_set_page_base()
1254 xdr->iov = NULL; in xdr_set_page_base()
1262 base -= xdr->buf->page_len; in xdr_set_page()
1271 newbase = (1 + xdr->page_ptr - xdr->buf->pages) << PAGE_SHIFT; in xdr_set_next_page()
1272 newbase -= xdr->buf->page_base; in xdr_set_next_page()
1273 if (newbase < xdr->buf->page_len) in xdr_set_next_page()
1281 if (xdr->page_ptr != NULL) in xdr_set_next_buffer()
1283 else if (xdr->iov == xdr->buf->head) in xdr_set_next_buffer()
1285 return xdr->p != xdr->end; in xdr_set_next_buffer()
1289 * xdr_init_decode - Initialize an xdr_stream for decoding data.
1291 * @buf: pointer to XDR buffer from which to decode data
1298 xdr->buf = buf; in xdr_init_decode()
1300 xdr->nwords = XDR_QUADLEN(buf->len); in xdr_init_decode()
1301 if (xdr_set_iov(xdr, buf->head, 0, buf->len) == 0 && in xdr_init_decode()
1302 xdr_set_page_base(xdr, 0, buf->len) == 0) in xdr_init_decode()
1303 xdr_set_iov(xdr, buf->tail, 0, buf->len); in xdr_init_decode()
1304 if (p != NULL && p > xdr->p && xdr->end >= p) { in xdr_init_decode()
1305 xdr->nwords -= p - xdr->p; in xdr_init_decode()
1306 xdr->p = p; in xdr_init_decode()
1308 xdr->rqst = rqst; in xdr_init_decode()
1313 * xdr_init_decode_pages - Initialize an xdr_stream for decoding into pages
1315 * @buf: pointer to XDR buffer from which to decode data
1323 buf->pages = pages; in xdr_init_decode_pages()
1324 buf->page_len = len; in xdr_init_decode_pages()
1325 buf->buflen = len; in xdr_init_decode_pages()
1326 buf->len = len; in xdr_init_decode_pages()
1334 __be32 *p = xdr->p; in __xdr_inline_decode()
1337 if (unlikely(nwords > xdr->nwords || q > xdr->end || q < p)) in __xdr_inline_decode()
1339 xdr->p = q; in __xdr_inline_decode()
1340 xdr->nwords -= nwords; in __xdr_inline_decode()
1347 char *cpdest = xdr->scratch.iov_base; in xdr_copy_to_scratch()
1348 size_t cplen = (char *)xdr->end - (char *)xdr->p; in xdr_copy_to_scratch()
1350 if (nbytes > xdr->scratch.iov_len) in xdr_copy_to_scratch()
1359 nbytes -= cplen; in xdr_copy_to_scratch()
1364 return xdr->scratch.iov_base; in xdr_copy_to_scratch()
1371 * xdr_inline_decode - Retrieve XDR data to decode
1373 * @nbytes: number of bytes of data to decode
1376 * 'nbytes' more bytes of data starting at the current position.
1385 return xdr->p; in xdr_inline_decode()
1386 if (xdr->p == xdr->end && !xdr_set_next_buffer(xdr)) in xdr_inline_decode()
1400 struct xdr_buf *buf = xdr->buf; in xdr_realign_pages()
1401 struct kvec *iov = buf->head; in xdr_realign_pages()
1406 if (iov->iov_len > cur) { in xdr_realign_pages()
1409 xdr_set_page(xdr, 0, buf->page_len); in xdr_realign_pages()
1415 struct xdr_buf *buf = xdr->buf; in xdr_align_pages()
1419 if (xdr->nwords == 0) in xdr_align_pages()
1423 if (nwords > xdr->nwords) { in xdr_align_pages()
1424 nwords = xdr->nwords; in xdr_align_pages()
1427 if (buf->page_len <= len) in xdr_align_pages()
1428 len = buf->page_len; in xdr_align_pages()
1429 else if (nwords < xdr->nwords) { in xdr_align_pages()
1430 /* Truncate page data and move it into the tail */ in xdr_align_pages()
1438 * xdr_read_pages - align page-based XDR data to current pointer position
1440 * @len: number of bytes of page data
1442 * Moves data beyond the current pointer position from the XDR head[] buffer
1443 * into the page list. Any data that lies beyond current position + @len
1445 * then advanced past that data to align to the next XDR object in the tail.
1458 base = (nwords << 2) - pglen; in xdr_read_pages()
1459 end = xdr_stream_remaining(xdr) - pglen; in xdr_read_pages()
1469 struct xdr_buf *buf = xdr->buf; in xdr_align_data()
1471 unsigned int shift; in xdr_align_data() local
1476 if (from >= buf->page_len + buf->tail->iov_len) in xdr_align_data()
1478 if (from + buf->head->iov_len >= buf->len) in xdr_align_data()
1481 len = buf->len - buf->head->iov_len; in xdr_align_data()
1483 /* We only shift data left! */ in xdr_align_data()
1484 if (WARN_ONCE(from < offset, "SUNRPC: misaligned data src=%u dst=%u\n", in xdr_align_data()
1487 if (WARN_ONCE(offset > buf->page_len, in xdr_align_data()
1489 offset, buf->page_len)) in xdr_align_data()
1492 /* Move page data to the left */ in xdr_align_data()
1493 shift = from - offset; in xdr_align_data()
1494 xdr_buf_pages_shift_left(buf, from, len, shift); in xdr_align_data()
1499 bytes -= length; in xdr_align_data()
1501 xdr->buf->len -= shift; in xdr_align_data()
1510 struct xdr_buf *buf = xdr->buf; in xdr_expand_hole()
1511 unsigned int from, to, shift; in xdr_expand_hole() local
1519 unsigned int buflen = buf->len - buf->head->iov_len; in xdr_expand_hole()
1520 shift = to - from; in xdr_expand_hole()
1521 xdr_buf_try_expand(buf, shift); in xdr_expand_hole()
1522 xdr_buf_pages_shift_right(buf, from, buflen, shift); in xdr_expand_hole()
1533 * xdr_enter_page - decode data from the XDR page
1535 * @len: number of bytes of page data
1537 * Moves data beyond the current pointer position from the XDR head[] buffer
1538 * into the page list. Any data that lies beyond current position + "len"
1558 buf->head[0] = *iov; in xdr_buf_from_iov()
1559 buf->tail[0] = empty_iov; in xdr_buf_from_iov()
1560 buf->page_len = 0; in xdr_buf_from_iov()
1561 buf->buflen = buf->len = iov->iov_len; in xdr_buf_from_iov()
1566 * xdr_buf_subsegment - set subbuf to a portion of buf
1577 * Returns -1 if base of length are out of bounds.
1582 subbuf->buflen = subbuf->len = len; in xdr_buf_subsegment()
1583 if (base < buf->head[0].iov_len) { in xdr_buf_subsegment()
1584 subbuf->head[0].iov_base = buf->head[0].iov_base + base; in xdr_buf_subsegment()
1585 subbuf->head[0].iov_len = min_t(unsigned int, len, in xdr_buf_subsegment()
1586 buf->head[0].iov_len - base); in xdr_buf_subsegment()
1587 len -= subbuf->head[0].iov_len; in xdr_buf_subsegment()
1590 base -= buf->head[0].iov_len; in xdr_buf_subsegment()
1591 subbuf->head[0].iov_base = buf->head[0].iov_base; in xdr_buf_subsegment()
1592 subbuf->head[0].iov_len = 0; in xdr_buf_subsegment()
1595 if (base < buf->page_len) { in xdr_buf_subsegment()
1596 subbuf->page_len = min(buf->page_len - base, len); in xdr_buf_subsegment()
1597 base += buf->page_base; in xdr_buf_subsegment()
1598 subbuf->page_base = base & ~PAGE_MASK; in xdr_buf_subsegment()
1599 subbuf->pages = &buf->pages[base >> PAGE_SHIFT]; in xdr_buf_subsegment()
1600 len -= subbuf->page_len; in xdr_buf_subsegment()
1603 base -= buf->page_len; in xdr_buf_subsegment()
1604 subbuf->pages = buf->pages; in xdr_buf_subsegment()
1605 subbuf->page_base = 0; in xdr_buf_subsegment()
1606 subbuf->page_len = 0; in xdr_buf_subsegment()
1609 if (base < buf->tail[0].iov_len) { in xdr_buf_subsegment()
1610 subbuf->tail[0].iov_base = buf->tail[0].iov_base + base; in xdr_buf_subsegment()
1611 subbuf->tail[0].iov_len = min_t(unsigned int, len, in xdr_buf_subsegment()
1612 buf->tail[0].iov_len - base); in xdr_buf_subsegment()
1613 len -= subbuf->tail[0].iov_len; in xdr_buf_subsegment()
1616 base -= buf->tail[0].iov_len; in xdr_buf_subsegment()
1617 subbuf->tail[0].iov_base = buf->tail[0].iov_base; in xdr_buf_subsegment()
1618 subbuf->tail[0].iov_len = 0; in xdr_buf_subsegment()
1622 return -1; in xdr_buf_subsegment()
1628 * xdr_stream_subsegment - set @subbuf to a portion of @xdr
1647 if (xdr_buf_subsegment(xdr->buf, subbuf, xdr_stream_pos(xdr), nbytes)) in xdr_stream_subsegment()
1650 if (subbuf->head[0].iov_len) in xdr_stream_subsegment()
1651 if (!__xdr_inline_decode(xdr, subbuf->head[0].iov_len)) in xdr_stream_subsegment()
1654 remaining = subbuf->page_len; in xdr_stream_subsegment()
1655 offset = subbuf->page_base; in xdr_stream_subsegment()
1657 len = min_t(unsigned int, remaining, PAGE_SIZE) - offset; in xdr_stream_subsegment()
1659 if (xdr->p == xdr->end && !xdr_set_next_buffer(xdr)) in xdr_stream_subsegment()
1664 remaining -= len; in xdr_stream_subsegment()
1673 * xdr_buf_trim - lop at most "len" bytes off the end of "buf"
1687 if (buf->tail[0].iov_len) { in xdr_buf_trim()
1688 cur = min_t(size_t, buf->tail[0].iov_len, trim); in xdr_buf_trim()
1689 buf->tail[0].iov_len -= cur; in xdr_buf_trim()
1690 trim -= cur; in xdr_buf_trim()
1695 if (buf->page_len) { in xdr_buf_trim()
1696 cur = min_t(unsigned int, buf->page_len, trim); in xdr_buf_trim()
1697 buf->page_len -= cur; in xdr_buf_trim()
1698 trim -= cur; in xdr_buf_trim()
1703 if (buf->head[0].iov_len) { in xdr_buf_trim()
1704 cur = min_t(size_t, buf->head[0].iov_len, trim); in xdr_buf_trim()
1705 buf->head[0].iov_len -= cur; in xdr_buf_trim()
1706 trim -= cur; in xdr_buf_trim()
1709 buf->len -= (len - trim); in xdr_buf_trim()
1718 this_len = min_t(unsigned int, len, subbuf->head[0].iov_len); in __read_bytes_from_xdr_buf()
1719 memcpy(obj, subbuf->head[0].iov_base, this_len); in __read_bytes_from_xdr_buf()
1720 len -= this_len; in __read_bytes_from_xdr_buf()
1722 this_len = min_t(unsigned int, len, subbuf->page_len); in __read_bytes_from_xdr_buf()
1723 _copy_from_pages(obj, subbuf->pages, subbuf->page_base, this_len); in __read_bytes_from_xdr_buf()
1724 len -= this_len; in __read_bytes_from_xdr_buf()
1726 this_len = min_t(unsigned int, len, subbuf->tail[0].iov_len); in __read_bytes_from_xdr_buf()
1727 memcpy(obj, subbuf->tail[0].iov_base, this_len); in __read_bytes_from_xdr_buf()
1750 this_len = min_t(unsigned int, len, subbuf->head[0].iov_len); in __write_bytes_to_xdr_buf()
1751 memcpy(subbuf->head[0].iov_base, obj, this_len); in __write_bytes_to_xdr_buf()
1752 len -= this_len; in __write_bytes_to_xdr_buf()
1754 this_len = min_t(unsigned int, len, subbuf->page_len); in __write_bytes_to_xdr_buf()
1755 _copy_to_pages(subbuf->pages, subbuf->page_base, obj, this_len); in __write_bytes_to_xdr_buf()
1756 len -= this_len; in __write_bytes_to_xdr_buf()
1758 this_len = min_t(unsigned int, len, subbuf->tail[0].iov_len); in __write_bytes_to_xdr_buf()
1759 memcpy(subbuf->tail[0].iov_base, obj, this_len); in __write_bytes_to_xdr_buf()
1808 if (xdr_encode_word(buf, base, desc->array_len) != 0) in xdr_xcode_array2()
1809 return -EINVAL; in xdr_xcode_array2()
1811 if (xdr_decode_word(buf, base, &desc->array_len) != 0 || in xdr_xcode_array2()
1812 desc->array_len > desc->array_maxlen || in xdr_xcode_array2()
1813 (unsigned long) base + 4 + desc->array_len * in xdr_xcode_array2()
1814 desc->elem_size > buf->len) in xdr_xcode_array2()
1815 return -EINVAL; in xdr_xcode_array2()
1819 if (!desc->xcode) in xdr_xcode_array2()
1822 todo = desc->array_len * desc->elem_size; in xdr_xcode_array2()
1825 if (todo && base < buf->head->iov_len) { in xdr_xcode_array2()
1826 c = buf->head->iov_base + base; in xdr_xcode_array2()
1828 buf->head->iov_len - base); in xdr_xcode_array2()
1829 todo -= avail_here; in xdr_xcode_array2()
1831 while (avail_here >= desc->elem_size) { in xdr_xcode_array2()
1832 err = desc->xcode(desc, c); in xdr_xcode_array2()
1835 c += desc->elem_size; in xdr_xcode_array2()
1836 avail_here -= desc->elem_size; in xdr_xcode_array2()
1840 elem = kmalloc(desc->elem_size, GFP_KERNEL); in xdr_xcode_array2()
1841 err = -ENOMEM; in xdr_xcode_array2()
1846 err = desc->xcode(desc, elem); in xdr_xcode_array2()
1854 base = buf->head->iov_len; /* align to start of pages */ in xdr_xcode_array2()
1858 base -= buf->head->iov_len; in xdr_xcode_array2()
1859 if (todo && base < buf->page_len) { in xdr_xcode_array2()
1862 avail_here = min(todo, buf->page_len - base); in xdr_xcode_array2()
1863 todo -= avail_here; in xdr_xcode_array2()
1865 base += buf->page_base; in xdr_xcode_array2()
1866 ppages = buf->pages + (base >> PAGE_SHIFT); in xdr_xcode_array2()
1868 avail_page = min_t(unsigned int, PAGE_SIZE - base, in xdr_xcode_array2()
1873 avail_here -= avail_page; in xdr_xcode_array2()
1874 if (copied || avail_page < desc->elem_size) { in xdr_xcode_array2()
1876 desc->elem_size - copied); in xdr_xcode_array2()
1878 elem = kmalloc(desc->elem_size, in xdr_xcode_array2()
1880 err = -ENOMEM; in xdr_xcode_array2()
1886 err = desc->xcode(desc, elem); in xdr_xcode_array2()
1892 if (copied == desc->elem_size) in xdr_xcode_array2()
1897 if (copied == desc->elem_size) { in xdr_xcode_array2()
1898 err = desc->xcode(desc, elem); in xdr_xcode_array2()
1904 avail_page -= l; in xdr_xcode_array2()
1907 while (avail_page >= desc->elem_size) { in xdr_xcode_array2()
1908 err = desc->xcode(desc, c); in xdr_xcode_array2()
1911 c += desc->elem_size; in xdr_xcode_array2()
1912 avail_page -= desc->elem_size; in xdr_xcode_array2()
1916 desc->elem_size - copied); in xdr_xcode_array2()
1918 elem = kmalloc(desc->elem_size, in xdr_xcode_array2()
1920 err = -ENOMEM; in xdr_xcode_array2()
1926 err = desc->xcode(desc, elem); in xdr_xcode_array2()
1932 if (copied == desc->elem_size) in xdr_xcode_array2()
1937 if (copied == desc->elem_size) { in xdr_xcode_array2()
1938 err = desc->xcode(desc, elem); in xdr_xcode_array2()
1954 base = buf->page_len; /* align to start of tail */ in xdr_xcode_array2()
1958 base -= buf->page_len; in xdr_xcode_array2()
1960 c = buf->tail->iov_base + base; in xdr_xcode_array2()
1962 unsigned int l = desc->elem_size - copied; in xdr_xcode_array2()
1968 err = desc->xcode(desc, elem); in xdr_xcode_array2()
1972 todo -= l; in xdr_xcode_array2()
1976 err = desc->xcode(desc, c); in xdr_xcode_array2()
1979 c += desc->elem_size; in xdr_xcode_array2()
1980 todo -= desc->elem_size; in xdr_xcode_array2()
1995 if (base >= buf->len) in xdr_decode_array2()
1996 return -EINVAL; in xdr_decode_array2()
2005 if ((unsigned long) base + 4 + desc->array_len * desc->elem_size > in xdr_encode_array2()
2006 buf->head->iov_len + buf->page_len + buf->tail->iov_len) in xdr_encode_array2()
2007 return -EINVAL; in xdr_encode_array2()
2015 int (*actor)(struct scatterlist *, void *), void *data) in xdr_process_buf() argument
2023 if (offset >= buf->head[0].iov_len) { in xdr_process_buf()
2024 offset -= buf->head[0].iov_len; in xdr_process_buf()
2026 thislen = buf->head[0].iov_len - offset; in xdr_process_buf()
2029 sg_set_buf(sg, buf->head[0].iov_base + offset, thislen); in xdr_process_buf()
2030 ret = actor(sg, data); in xdr_process_buf()
2034 len -= thislen; in xdr_process_buf()
2039 if (offset >= buf->page_len) { in xdr_process_buf()
2040 offset -= buf->page_len; in xdr_process_buf()
2042 page_len = buf->page_len - offset; in xdr_process_buf()
2045 len -= page_len; in xdr_process_buf()
2046 page_offset = (offset + buf->page_base) & (PAGE_SIZE - 1); in xdr_process_buf()
2047 i = (offset + buf->page_base) >> PAGE_SHIFT; in xdr_process_buf()
2048 thislen = PAGE_SIZE - page_offset; in xdr_process_buf()
2052 sg_set_page(sg, buf->pages[i], thislen, page_offset); in xdr_process_buf()
2053 ret = actor(sg, data); in xdr_process_buf()
2056 page_len -= thislen; in xdr_process_buf()
2065 if (offset < buf->tail[0].iov_len) { in xdr_process_buf()
2066 thislen = buf->tail[0].iov_len - offset; in xdr_process_buf()
2069 sg_set_buf(sg, buf->tail[0].iov_base + offset, thislen); in xdr_process_buf()
2070 ret = actor(sg, data); in xdr_process_buf()
2071 len -= thislen; in xdr_process_buf()
2074 ret = -EINVAL; in xdr_process_buf()
2081 * xdr_stream_decode_opaque - Decode variable length opaque
2083 * @ptr: location to store opaque data
2088 * %-EBADMSG on XDR buffer overflow
2089 * %-EMSGSIZE on overflow of storage buffer @ptr
2105 * xdr_stream_decode_opaque_dup - Decode and duplicate variable length opaque
2107 * @ptr: location to store pointer to opaque data
2113 * %-EBADMSG on XDR buffer overflow
2114 * %-EMSGSIZE if the size of the object would exceed @maxlen
2115 * %-ENOMEM on memory allocation failure
2128 ret = -ENOMEM; in xdr_stream_decode_opaque_dup()
2136 * xdr_stream_decode_string - Decode variable length string
2142 * On success, returns length of NUL-terminated string stored in *@str
2143 * %-EBADMSG on XDR buffer overflow
2144 * %-EMSGSIZE on overflow of storage buffer @str
2163 * xdr_stream_decode_string_dup - Decode and duplicate variable length string
2170 * On success, returns length of NUL-terminated string stored in *@ptr
2171 * %-EBADMSG on XDR buffer overflow
2172 * %-EMSGSIZE if the size of the string would exceed @maxlen
2173 * %-ENOMEM on memory allocation failure
2188 ret = -ENOMEM; in xdr_stream_decode_string_dup()