Merge tag 'hwmon-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck...
[firefly-linux-kernel-4.4.55.git] / net / sunrpc / xdr.c
1 /*
2  * linux/net/sunrpc/xdr.c
3  *
4  * Generic XDR support.
5  *
6  * Copyright (C) 1995, 1996 Olaf Kirch <okir@monad.swb.de>
7  */
8
9 #include <linux/module.h>
10 #include <linux/slab.h>
11 #include <linux/types.h>
12 #include <linux/string.h>
13 #include <linux/kernel.h>
14 #include <linux/pagemap.h>
15 #include <linux/errno.h>
16 #include <linux/sunrpc/xdr.h>
17 #include <linux/sunrpc/msg_prot.h>
18
19 /*
20  * XDR functions for basic NFS types
21  */
22 __be32 *
23 xdr_encode_netobj(__be32 *p, const struct xdr_netobj *obj)
24 {
25         unsigned int    quadlen = XDR_QUADLEN(obj->len);
26
27         p[quadlen] = 0;         /* zero trailing bytes */
28         *p++ = cpu_to_be32(obj->len);
29         memcpy(p, obj->data, obj->len);
30         return p + XDR_QUADLEN(obj->len);
31 }
32 EXPORT_SYMBOL_GPL(xdr_encode_netobj);
33
34 __be32 *
35 xdr_decode_netobj(__be32 *p, struct xdr_netobj *obj)
36 {
37         unsigned int    len;
38
39         if ((len = be32_to_cpu(*p++)) > XDR_MAX_NETOBJ)
40                 return NULL;
41         obj->len  = len;
42         obj->data = (u8 *) p;
43         return p + XDR_QUADLEN(len);
44 }
45 EXPORT_SYMBOL_GPL(xdr_decode_netobj);
46
47 /**
48  * xdr_encode_opaque_fixed - Encode fixed length opaque data
49  * @p: pointer to current position in XDR buffer.
50  * @ptr: pointer to data to encode (or NULL)
51  * @nbytes: size of data.
52  *
53  * Copy the array of data of length nbytes at ptr to the XDR buffer
54  * at position p, then align to the next 32-bit boundary by padding
55  * with zero bytes (see RFC1832).
56  * Note: if ptr is NULL, only the padding is performed.
57  *
58  * Returns the updated current XDR buffer position
59  *
60  */
61 __be32 *xdr_encode_opaque_fixed(__be32 *p, const void *ptr, unsigned int nbytes)
62 {
63         if (likely(nbytes != 0)) {
64                 unsigned int quadlen = XDR_QUADLEN(nbytes);
65                 unsigned int padding = (quadlen << 2) - nbytes;
66
67                 if (ptr != NULL)
68                         memcpy(p, ptr, nbytes);
69                 if (padding != 0)
70                         memset((char *)p + nbytes, 0, padding);
71                 p += quadlen;
72         }
73         return p;
74 }
75 EXPORT_SYMBOL_GPL(xdr_encode_opaque_fixed);
76
77 /**
78  * xdr_encode_opaque - Encode variable length opaque data
79  * @p: pointer to current position in XDR buffer.
80  * @ptr: pointer to data to encode (or NULL)
81  * @nbytes: size of data.
82  *
83  * Returns the updated current XDR buffer position
84  */
85 __be32 *xdr_encode_opaque(__be32 *p, const void *ptr, unsigned int nbytes)
86 {
87         *p++ = cpu_to_be32(nbytes);
88         return xdr_encode_opaque_fixed(p, ptr, nbytes);
89 }
90 EXPORT_SYMBOL_GPL(xdr_encode_opaque);
91
92 __be32 *
93 xdr_encode_string(__be32 *p, const char *string)
94 {
95         return xdr_encode_array(p, string, strlen(string));
96 }
97 EXPORT_SYMBOL_GPL(xdr_encode_string);
98
99 __be32 *
100 xdr_decode_string_inplace(__be32 *p, char **sp,
101                           unsigned int *lenp, unsigned int maxlen)
102 {
103         u32 len;
104
105         len = be32_to_cpu(*p++);
106         if (len > maxlen)
107                 return NULL;
108         *lenp = len;
109         *sp = (char *) p;
110         return p + XDR_QUADLEN(len);
111 }
112 EXPORT_SYMBOL_GPL(xdr_decode_string_inplace);
113
114 /**
115  * xdr_terminate_string - '\0'-terminate a string residing in an xdr_buf
116  * @buf: XDR buffer where string resides
117  * @len: length of string, in bytes
118  *
119  */
120 void
121 xdr_terminate_string(struct xdr_buf *buf, const u32 len)
122 {
123         char *kaddr;
124
125         kaddr = kmap_atomic(buf->pages[0]);
126         kaddr[buf->page_base + len] = '\0';
127         kunmap_atomic(kaddr);
128 }
129 EXPORT_SYMBOL_GPL(xdr_terminate_string);
130
131 void
132 xdr_encode_pages(struct xdr_buf *xdr, struct page **pages, unsigned int base,
133                  unsigned int len)
134 {
135         struct kvec *tail = xdr->tail;
136         u32 *p;
137
138         xdr->pages = pages;
139         xdr->page_base = base;
140         xdr->page_len = len;
141
142         p = (u32 *)xdr->head[0].iov_base + XDR_QUADLEN(xdr->head[0].iov_len);
143         tail->iov_base = p;
144         tail->iov_len = 0;
145
146         if (len & 3) {
147                 unsigned int pad = 4 - (len & 3);
148
149                 *p = 0;
150                 tail->iov_base = (char *)p + (len & 3);
151                 tail->iov_len  = pad;
152                 len += pad;
153         }
154         xdr->buflen += len;
155         xdr->len += len;
156 }
157 EXPORT_SYMBOL_GPL(xdr_encode_pages);
158
159 void
160 xdr_inline_pages(struct xdr_buf *xdr, unsigned int offset,
161                  struct page **pages, unsigned int base, unsigned int len)
162 {
163         struct kvec *head = xdr->head;
164         struct kvec *tail = xdr->tail;
165         char *buf = (char *)head->iov_base;
166         unsigned int buflen = head->iov_len;
167
168         head->iov_len  = offset;
169
170         xdr->pages = pages;
171         xdr->page_base = base;
172         xdr->page_len = len;
173
174         tail->iov_base = buf + offset;
175         tail->iov_len = buflen - offset;
176
177         xdr->buflen += len;
178 }
179 EXPORT_SYMBOL_GPL(xdr_inline_pages);
180
181 /*
182  * Helper routines for doing 'memmove' like operations on a struct xdr_buf
183  */
184
185 /**
186  * _shift_data_right_pages
187  * @pages: vector of pages containing both the source and dest memory area.
188  * @pgto_base: page vector address of destination
189  * @pgfrom_base: page vector address of source
190  * @len: number of bytes to copy
191  *
192  * Note: the addresses pgto_base and pgfrom_base are both calculated in
193  *       the same way:
194  *            if a memory area starts at byte 'base' in page 'pages[i]',
195  *            then its address is given as (i << PAGE_CACHE_SHIFT) + base
196  * Also note: pgfrom_base must be < pgto_base, but the memory areas
197  *      they point to may overlap.
198  */
199 static void
200 _shift_data_right_pages(struct page **pages, size_t pgto_base,
201                 size_t pgfrom_base, size_t len)
202 {
203         struct page **pgfrom, **pgto;
204         char *vfrom, *vto;
205         size_t copy;
206
207         BUG_ON(pgto_base <= pgfrom_base);
208
209         pgto_base += len;
210         pgfrom_base += len;
211
212         pgto = pages + (pgto_base >> PAGE_CACHE_SHIFT);
213         pgfrom = pages + (pgfrom_base >> PAGE_CACHE_SHIFT);
214
215         pgto_base &= ~PAGE_CACHE_MASK;
216         pgfrom_base &= ~PAGE_CACHE_MASK;
217
218         do {
219                 /* Are any pointers crossing a page boundary? */
220                 if (pgto_base == 0) {
221                         pgto_base = PAGE_CACHE_SIZE;
222                         pgto--;
223                 }
224                 if (pgfrom_base == 0) {
225                         pgfrom_base = PAGE_CACHE_SIZE;
226                         pgfrom--;
227                 }
228
229                 copy = len;
230                 if (copy > pgto_base)
231                         copy = pgto_base;
232                 if (copy > pgfrom_base)
233                         copy = pgfrom_base;
234                 pgto_base -= copy;
235                 pgfrom_base -= copy;
236
237                 vto = kmap_atomic(*pgto);
238                 vfrom = kmap_atomic(*pgfrom);
239                 memmove(vto + pgto_base, vfrom + pgfrom_base, copy);
240                 flush_dcache_page(*pgto);
241                 kunmap_atomic(vfrom);
242                 kunmap_atomic(vto);
243
244         } while ((len -= copy) != 0);
245 }
246
247 /**
248  * _copy_to_pages
249  * @pages: array of pages
250  * @pgbase: page vector address of destination
251  * @p: pointer to source data
252  * @len: length
253  *
254  * Copies data from an arbitrary memory location into an array of pages
255  * The copy is assumed to be non-overlapping.
256  */
257 static void
258 _copy_to_pages(struct page **pages, size_t pgbase, const char *p, size_t len)
259 {
260         struct page **pgto;
261         char *vto;
262         size_t copy;
263
264         pgto = pages + (pgbase >> PAGE_CACHE_SHIFT);
265         pgbase &= ~PAGE_CACHE_MASK;
266
267         for (;;) {
268                 copy = PAGE_CACHE_SIZE - pgbase;
269                 if (copy > len)
270                         copy = len;
271
272                 vto = kmap_atomic(*pgto);
273                 memcpy(vto + pgbase, p, copy);
274                 kunmap_atomic(vto);
275
276                 len -= copy;
277                 if (len == 0)
278                         break;
279
280                 pgbase += copy;
281                 if (pgbase == PAGE_CACHE_SIZE) {
282                         flush_dcache_page(*pgto);
283                         pgbase = 0;
284                         pgto++;
285                 }
286                 p += copy;
287         }
288         flush_dcache_page(*pgto);
289 }
290
291 /**
292  * _copy_from_pages
293  * @p: pointer to destination
294  * @pages: array of pages
295  * @pgbase: offset of source data
296  * @len: length
297  *
298  * Copies data into an arbitrary memory location from an array of pages
299  * The copy is assumed to be non-overlapping.
300  */
301 void
302 _copy_from_pages(char *p, struct page **pages, size_t pgbase, size_t len)
303 {
304         struct page **pgfrom;
305         char *vfrom;
306         size_t copy;
307
308         pgfrom = pages + (pgbase >> PAGE_CACHE_SHIFT);
309         pgbase &= ~PAGE_CACHE_MASK;
310
311         do {
312                 copy = PAGE_CACHE_SIZE - pgbase;
313                 if (copy > len)
314                         copy = len;
315
316                 vfrom = kmap_atomic(*pgfrom);
317                 memcpy(p, vfrom + pgbase, copy);
318                 kunmap_atomic(vfrom);
319
320                 pgbase += copy;
321                 if (pgbase == PAGE_CACHE_SIZE) {
322                         pgbase = 0;
323                         pgfrom++;
324                 }
325                 p += copy;
326
327         } while ((len -= copy) != 0);
328 }
329 EXPORT_SYMBOL_GPL(_copy_from_pages);
330
331 /**
332  * xdr_shrink_bufhead
333  * @buf: xdr_buf
334  * @len: bytes to remove from buf->head[0]
335  *
336  * Shrinks XDR buffer's header kvec buf->head[0] by
337  * 'len' bytes. The extra data is not lost, but is instead
338  * moved into the inlined pages and/or the tail.
339  */
340 static void
341 xdr_shrink_bufhead(struct xdr_buf *buf, size_t len)
342 {
343         struct kvec *head, *tail;
344         size_t copy, offs;
345         unsigned int pglen = buf->page_len;
346
347         tail = buf->tail;
348         head = buf->head;
349         BUG_ON (len > head->iov_len);
350
351         /* Shift the tail first */
352         if (tail->iov_len != 0) {
353                 if (tail->iov_len > len) {
354                         copy = tail->iov_len - len;
355                         memmove((char *)tail->iov_base + len,
356                                         tail->iov_base, copy);
357                 }
358                 /* Copy from the inlined pages into the tail */
359                 copy = len;
360                 if (copy > pglen)
361                         copy = pglen;
362                 offs = len - copy;
363                 if (offs >= tail->iov_len)
364                         copy = 0;
365                 else if (copy > tail->iov_len - offs)
366                         copy = tail->iov_len - offs;
367                 if (copy != 0)
368                         _copy_from_pages((char *)tail->iov_base + offs,
369                                         buf->pages,
370                                         buf->page_base + pglen + offs - len,
371                                         copy);
372                 /* Do we also need to copy data from the head into the tail ? */
373                 if (len > pglen) {
374                         offs = copy = len - pglen;
375                         if (copy > tail->iov_len)
376                                 copy = tail->iov_len;
377                         memcpy(tail->iov_base,
378                                         (char *)head->iov_base +
379                                         head->iov_len - offs,
380                                         copy);
381                 }
382         }
383         /* Now handle pages */
384         if (pglen != 0) {
385                 if (pglen > len)
386                         _shift_data_right_pages(buf->pages,
387                                         buf->page_base + len,
388                                         buf->page_base,
389                                         pglen - len);
390                 copy = len;
391                 if (len > pglen)
392                         copy = pglen;
393                 _copy_to_pages(buf->pages, buf->page_base,
394                                 (char *)head->iov_base + head->iov_len - len,
395                                 copy);
396         }
397         head->iov_len -= len;
398         buf->buflen -= len;
399         /* Have we truncated the message? */
400         if (buf->len > buf->buflen)
401                 buf->len = buf->buflen;
402 }
403
404 /**
405  * xdr_shrink_pagelen
406  * @buf: xdr_buf
407  * @len: bytes to remove from buf->pages
408  *
409  * Shrinks XDR buffer's page array buf->pages by
410  * 'len' bytes. The extra data is not lost, but is instead
411  * moved into the tail.
412  */
413 static void
414 xdr_shrink_pagelen(struct xdr_buf *buf, size_t len)
415 {
416         struct kvec *tail;
417         size_t copy;
418         unsigned int pglen = buf->page_len;
419         unsigned int tailbuf_len;
420
421         tail = buf->tail;
422         BUG_ON (len > pglen);
423
424         tailbuf_len = buf->buflen - buf->head->iov_len - buf->page_len;
425
426         /* Shift the tail first */
427         if (tailbuf_len != 0) {
428                 unsigned int free_space = tailbuf_len - tail->iov_len;
429
430                 if (len < free_space)
431                         free_space = len;
432                 tail->iov_len += free_space;
433
434                 copy = len;
435                 if (tail->iov_len > len) {
436                         char *p = (char *)tail->iov_base + len;
437                         memmove(p, tail->iov_base, tail->iov_len - len);
438                 } else
439                         copy = tail->iov_len;
440                 /* Copy from the inlined pages into the tail */
441                 _copy_from_pages((char *)tail->iov_base,
442                                 buf->pages, buf->page_base + pglen - len,
443                                 copy);
444         }
445         buf->page_len -= len;
446         buf->buflen -= len;
447         /* Have we truncated the message? */
448         if (buf->len > buf->buflen)
449                 buf->len = buf->buflen;
450 }
451
452 void
453 xdr_shift_buf(struct xdr_buf *buf, size_t len)
454 {
455         xdr_shrink_bufhead(buf, len);
456 }
457 EXPORT_SYMBOL_GPL(xdr_shift_buf);
458
459 /**
460  * xdr_init_encode - Initialize a struct xdr_stream for sending data.
461  * @xdr: pointer to xdr_stream struct
462  * @buf: pointer to XDR buffer in which to encode data
463  * @p: current pointer inside XDR buffer
464  *
465  * Note: at the moment the RPC client only passes the length of our
466  *       scratch buffer in the xdr_buf's header kvec. Previously this
467  *       meant we needed to call xdr_adjust_iovec() after encoding the
468  *       data. With the new scheme, the xdr_stream manages the details
469  *       of the buffer length, and takes care of adjusting the kvec
470  *       length for us.
471  */
472 void xdr_init_encode(struct xdr_stream *xdr, struct xdr_buf *buf, __be32 *p)
473 {
474         struct kvec *iov = buf->head;
475         int scratch_len = buf->buflen - buf->page_len - buf->tail[0].iov_len;
476
477         BUG_ON(scratch_len < 0);
478         xdr->buf = buf;
479         xdr->iov = iov;
480         xdr->p = (__be32 *)((char *)iov->iov_base + iov->iov_len);
481         xdr->end = (__be32 *)((char *)iov->iov_base + scratch_len);
482         BUG_ON(iov->iov_len > scratch_len);
483
484         if (p != xdr->p && p != NULL) {
485                 size_t len;
486
487                 BUG_ON(p < xdr->p || p > xdr->end);
488                 len = (char *)p - (char *)xdr->p;
489                 xdr->p = p;
490                 buf->len += len;
491                 iov->iov_len += len;
492         }
493 }
494 EXPORT_SYMBOL_GPL(xdr_init_encode);
495
496 /**
497  * xdr_reserve_space - Reserve buffer space for sending
498  * @xdr: pointer to xdr_stream
499  * @nbytes: number of bytes to reserve
500  *
501  * Checks that we have enough buffer space to encode 'nbytes' more
502  * bytes of data. If so, update the total xdr_buf length, and
503  * adjust the length of the current kvec.
504  */
505 __be32 * xdr_reserve_space(struct xdr_stream *xdr, size_t nbytes)
506 {
507         __be32 *p = xdr->p;
508         __be32 *q;
509
510         /* align nbytes on the next 32-bit boundary */
511         nbytes += 3;
512         nbytes &= ~3;
513         q = p + (nbytes >> 2);
514         if (unlikely(q > xdr->end || q < p))
515                 return NULL;
516         xdr->p = q;
517         xdr->iov->iov_len += nbytes;
518         xdr->buf->len += nbytes;
519         return p;
520 }
521 EXPORT_SYMBOL_GPL(xdr_reserve_space);
522
523 /**
524  * xdr_write_pages - Insert a list of pages into an XDR buffer for sending
525  * @xdr: pointer to xdr_stream
526  * @pages: list of pages
527  * @base: offset of first byte
528  * @len: length of data in bytes
529  *
530  */
531 void xdr_write_pages(struct xdr_stream *xdr, struct page **pages, unsigned int base,
532                  unsigned int len)
533 {
534         struct xdr_buf *buf = xdr->buf;
535         struct kvec *iov = buf->tail;
536         buf->pages = pages;
537         buf->page_base = base;
538         buf->page_len = len;
539
540         iov->iov_base = (char *)xdr->p;
541         iov->iov_len  = 0;
542         xdr->iov = iov;
543
544         if (len & 3) {
545                 unsigned int pad = 4 - (len & 3);
546
547                 BUG_ON(xdr->p >= xdr->end);
548                 iov->iov_base = (char *)xdr->p + (len & 3);
549                 iov->iov_len  += pad;
550                 len += pad;
551                 *xdr->p++ = 0;
552         }
553         buf->buflen += len;
554         buf->len += len;
555 }
556 EXPORT_SYMBOL_GPL(xdr_write_pages);
557
558 static void xdr_set_iov(struct xdr_stream *xdr, struct kvec *iov,
559                 __be32 *p, unsigned int len)
560 {
561         if (len > iov->iov_len)
562                 len = iov->iov_len;
563         if (p == NULL)
564                 p = (__be32*)iov->iov_base;
565         xdr->p = p;
566         xdr->end = (__be32*)(iov->iov_base + len);
567         xdr->iov = iov;
568         xdr->page_ptr = NULL;
569 }
570
571 static int xdr_set_page_base(struct xdr_stream *xdr,
572                 unsigned int base, unsigned int len)
573 {
574         unsigned int pgnr;
575         unsigned int maxlen;
576         unsigned int pgoff;
577         unsigned int pgend;
578         void *kaddr;
579
580         maxlen = xdr->buf->page_len;
581         if (base >= maxlen)
582                 return -EINVAL;
583         maxlen -= base;
584         if (len > maxlen)
585                 len = maxlen;
586
587         base += xdr->buf->page_base;
588
589         pgnr = base >> PAGE_SHIFT;
590         xdr->page_ptr = &xdr->buf->pages[pgnr];
591         kaddr = page_address(*xdr->page_ptr);
592
593         pgoff = base & ~PAGE_MASK;
594         xdr->p = (__be32*)(kaddr + pgoff);
595
596         pgend = pgoff + len;
597         if (pgend > PAGE_SIZE)
598                 pgend = PAGE_SIZE;
599         xdr->end = (__be32*)(kaddr + pgend);
600         xdr->iov = NULL;
601         return 0;
602 }
603
604 static void xdr_set_next_page(struct xdr_stream *xdr)
605 {
606         unsigned int newbase;
607
608         newbase = (1 + xdr->page_ptr - xdr->buf->pages) << PAGE_SHIFT;
609         newbase -= xdr->buf->page_base;
610
611         if (xdr_set_page_base(xdr, newbase, PAGE_SIZE) < 0)
612                 xdr_set_iov(xdr, xdr->buf->tail, NULL, xdr->buf->len);
613 }
614
615 static bool xdr_set_next_buffer(struct xdr_stream *xdr)
616 {
617         if (xdr->page_ptr != NULL)
618                 xdr_set_next_page(xdr);
619         else if (xdr->iov == xdr->buf->head) {
620                 if (xdr_set_page_base(xdr, 0, PAGE_SIZE) < 0)
621                         xdr_set_iov(xdr, xdr->buf->tail, NULL, xdr->buf->len);
622         }
623         return xdr->p != xdr->end;
624 }
625
626 /**
627  * xdr_init_decode - Initialize an xdr_stream for decoding data.
628  * @xdr: pointer to xdr_stream struct
629  * @buf: pointer to XDR buffer from which to decode data
630  * @p: current pointer inside XDR buffer
631  */
632 void xdr_init_decode(struct xdr_stream *xdr, struct xdr_buf *buf, __be32 *p)
633 {
634         xdr->buf = buf;
635         xdr->scratch.iov_base = NULL;
636         xdr->scratch.iov_len = 0;
637         if (buf->head[0].iov_len != 0)
638                 xdr_set_iov(xdr, buf->head, p, buf->len);
639         else if (buf->page_len != 0)
640                 xdr_set_page_base(xdr, 0, buf->len);
641 }
642 EXPORT_SYMBOL_GPL(xdr_init_decode);
643
644 /**
645  * xdr_init_decode - Initialize an xdr_stream for decoding data.
646  * @xdr: pointer to xdr_stream struct
647  * @buf: pointer to XDR buffer from which to decode data
648  * @pages: list of pages to decode into
649  * @len: length in bytes of buffer in pages
650  */
651 void xdr_init_decode_pages(struct xdr_stream *xdr, struct xdr_buf *buf,
652                            struct page **pages, unsigned int len)
653 {
654         memset(buf, 0, sizeof(*buf));
655         buf->pages =  pages;
656         buf->page_len =  len;
657         buf->buflen =  len;
658         buf->len = len;
659         xdr_init_decode(xdr, buf, NULL);
660 }
661 EXPORT_SYMBOL_GPL(xdr_init_decode_pages);
662
663 static __be32 * __xdr_inline_decode(struct xdr_stream *xdr, size_t nbytes)
664 {
665         __be32 *p = xdr->p;
666         __be32 *q = p + XDR_QUADLEN(nbytes);
667
668         if (unlikely(q > xdr->end || q < p))
669                 return NULL;
670         xdr->p = q;
671         return p;
672 }
673
674 /**
675  * xdr_set_scratch_buffer - Attach a scratch buffer for decoding data.
676  * @xdr: pointer to xdr_stream struct
677  * @buf: pointer to an empty buffer
678  * @buflen: size of 'buf'
679  *
680  * The scratch buffer is used when decoding from an array of pages.
681  * If an xdr_inline_decode() call spans across page boundaries, then
682  * we copy the data into the scratch buffer in order to allow linear
683  * access.
684  */
685 void xdr_set_scratch_buffer(struct xdr_stream *xdr, void *buf, size_t buflen)
686 {
687         xdr->scratch.iov_base = buf;
688         xdr->scratch.iov_len = buflen;
689 }
690 EXPORT_SYMBOL_GPL(xdr_set_scratch_buffer);
691
692 static __be32 *xdr_copy_to_scratch(struct xdr_stream *xdr, size_t nbytes)
693 {
694         __be32 *p;
695         void *cpdest = xdr->scratch.iov_base;
696         size_t cplen = (char *)xdr->end - (char *)xdr->p;
697
698         if (nbytes > xdr->scratch.iov_len)
699                 return NULL;
700         memcpy(cpdest, xdr->p, cplen);
701         cpdest += cplen;
702         nbytes -= cplen;
703         if (!xdr_set_next_buffer(xdr))
704                 return NULL;
705         p = __xdr_inline_decode(xdr, nbytes);
706         if (p == NULL)
707                 return NULL;
708         memcpy(cpdest, p, nbytes);
709         return xdr->scratch.iov_base;
710 }
711
712 /**
713  * xdr_inline_decode - Retrieve XDR data to decode
714  * @xdr: pointer to xdr_stream struct
715  * @nbytes: number of bytes of data to decode
716  *
717  * Check if the input buffer is long enough to enable us to decode
718  * 'nbytes' more bytes of data starting at the current position.
719  * If so return the current pointer, then update the current
720  * pointer position.
721  */
722 __be32 * xdr_inline_decode(struct xdr_stream *xdr, size_t nbytes)
723 {
724         __be32 *p;
725
726         if (nbytes == 0)
727                 return xdr->p;
728         if (xdr->p == xdr->end && !xdr_set_next_buffer(xdr))
729                 return NULL;
730         p = __xdr_inline_decode(xdr, nbytes);
731         if (p != NULL)
732                 return p;
733         return xdr_copy_to_scratch(xdr, nbytes);
734 }
735 EXPORT_SYMBOL_GPL(xdr_inline_decode);
736
737 /**
738  * xdr_read_pages - Ensure page-based XDR data to decode is aligned at current pointer position
739  * @xdr: pointer to xdr_stream struct
740  * @len: number of bytes of page data
741  *
742  * Moves data beyond the current pointer position from the XDR head[] buffer
743  * into the page list. Any data that lies beyond current position + "len"
744  * bytes is moved into the XDR tail[].
745  */
746 void xdr_read_pages(struct xdr_stream *xdr, unsigned int len)
747 {
748         struct xdr_buf *buf = xdr->buf;
749         struct kvec *iov;
750         ssize_t shift;
751         unsigned int end;
752         int padding;
753
754         /* Realign pages to current pointer position */
755         iov  = buf->head;
756         shift = iov->iov_len + (char *)iov->iov_base - (char *)xdr->p;
757         if (shift > 0)
758                 xdr_shrink_bufhead(buf, shift);
759
760         /* Truncate page data and move it into the tail */
761         if (buf->page_len > len)
762                 xdr_shrink_pagelen(buf, buf->page_len - len);
763         padding = (XDR_QUADLEN(len) << 2) - len;
764         xdr->iov = iov = buf->tail;
765         /* Compute remaining message length.  */
766         end = iov->iov_len;
767         shift = buf->buflen - buf->len;
768         if (shift < end)
769                 end -= shift;
770         else if (shift > 0)
771                 end = 0;
772         /*
773          * Position current pointer at beginning of tail, and
774          * set remaining message length.
775          */
776         xdr->p = (__be32 *)((char *)iov->iov_base + padding);
777         xdr->end = (__be32 *)((char *)iov->iov_base + end);
778 }
779 EXPORT_SYMBOL_GPL(xdr_read_pages);
780
781 /**
782  * xdr_enter_page - decode data from the XDR page
783  * @xdr: pointer to xdr_stream struct
784  * @len: number of bytes of page data
785  *
786  * Moves data beyond the current pointer position from the XDR head[] buffer
787  * into the page list. Any data that lies beyond current position + "len"
788  * bytes is moved into the XDR tail[]. The current pointer is then
789  * repositioned at the beginning of the first XDR page.
790  */
791 void xdr_enter_page(struct xdr_stream *xdr, unsigned int len)
792 {
793         xdr_read_pages(xdr, len);
794         /*
795          * Position current pointer at beginning of tail, and
796          * set remaining message length.
797          */
798         xdr_set_page_base(xdr, 0, len);
799 }
800 EXPORT_SYMBOL_GPL(xdr_enter_page);
801
802 static struct kvec empty_iov = {.iov_base = NULL, .iov_len = 0};
803
804 void
805 xdr_buf_from_iov(struct kvec *iov, struct xdr_buf *buf)
806 {
807         buf->head[0] = *iov;
808         buf->tail[0] = empty_iov;
809         buf->page_len = 0;
810         buf->buflen = buf->len = iov->iov_len;
811 }
812 EXPORT_SYMBOL_GPL(xdr_buf_from_iov);
813
814 /* Sets subbuf to the portion of buf of length len beginning base bytes
815  * from the start of buf. Returns -1 if base of length are out of bounds. */
816 int
817 xdr_buf_subsegment(struct xdr_buf *buf, struct xdr_buf *subbuf,
818                         unsigned int base, unsigned int len)
819 {
820         subbuf->buflen = subbuf->len = len;
821         if (base < buf->head[0].iov_len) {
822                 subbuf->head[0].iov_base = buf->head[0].iov_base + base;
823                 subbuf->head[0].iov_len = min_t(unsigned int, len,
824                                                 buf->head[0].iov_len - base);
825                 len -= subbuf->head[0].iov_len;
826                 base = 0;
827         } else {
828                 subbuf->head[0].iov_base = NULL;
829                 subbuf->head[0].iov_len = 0;
830                 base -= buf->head[0].iov_len;
831         }
832
833         if (base < buf->page_len) {
834                 subbuf->page_len = min(buf->page_len - base, len);
835                 base += buf->page_base;
836                 subbuf->page_base = base & ~PAGE_CACHE_MASK;
837                 subbuf->pages = &buf->pages[base >> PAGE_CACHE_SHIFT];
838                 len -= subbuf->page_len;
839                 base = 0;
840         } else {
841                 base -= buf->page_len;
842                 subbuf->page_len = 0;
843         }
844
845         if (base < buf->tail[0].iov_len) {
846                 subbuf->tail[0].iov_base = buf->tail[0].iov_base + base;
847                 subbuf->tail[0].iov_len = min_t(unsigned int, len,
848                                                 buf->tail[0].iov_len - base);
849                 len -= subbuf->tail[0].iov_len;
850                 base = 0;
851         } else {
852                 subbuf->tail[0].iov_base = NULL;
853                 subbuf->tail[0].iov_len = 0;
854                 base -= buf->tail[0].iov_len;
855         }
856
857         if (base || len)
858                 return -1;
859         return 0;
860 }
861 EXPORT_SYMBOL_GPL(xdr_buf_subsegment);
862
863 static void __read_bytes_from_xdr_buf(struct xdr_buf *subbuf, void *obj, unsigned int len)
864 {
865         unsigned int this_len;
866
867         this_len = min_t(unsigned int, len, subbuf->head[0].iov_len);
868         memcpy(obj, subbuf->head[0].iov_base, this_len);
869         len -= this_len;
870         obj += this_len;
871         this_len = min_t(unsigned int, len, subbuf->page_len);
872         if (this_len)
873                 _copy_from_pages(obj, subbuf->pages, subbuf->page_base, this_len);
874         len -= this_len;
875         obj += this_len;
876         this_len = min_t(unsigned int, len, subbuf->tail[0].iov_len);
877         memcpy(obj, subbuf->tail[0].iov_base, this_len);
878 }
879
880 /* obj is assumed to point to allocated memory of size at least len: */
881 int read_bytes_from_xdr_buf(struct xdr_buf *buf, unsigned int base, void *obj, unsigned int len)
882 {
883         struct xdr_buf subbuf;
884         int status;
885
886         status = xdr_buf_subsegment(buf, &subbuf, base, len);
887         if (status != 0)
888                 return status;
889         __read_bytes_from_xdr_buf(&subbuf, obj, len);
890         return 0;
891 }
892 EXPORT_SYMBOL_GPL(read_bytes_from_xdr_buf);
893
894 static void __write_bytes_to_xdr_buf(struct xdr_buf *subbuf, void *obj, unsigned int len)
895 {
896         unsigned int this_len;
897
898         this_len = min_t(unsigned int, len, subbuf->head[0].iov_len);
899         memcpy(subbuf->head[0].iov_base, obj, this_len);
900         len -= this_len;
901         obj += this_len;
902         this_len = min_t(unsigned int, len, subbuf->page_len);
903         if (this_len)
904                 _copy_to_pages(subbuf->pages, subbuf->page_base, obj, this_len);
905         len -= this_len;
906         obj += this_len;
907         this_len = min_t(unsigned int, len, subbuf->tail[0].iov_len);
908         memcpy(subbuf->tail[0].iov_base, obj, this_len);
909 }
910
911 /* obj is assumed to point to allocated memory of size at least len: */
912 int write_bytes_to_xdr_buf(struct xdr_buf *buf, unsigned int base, void *obj, unsigned int len)
913 {
914         struct xdr_buf subbuf;
915         int status;
916
917         status = xdr_buf_subsegment(buf, &subbuf, base, len);
918         if (status != 0)
919                 return status;
920         __write_bytes_to_xdr_buf(&subbuf, obj, len);
921         return 0;
922 }
923 EXPORT_SYMBOL_GPL(write_bytes_to_xdr_buf);
924
925 int
926 xdr_decode_word(struct xdr_buf *buf, unsigned int base, u32 *obj)
927 {
928         __be32  raw;
929         int     status;
930
931         status = read_bytes_from_xdr_buf(buf, base, &raw, sizeof(*obj));
932         if (status)
933                 return status;
934         *obj = be32_to_cpu(raw);
935         return 0;
936 }
937 EXPORT_SYMBOL_GPL(xdr_decode_word);
938
939 int
940 xdr_encode_word(struct xdr_buf *buf, unsigned int base, u32 obj)
941 {
942         __be32  raw = cpu_to_be32(obj);
943
944         return write_bytes_to_xdr_buf(buf, base, &raw, sizeof(obj));
945 }
946 EXPORT_SYMBOL_GPL(xdr_encode_word);
947
948 /* If the netobj starting offset bytes from the start of xdr_buf is contained
949  * entirely in the head or the tail, set object to point to it; otherwise
950  * try to find space for it at the end of the tail, copy it there, and
951  * set obj to point to it. */
952 int xdr_buf_read_netobj(struct xdr_buf *buf, struct xdr_netobj *obj, unsigned int offset)
953 {
954         struct xdr_buf subbuf;
955
956         if (xdr_decode_word(buf, offset, &obj->len))
957                 return -EFAULT;
958         if (xdr_buf_subsegment(buf, &subbuf, offset + 4, obj->len))
959                 return -EFAULT;
960
961         /* Is the obj contained entirely in the head? */
962         obj->data = subbuf.head[0].iov_base;
963         if (subbuf.head[0].iov_len == obj->len)
964                 return 0;
965         /* ..or is the obj contained entirely in the tail? */
966         obj->data = subbuf.tail[0].iov_base;
967         if (subbuf.tail[0].iov_len == obj->len)
968                 return 0;
969
970         /* use end of tail as storage for obj:
971          * (We don't copy to the beginning because then we'd have
972          * to worry about doing a potentially overlapping copy.
973          * This assumes the object is at most half the length of the
974          * tail.) */
975         if (obj->len > buf->buflen - buf->len)
976                 return -ENOMEM;
977         if (buf->tail[0].iov_len != 0)
978                 obj->data = buf->tail[0].iov_base + buf->tail[0].iov_len;
979         else
980                 obj->data = buf->head[0].iov_base + buf->head[0].iov_len;
981         __read_bytes_from_xdr_buf(&subbuf, obj->data, obj->len);
982         return 0;
983 }
984 EXPORT_SYMBOL_GPL(xdr_buf_read_netobj);
985
986 /* Returns 0 on success, or else a negative error code. */
987 static int
988 xdr_xcode_array2(struct xdr_buf *buf, unsigned int base,
989                  struct xdr_array2_desc *desc, int encode)
990 {
991         char *elem = NULL, *c;
992         unsigned int copied = 0, todo, avail_here;
993         struct page **ppages = NULL;
994         int err;
995
996         if (encode) {
997                 if (xdr_encode_word(buf, base, desc->array_len) != 0)
998                         return -EINVAL;
999         } else {
1000                 if (xdr_decode_word(buf, base, &desc->array_len) != 0 ||
1001                     desc->array_len > desc->array_maxlen ||
1002                     (unsigned long) base + 4 + desc->array_len *
1003                                     desc->elem_size > buf->len)
1004                         return -EINVAL;
1005         }
1006         base += 4;
1007
1008         if (!desc->xcode)
1009                 return 0;
1010
1011         todo = desc->array_len * desc->elem_size;
1012
1013         /* process head */
1014         if (todo && base < buf->head->iov_len) {
1015                 c = buf->head->iov_base + base;
1016                 avail_here = min_t(unsigned int, todo,
1017                                    buf->head->iov_len - base);
1018                 todo -= avail_here;
1019
1020                 while (avail_here >= desc->elem_size) {
1021                         err = desc->xcode(desc, c);
1022                         if (err)
1023                                 goto out;
1024                         c += desc->elem_size;
1025                         avail_here -= desc->elem_size;
1026                 }
1027                 if (avail_here) {
1028                         if (!elem) {
1029                                 elem = kmalloc(desc->elem_size, GFP_KERNEL);
1030                                 err = -ENOMEM;
1031                                 if (!elem)
1032                                         goto out;
1033                         }
1034                         if (encode) {
1035                                 err = desc->xcode(desc, elem);
1036                                 if (err)
1037                                         goto out;
1038                                 memcpy(c, elem, avail_here);
1039                         } else
1040                                 memcpy(elem, c, avail_here);
1041                         copied = avail_here;
1042                 }
1043                 base = buf->head->iov_len;  /* align to start of pages */
1044         }
1045
1046         /* process pages array */
1047         base -= buf->head->iov_len;
1048         if (todo && base < buf->page_len) {
1049                 unsigned int avail_page;
1050
1051                 avail_here = min(todo, buf->page_len - base);
1052                 todo -= avail_here;
1053
1054                 base += buf->page_base;
1055                 ppages = buf->pages + (base >> PAGE_CACHE_SHIFT);
1056                 base &= ~PAGE_CACHE_MASK;
1057                 avail_page = min_t(unsigned int, PAGE_CACHE_SIZE - base,
1058                                         avail_here);
1059                 c = kmap(*ppages) + base;
1060
1061                 while (avail_here) {
1062                         avail_here -= avail_page;
1063                         if (copied || avail_page < desc->elem_size) {
1064                                 unsigned int l = min(avail_page,
1065                                         desc->elem_size - copied);
1066                                 if (!elem) {
1067                                         elem = kmalloc(desc->elem_size,
1068                                                        GFP_KERNEL);
1069                                         err = -ENOMEM;
1070                                         if (!elem)
1071                                                 goto out;
1072                                 }
1073                                 if (encode) {
1074                                         if (!copied) {
1075                                                 err = desc->xcode(desc, elem);
1076                                                 if (err)
1077                                                         goto out;
1078                                         }
1079                                         memcpy(c, elem + copied, l);
1080                                         copied += l;
1081                                         if (copied == desc->elem_size)
1082                                                 copied = 0;
1083                                 } else {
1084                                         memcpy(elem + copied, c, l);
1085                                         copied += l;
1086                                         if (copied == desc->elem_size) {
1087                                                 err = desc->xcode(desc, elem);
1088                                                 if (err)
1089                                                         goto out;
1090                                                 copied = 0;
1091                                         }
1092                                 }
1093                                 avail_page -= l;
1094                                 c += l;
1095                         }
1096                         while (avail_page >= desc->elem_size) {
1097                                 err = desc->xcode(desc, c);
1098                                 if (err)
1099                                         goto out;
1100                                 c += desc->elem_size;
1101                                 avail_page -= desc->elem_size;
1102                         }
1103                         if (avail_page) {
1104                                 unsigned int l = min(avail_page,
1105                                             desc->elem_size - copied);
1106                                 if (!elem) {
1107                                         elem = kmalloc(desc->elem_size,
1108                                                        GFP_KERNEL);
1109                                         err = -ENOMEM;
1110                                         if (!elem)
1111                                                 goto out;
1112                                 }
1113                                 if (encode) {
1114                                         if (!copied) {
1115                                                 err = desc->xcode(desc, elem);
1116                                                 if (err)
1117                                                         goto out;
1118                                         }
1119                                         memcpy(c, elem + copied, l);
1120                                         copied += l;
1121                                         if (copied == desc->elem_size)
1122                                                 copied = 0;
1123                                 } else {
1124                                         memcpy(elem + copied, c, l);
1125                                         copied += l;
1126                                         if (copied == desc->elem_size) {
1127                                                 err = desc->xcode(desc, elem);
1128                                                 if (err)
1129                                                         goto out;
1130                                                 copied = 0;
1131                                         }
1132                                 }
1133                         }
1134                         if (avail_here) {
1135                                 kunmap(*ppages);
1136                                 ppages++;
1137                                 c = kmap(*ppages);
1138                         }
1139
1140                         avail_page = min(avail_here,
1141                                  (unsigned int) PAGE_CACHE_SIZE);
1142                 }
1143                 base = buf->page_len;  /* align to start of tail */
1144         }
1145
1146         /* process tail */
1147         base -= buf->page_len;
1148         if (todo) {
1149                 c = buf->tail->iov_base + base;
1150                 if (copied) {
1151                         unsigned int l = desc->elem_size - copied;
1152
1153                         if (encode)
1154                                 memcpy(c, elem + copied, l);
1155                         else {
1156                                 memcpy(elem + copied, c, l);
1157                                 err = desc->xcode(desc, elem);
1158                                 if (err)
1159                                         goto out;
1160                         }
1161                         todo -= l;
1162                         c += l;
1163                 }
1164                 while (todo) {
1165                         err = desc->xcode(desc, c);
1166                         if (err)
1167                                 goto out;
1168                         c += desc->elem_size;
1169                         todo -= desc->elem_size;
1170                 }
1171         }
1172         err = 0;
1173
1174 out:
1175         kfree(elem);
1176         if (ppages)
1177                 kunmap(*ppages);
1178         return err;
1179 }
1180
1181 int
1182 xdr_decode_array2(struct xdr_buf *buf, unsigned int base,
1183                   struct xdr_array2_desc *desc)
1184 {
1185         if (base >= buf->len)
1186                 return -EINVAL;
1187
1188         return xdr_xcode_array2(buf, base, desc, 0);
1189 }
1190 EXPORT_SYMBOL_GPL(xdr_decode_array2);
1191
1192 int
1193 xdr_encode_array2(struct xdr_buf *buf, unsigned int base,
1194                   struct xdr_array2_desc *desc)
1195 {
1196         if ((unsigned long) base + 4 + desc->array_len * desc->elem_size >
1197             buf->head->iov_len + buf->page_len + buf->tail->iov_len)
1198                 return -EINVAL;
1199
1200         return xdr_xcode_array2(buf, base, desc, 1);
1201 }
1202 EXPORT_SYMBOL_GPL(xdr_encode_array2);
1203
1204 int
1205 xdr_process_buf(struct xdr_buf *buf, unsigned int offset, unsigned int len,
1206                 int (*actor)(struct scatterlist *, void *), void *data)
1207 {
1208         int i, ret = 0;
1209         unsigned int page_len, thislen, page_offset;
1210         struct scatterlist      sg[1];
1211
1212         sg_init_table(sg, 1);
1213
1214         if (offset >= buf->head[0].iov_len) {
1215                 offset -= buf->head[0].iov_len;
1216         } else {
1217                 thislen = buf->head[0].iov_len - offset;
1218                 if (thislen > len)
1219                         thislen = len;
1220                 sg_set_buf(sg, buf->head[0].iov_base + offset, thislen);
1221                 ret = actor(sg, data);
1222                 if (ret)
1223                         goto out;
1224                 offset = 0;
1225                 len -= thislen;
1226         }
1227         if (len == 0)
1228                 goto out;
1229
1230         if (offset >= buf->page_len) {
1231                 offset -= buf->page_len;
1232         } else {
1233                 page_len = buf->page_len - offset;
1234                 if (page_len > len)
1235                         page_len = len;
1236                 len -= page_len;
1237                 page_offset = (offset + buf->page_base) & (PAGE_CACHE_SIZE - 1);
1238                 i = (offset + buf->page_base) >> PAGE_CACHE_SHIFT;
1239                 thislen = PAGE_CACHE_SIZE - page_offset;
1240                 do {
1241                         if (thislen > page_len)
1242                                 thislen = page_len;
1243                         sg_set_page(sg, buf->pages[i], thislen, page_offset);
1244                         ret = actor(sg, data);
1245                         if (ret)
1246                                 goto out;
1247                         page_len -= thislen;
1248                         i++;
1249                         page_offset = 0;
1250                         thislen = PAGE_CACHE_SIZE;
1251                 } while (page_len != 0);
1252                 offset = 0;
1253         }
1254         if (len == 0)
1255                 goto out;
1256         if (offset < buf->tail[0].iov_len) {
1257                 thislen = buf->tail[0].iov_len - offset;
1258                 if (thislen > len)
1259                         thislen = len;
1260                 sg_set_buf(sg, buf->tail[0].iov_base + offset, thislen);
1261                 ret = actor(sg, data);
1262                 len -= thislen;
1263         }
1264         if (len != 0)
1265                 ret = -EINVAL;
1266 out:
1267         return ret;
1268 }
1269 EXPORT_SYMBOL_GPL(xdr_process_buf);
1270