Lines Matching refs:buf

116  * @buf: XDR buffer where string resides
121 xdr_terminate_string(struct xdr_buf *buf, const u32 len)
125 kaddr = kmap_atomic(buf->pages[0]);
126 kaddr[buf->page_base + len] = '\0';
137 char *buf = (char *)head->iov_base;
146 tail->iov_base = buf + offset;
308 * @buf: xdr_buf
309 * @len: bytes to remove from buf->head[0]
311 * Shrinks XDR buffer's header kvec buf->head[0] by
316 xdr_shrink_bufhead(struct xdr_buf *buf, size_t len)
320 unsigned int pglen = buf->page_len;
322 tail = buf->tail;
323 head = buf->head;
347 buf->pages,
348 buf->page_base + pglen + offs - len,
364 _shift_data_right_pages(buf->pages,
365 buf->page_base + len,
366 buf->page_base,
371 _copy_to_pages(buf->pages, buf->page_base,
376 buf->buflen -= len;
378 if (buf->len > buf->buflen)
379 buf->len = buf->buflen;
384 * @buf: xdr_buf
385 * @len: bytes to remove from buf->pages
387 * Shrinks XDR buffer's page array buf->pages by
392 xdr_shrink_pagelen(struct xdr_buf *buf, size_t len)
396 unsigned int pglen = buf->page_len;
399 tail = buf->tail;
402 tailbuf_len = buf->buflen - buf->head->iov_len - buf->page_len;
420 buf->pages, buf->page_base + pglen - len,
423 buf->page_len -= len;
424 buf->buflen -= len;
426 if (buf->len > buf->buflen)
427 buf->len = buf->buflen;
431 xdr_shift_buf(struct xdr_buf *buf, size_t len)
433 xdr_shrink_bufhead(buf, len);
443 return (unsigned int)(XDR_QUADLEN(xdr->buf->len) - xdr->nwords) << 2;
450 * @buf: pointer to XDR buffer in which to encode data
460 void xdr_init_encode(struct xdr_stream *xdr, struct xdr_buf *buf, __be32 *p)
462 struct kvec *iov = buf->head;
463 int scratch_len = buf->buflen - buf->page_len - buf->tail[0].iov_len;
467 xdr->buf = buf;
479 buf->len += len;
521 if (xdr->buf->len + nbytes > xdr->buf->buflen)
528 xdr->buf->page_len += frag1bytes;
546 space_left = xdr->buf->buflen - xdr->buf->len;
548 xdr->buf->page_len += frag2bytes;
549 xdr->buf->len += nbytes;
578 xdr->buf->page_len += nbytes;
579 xdr->buf->len += nbytes;
589 * Truncates the xdr stream, so that xdr->buf->len == len,
605 struct xdr_buf *buf = xdr->buf;
606 struct kvec *head = buf->head;
607 struct kvec *tail = buf->tail;
611 if (len > buf->len) {
617 fraglen = min_t(int, buf->len - len, tail->iov_len);
619 buf->len -= fraglen;
620 if (tail->iov_len && buf->len == len) {
626 fraglen = min_t(int, buf->len - len, buf->page_len);
627 buf->page_len -= fraglen;
628 buf->len -= fraglen;
630 new = buf->page_base + buf->page_len;
634 if (buf->page_len && buf->len == len) {
647 buf->len = len;
649 xdr->iov = buf->head;
661 * and does nothing. Otherwise, adjusts xdr->buf->buflen to newbuflen
667 struct xdr_buf *buf = xdr->buf;
669 int end_offset = buf->len + left_in_this_buf;
671 if (newbuflen < 0 || newbuflen < buf->len)
673 if (newbuflen > buf->buflen)
677 buf->buflen = newbuflen;
693 struct xdr_buf *buf = xdr->buf;
694 struct kvec *iov = buf->tail;
695 buf->pages = pages;
696 buf->page_base = base;
697 buf->page_len = len;
712 buf->buflen += len;
713 buf->len += len;
737 maxlen = xdr->buf->page_len;
744 base += xdr->buf->page_base;
747 xdr->page_ptr = &xdr->buf->pages[pgnr];
765 newbase = (1 + xdr->page_ptr - xdr->buf->pages) << PAGE_SHIFT;
766 newbase -= xdr->buf->page_base;
769 xdr_set_iov(xdr, xdr->buf->tail, xdr->buf->len);
776 else if (xdr->iov == xdr->buf->head) {
778 xdr_set_iov(xdr, xdr->buf->tail, xdr->buf->len);
786 * @buf: pointer to XDR buffer from which to decode data
789 void xdr_init_decode(struct xdr_stream *xdr, struct xdr_buf *buf, __be32 *p)
791 xdr->buf = buf;
794 xdr->nwords = XDR_QUADLEN(buf->len);
795 if (buf->head[0].iov_len != 0)
796 xdr_set_iov(xdr, buf->head, buf->len);
797 else if (buf->page_len != 0)
798 xdr_set_page_base(xdr, 0, buf->len);
809 * @buf: pointer to XDR buffer from which to decode data
813 void xdr_init_decode_pages(struct xdr_stream *xdr, struct xdr_buf *buf,
816 memset(buf, 0, sizeof(*buf));
817 buf->pages = pages;
818 buf->page_len = len;
819 buf->buflen = len;
820 buf->len = len;
821 xdr_init_decode(xdr, buf, NULL);
841 * @buf: pointer to an empty buffer
842 * @buflen: size of 'buf'
849 void xdr_set_scratch_buffer(struct xdr_stream *xdr, void *buf, size_t buflen)
851 xdr->scratch.iov_base = buf;
903 struct xdr_buf *buf = xdr->buf;
911 iov = buf->head;
913 xdr_shrink_bufhead(buf, iov->iov_len - cur);
914 xdr->nwords = XDR_QUADLEN(buf->len - cur);
921 if (buf->page_len <= len)
922 len = buf->page_len;
925 xdr_shrink_pagelen(buf, buf->page_len - len);
926 xdr->nwords = XDR_QUADLEN(buf->len - cur);
944 struct xdr_buf *buf = xdr->buf;
955 xdr->iov = iov = buf->tail;
998 xdr_buf_from_iov(struct kvec *iov, struct xdr_buf *buf)
1000 buf->head[0] = *iov;
1001 buf->tail[0] = empty_iov;
1002 buf->page_len = 0;
1003 buf->buflen = buf->len = iov->iov_len;
1008 * xdr_buf_subsegment - set subbuf to a portion of buf
1009 * @buf: an xdr buffer
1014 * sets @subbuf to an xdr buffer representing the portion of @buf of
1017 * @buf and @subbuf may be pointers to the same struct xdr_buf.
1022 xdr_buf_subsegment(struct xdr_buf *buf, struct xdr_buf *subbuf,
1026 if (base < buf->head[0].iov_len) {
1027 subbuf->head[0].iov_base = buf->head[0].iov_base + base;
1029 buf->head[0].iov_len - base);
1033 base -= buf->head[0].iov_len;
1037 if (base < buf->page_len) {
1038 subbuf->page_len = min(buf->page_len - base, len);
1039 base += buf->page_base;
1041 subbuf->pages = &buf->pages[base >> PAGE_CACHE_SHIFT];
1045 base -= buf->page_len;
1049 if (base < buf->tail[0].iov_len) {
1050 subbuf->tail[0].iov_base = buf->tail[0].iov_base + base;
1052 buf->tail[0].iov_len - base);
1056 base -= buf->tail[0].iov_len;
1067 * xdr_buf_trim - lop at most "len" bytes off the end of "buf"
1068 * @buf: buf to be trimmed
1069 * @len: number of bytes to reduce "buf" by
1076 void xdr_buf_trim(struct xdr_buf *buf, unsigned int len)
1081 if (buf->tail[0].iov_len) {
1082 cur = min_t(size_t, buf->tail[0].iov_len, trim);
1083 buf->tail[0].iov_len -= cur;
1089 if (buf->page_len) {
1090 cur = min_t(unsigned int, buf->page_len, trim);
1091 buf->page_len -= cur;
1097 if (buf->head[0].iov_len) {
1098 cur = min_t(size_t, buf->head[0].iov_len, trim);
1099 buf->head[0].iov_len -= cur;
1103 buf->len -= (len - trim);
1125 int read_bytes_from_xdr_buf(struct xdr_buf *buf, unsigned int base, void *obj, unsigned int len)
1130 status = xdr_buf_subsegment(buf, &subbuf, base, len);
1156 int write_bytes_to_xdr_buf(struct xdr_buf *buf, unsigned int base, void *obj, unsigned int len)
1161 status = xdr_buf_subsegment(buf, &subbuf, base, len);
1170 xdr_decode_word(struct xdr_buf *buf, unsigned int base, u32 *obj)
1175 status = read_bytes_from_xdr_buf(buf, base, &raw, sizeof(*obj));
1184 xdr_encode_word(struct xdr_buf *buf, unsigned int base, u32 obj)
1188 return write_bytes_to_xdr_buf(buf, base, &raw, sizeof(obj));
1196 int xdr_buf_read_netobj(struct xdr_buf *buf, struct xdr_netobj *obj, unsigned int offset)
1200 if (xdr_decode_word(buf, offset, &obj->len))
1202 if (xdr_buf_subsegment(buf, &subbuf, offset + 4, obj->len))
1219 if (obj->len > buf->buflen - buf->len)
1221 if (buf->tail[0].iov_len != 0)
1222 obj->data = buf->tail[0].iov_base + buf->tail[0].iov_len;
1224 obj->data = buf->head[0].iov_base + buf->head[0].iov_len;
1232 xdr_xcode_array2(struct xdr_buf *buf, unsigned int base,
1241 if (xdr_encode_word(buf, base, desc->array_len) != 0)
1244 if (xdr_decode_word(buf, base, &desc->array_len) != 0 ||
1247 desc->elem_size > buf->len)
1258 if (todo && base < buf->head->iov_len) {
1259 c = buf->head->iov_base + base;
1261 buf->head->iov_len - base);
1287 base = buf->head->iov_len; /* align to start of pages */
1291 base -= buf->head->iov_len;
1292 if (todo && base < buf->page_len) {
1295 avail_here = min(todo, buf->page_len - base);
1298 base += buf->page_base;
1299 ppages = buf->pages + (base >> PAGE_CACHE_SHIFT);
1387 base = buf->page_len; /* align to start of tail */
1391 base -= buf->page_len;
1393 c = buf->tail->iov_base + base;
1426 xdr_decode_array2(struct xdr_buf *buf, unsigned int base,
1429 if (base >= buf->len)
1432 return xdr_xcode_array2(buf, base, desc, 0);
1437 xdr_encode_array2(struct xdr_buf *buf, unsigned int base,
1441 buf->head->iov_len + buf->page_len + buf->tail->iov_len)
1444 return xdr_xcode_array2(buf, base, desc, 1);
1449 xdr_process_buf(struct xdr_buf *buf, unsigned int offset, unsigned int len,
1458 if (offset >= buf->head[0].iov_len) {
1459 offset -= buf->head[0].iov_len;
1461 thislen = buf->head[0].iov_len - offset;
1464 sg_set_buf(sg, buf->head[0].iov_base + offset, thislen);
1474 if (offset >= buf->page_len) {
1475 offset -= buf->page_len;
1477 page_len = buf->page_len - offset;
1481 page_offset = (offset + buf->page_base) & (PAGE_CACHE_SIZE - 1);
1482 i = (offset + buf->page_base) >> PAGE_CACHE_SHIFT;
1487 sg_set_page(sg, buf->pages[i], thislen, page_offset);
1500 if (offset < buf->tail[0].iov_len) {
1501 thislen = buf->tail[0].iov_len - offset;
1504 sg_set_buf(sg, buf->tail[0].iov_base + offset, thislen);