blob: 791429d07965e99439c21f7e88fc09098d15ba70 [file] [log] [blame]
Al Viro4f18cd32014-02-05 19:11:33 -05001#include <linux/export.h>
2#include <linux/uio.h>
3#include <linux/pagemap.h>
Al Viro91f79c42014-03-21 04:58:33 -04004#include <linux/slab.h>
5#include <linux/vmalloc.h>
Al Viro4f18cd32014-02-05 19:11:33 -05006
Al Viro04a31162014-11-27 13:51:41 -05007#define iterate_iovec(i, n, __v, __p, skip, STEP) { \
8 size_t left; \
9 size_t wanted = n; \
10 __p = i->iov; \
11 __v.iov_len = min(n, __p->iov_len - skip); \
12 if (likely(__v.iov_len)) { \
13 __v.iov_base = __p->iov_base + skip; \
14 left = (STEP); \
15 __v.iov_len -= left; \
16 skip += __v.iov_len; \
17 n -= __v.iov_len; \
18 } else { \
19 left = 0; \
20 } \
21 while (unlikely(!left && n)) { \
22 __p++; \
23 __v.iov_len = min(n, __p->iov_len); \
24 if (unlikely(!__v.iov_len)) \
25 continue; \
26 __v.iov_base = __p->iov_base; \
27 left = (STEP); \
28 __v.iov_len -= left; \
29 skip = __v.iov_len; \
30 n -= __v.iov_len; \
31 } \
32 n = wanted - n; \
33}
34
35#define iterate_bvec(i, n, __v, __p, skip, STEP) { \
36 size_t wanted = n; \
37 __p = i->bvec; \
38 __v.bv_len = min_t(size_t, n, __p->bv_len - skip); \
39 if (likely(__v.bv_len)) { \
40 __v.bv_page = __p->bv_page; \
41 __v.bv_offset = __p->bv_offset + skip; \
42 (void)(STEP); \
43 skip += __v.bv_len; \
44 n -= __v.bv_len; \
45 } \
46 while (unlikely(n)) { \
47 __p++; \
48 __v.bv_len = min_t(size_t, n, __p->bv_len); \
49 if (unlikely(!__v.bv_len)) \
50 continue; \
51 __v.bv_page = __p->bv_page; \
52 __v.bv_offset = __p->bv_offset; \
53 (void)(STEP); \
54 skip = __v.bv_len; \
55 n -= __v.bv_len; \
56 } \
57 n = wanted; \
58}
59
60#define iterate_all_kinds(i, n, v, I, B) { \
61 size_t skip = i->iov_offset; \
62 if (unlikely(i->type & ITER_BVEC)) { \
63 const struct bio_vec *bvec; \
64 struct bio_vec v; \
65 iterate_bvec(i, n, v, bvec, skip, (B)) \
66 } else { \
67 const struct iovec *iov; \
68 struct iovec v; \
69 iterate_iovec(i, n, v, iov, skip, (I)) \
70 } \
71}
72
Al Viro7ce2a912014-11-27 13:59:45 -050073#define iterate_and_advance(i, n, v, I, B) { \
74 size_t skip = i->iov_offset; \
75 if (unlikely(i->type & ITER_BVEC)) { \
76 const struct bio_vec *bvec; \
77 struct bio_vec v; \
78 iterate_bvec(i, n, v, bvec, skip, (B)) \
79 if (skip == bvec->bv_len) { \
80 bvec++; \
81 skip = 0; \
82 } \
83 i->nr_segs -= bvec - i->bvec; \
84 i->bvec = bvec; \
85 } else { \
86 const struct iovec *iov; \
87 struct iovec v; \
88 iterate_iovec(i, n, v, iov, skip, (I)) \
89 if (skip == iov->iov_len) { \
90 iov++; \
91 skip = 0; \
92 } \
93 i->nr_segs -= iov - i->iov; \
94 i->iov = iov; \
95 } \
96 i->count -= n; \
97 i->iov_offset = skip; \
98}
99
Matthew Wilcoxc35e0242014-08-01 09:27:22 -0400100static size_t copy_to_iter_iovec(void *from, size_t bytes, struct iov_iter *i)
101{
102 size_t skip, copy, left, wanted;
103 const struct iovec *iov;
104 char __user *buf;
105
106 if (unlikely(bytes > i->count))
107 bytes = i->count;
108
109 if (unlikely(!bytes))
110 return 0;
111
112 wanted = bytes;
113 iov = i->iov;
114 skip = i->iov_offset;
115 buf = iov->iov_base + skip;
116 copy = min(bytes, iov->iov_len - skip);
117
118 left = __copy_to_user(buf, from, copy);
119 copy -= left;
120 skip += copy;
121 from += copy;
122 bytes -= copy;
123 while (unlikely(!left && bytes)) {
124 iov++;
125 buf = iov->iov_base;
126 copy = min(bytes, iov->iov_len);
127 left = __copy_to_user(buf, from, copy);
128 copy -= left;
129 skip = copy;
130 from += copy;
131 bytes -= copy;
132 }
133
134 if (skip == iov->iov_len) {
135 iov++;
136 skip = 0;
137 }
138 i->count -= wanted - bytes;
139 i->nr_segs -= iov - i->iov;
140 i->iov = iov;
141 i->iov_offset = skip;
142 return wanted - bytes;
143}
144
Al Viro62a80672014-04-04 23:12:29 -0400145static size_t copy_page_to_iter_iovec(struct page *page, size_t offset, size_t bytes,
Al Viro4f18cd32014-02-05 19:11:33 -0500146 struct iov_iter *i)
147{
148 size_t skip, copy, left, wanted;
149 const struct iovec *iov;
150 char __user *buf;
151 void *kaddr, *from;
152
153 if (unlikely(bytes > i->count))
154 bytes = i->count;
155
156 if (unlikely(!bytes))
157 return 0;
158
159 wanted = bytes;
160 iov = i->iov;
161 skip = i->iov_offset;
162 buf = iov->iov_base + skip;
163 copy = min(bytes, iov->iov_len - skip);
164
165 if (!fault_in_pages_writeable(buf, copy)) {
166 kaddr = kmap_atomic(page);
167 from = kaddr + offset;
168
169 /* first chunk, usually the only one */
170 left = __copy_to_user_inatomic(buf, from, copy);
171 copy -= left;
172 skip += copy;
173 from += copy;
174 bytes -= copy;
175
176 while (unlikely(!left && bytes)) {
177 iov++;
178 buf = iov->iov_base;
179 copy = min(bytes, iov->iov_len);
180 left = __copy_to_user_inatomic(buf, from, copy);
181 copy -= left;
182 skip = copy;
183 from += copy;
184 bytes -= copy;
185 }
186 if (likely(!bytes)) {
187 kunmap_atomic(kaddr);
188 goto done;
189 }
190 offset = from - kaddr;
191 buf += copy;
192 kunmap_atomic(kaddr);
193 copy = min(bytes, iov->iov_len - skip);
194 }
195 /* Too bad - revert to non-atomic kmap */
196 kaddr = kmap(page);
197 from = kaddr + offset;
198 left = __copy_to_user(buf, from, copy);
199 copy -= left;
200 skip += copy;
201 from += copy;
202 bytes -= copy;
203 while (unlikely(!left && bytes)) {
204 iov++;
205 buf = iov->iov_base;
206 copy = min(bytes, iov->iov_len);
207 left = __copy_to_user(buf, from, copy);
208 copy -= left;
209 skip = copy;
210 from += copy;
211 bytes -= copy;
212 }
213 kunmap(page);
214done:
Al Viro81055e52014-04-04 19:23:46 -0400215 if (skip == iov->iov_len) {
216 iov++;
217 skip = 0;
218 }
Al Viro4f18cd32014-02-05 19:11:33 -0500219 i->count -= wanted - bytes;
220 i->nr_segs -= iov - i->iov;
221 i->iov = iov;
222 i->iov_offset = skip;
223 return wanted - bytes;
224}
Al Viro4f18cd32014-02-05 19:11:33 -0500225
Al Viro62a80672014-04-04 23:12:29 -0400226static size_t copy_page_from_iter_iovec(struct page *page, size_t offset, size_t bytes,
Al Virof0d1bec2014-04-03 15:05:18 -0400227 struct iov_iter *i)
228{
229 size_t skip, copy, left, wanted;
230 const struct iovec *iov;
231 char __user *buf;
232 void *kaddr, *to;
233
234 if (unlikely(bytes > i->count))
235 bytes = i->count;
236
237 if (unlikely(!bytes))
238 return 0;
239
240 wanted = bytes;
241 iov = i->iov;
242 skip = i->iov_offset;
243 buf = iov->iov_base + skip;
244 copy = min(bytes, iov->iov_len - skip);
245
246 if (!fault_in_pages_readable(buf, copy)) {
247 kaddr = kmap_atomic(page);
248 to = kaddr + offset;
249
250 /* first chunk, usually the only one */
251 left = __copy_from_user_inatomic(to, buf, copy);
252 copy -= left;
253 skip += copy;
254 to += copy;
255 bytes -= copy;
256
257 while (unlikely(!left && bytes)) {
258 iov++;
259 buf = iov->iov_base;
260 copy = min(bytes, iov->iov_len);
261 left = __copy_from_user_inatomic(to, buf, copy);
262 copy -= left;
263 skip = copy;
264 to += copy;
265 bytes -= copy;
266 }
267 if (likely(!bytes)) {
268 kunmap_atomic(kaddr);
269 goto done;
270 }
271 offset = to - kaddr;
272 buf += copy;
273 kunmap_atomic(kaddr);
274 copy = min(bytes, iov->iov_len - skip);
275 }
276 /* Too bad - revert to non-atomic kmap */
277 kaddr = kmap(page);
278 to = kaddr + offset;
279 left = __copy_from_user(to, buf, copy);
280 copy -= left;
281 skip += copy;
282 to += copy;
283 bytes -= copy;
284 while (unlikely(!left && bytes)) {
285 iov++;
286 buf = iov->iov_base;
287 copy = min(bytes, iov->iov_len);
288 left = __copy_from_user(to, buf, copy);
289 copy -= left;
290 skip = copy;
291 to += copy;
292 bytes -= copy;
293 }
294 kunmap(page);
295done:
Al Viro81055e52014-04-04 19:23:46 -0400296 if (skip == iov->iov_len) {
297 iov++;
298 skip = 0;
299 }
Al Virof0d1bec2014-04-03 15:05:18 -0400300 i->count -= wanted - bytes;
301 i->nr_segs -= iov - i->iov;
302 i->iov = iov;
303 i->iov_offset = skip;
304 return wanted - bytes;
305}
Al Virof0d1bec2014-04-03 15:05:18 -0400306
Al Viro4f18cd32014-02-05 19:11:33 -0500307/*
308 * Fault in the first iovec of the given iov_iter, to a maximum length
309 * of bytes. Returns 0 on success, or non-zero if the memory could not be
310 * accessed (ie. because it is an invalid address).
311 *
312 * writev-intensive code may want this to prefault several iovecs -- that
313 * would be possible (callers must not rely on the fact that _only_ the
314 * first iovec will be faulted with the current implementation).
315 */
316int iov_iter_fault_in_readable(struct iov_iter *i, size_t bytes)
317{
Al Viro62a80672014-04-04 23:12:29 -0400318 if (!(i->type & ITER_BVEC)) {
319 char __user *buf = i->iov->iov_base + i->iov_offset;
320 bytes = min(bytes, i->iov->iov_len - i->iov_offset);
321 return fault_in_pages_readable(buf, bytes);
322 }
323 return 0;
Al Viro4f18cd32014-02-05 19:11:33 -0500324}
325EXPORT_SYMBOL(iov_iter_fault_in_readable);
326
Al Viro71d8e532014-03-05 19:28:09 -0500327void iov_iter_init(struct iov_iter *i, int direction,
328 const struct iovec *iov, unsigned long nr_segs,
329 size_t count)
330{
331 /* It will get better. Eventually... */
332 if (segment_eq(get_fs(), KERNEL_DS))
Al Viro62a80672014-04-04 23:12:29 -0400333 direction |= ITER_KVEC;
Al Viro71d8e532014-03-05 19:28:09 -0500334 i->type = direction;
335 i->iov = iov;
336 i->nr_segs = nr_segs;
337 i->iov_offset = 0;
338 i->count = count;
339}
340EXPORT_SYMBOL(iov_iter_init);
Al Viro7b2c99d2014-03-15 04:05:57 -0400341
Al Viro62a80672014-04-04 23:12:29 -0400342static void memcpy_from_page(char *to, struct page *page, size_t offset, size_t len)
343{
344 char *from = kmap_atomic(page);
345 memcpy(to, from + offset, len);
346 kunmap_atomic(from);
347}
348
349static void memcpy_to_page(struct page *page, size_t offset, char *from, size_t len)
350{
351 char *to = kmap_atomic(page);
352 memcpy(to + offset, from, len);
353 kunmap_atomic(to);
354}
355
Matthew Wilcoxc35e0242014-08-01 09:27:22 -0400356static void memzero_page(struct page *page, size_t offset, size_t len)
357{
358 char *addr = kmap_atomic(page);
359 memset(addr + offset, 0, len);
360 kunmap_atomic(addr);
361}
362
363static size_t copy_to_iter_bvec(void *from, size_t bytes, struct iov_iter *i)
Al Viro62a80672014-04-04 23:12:29 -0400364{
365 size_t skip, copy, wanted;
366 const struct bio_vec *bvec;
Al Viro62a80672014-04-04 23:12:29 -0400367
368 if (unlikely(bytes > i->count))
369 bytes = i->count;
370
371 if (unlikely(!bytes))
372 return 0;
373
374 wanted = bytes;
375 bvec = i->bvec;
376 skip = i->iov_offset;
377 copy = min_t(size_t, bytes, bvec->bv_len - skip);
378
Al Viro62a80672014-04-04 23:12:29 -0400379 memcpy_to_page(bvec->bv_page, skip + bvec->bv_offset, from, copy);
380 skip += copy;
381 from += copy;
382 bytes -= copy;
383 while (bytes) {
384 bvec++;
385 copy = min(bytes, (size_t)bvec->bv_len);
386 memcpy_to_page(bvec->bv_page, bvec->bv_offset, from, copy);
387 skip = copy;
388 from += copy;
389 bytes -= copy;
390 }
Al Viro62a80672014-04-04 23:12:29 -0400391 if (skip == bvec->bv_len) {
392 bvec++;
393 skip = 0;
394 }
395 i->count -= wanted - bytes;
396 i->nr_segs -= bvec - i->bvec;
397 i->bvec = bvec;
398 i->iov_offset = skip;
399 return wanted - bytes;
400}
401
Matthew Wilcoxc35e0242014-08-01 09:27:22 -0400402size_t copy_to_iter(void *addr, size_t bytes, struct iov_iter *i)
403{
404 if (i->type & ITER_BVEC)
405 return copy_to_iter_bvec(addr, bytes, i);
406 else
407 return copy_to_iter_iovec(addr, bytes, i);
408}
409EXPORT_SYMBOL(copy_to_iter);
410
411size_t copy_from_iter(void *addr, size_t bytes, struct iov_iter *i)
412{
Al Viro0dbca9a2014-11-27 14:26:43 -0500413 char *to = addr;
414 if (unlikely(bytes > i->count))
415 bytes = i->count;
416
417 if (unlikely(!bytes))
418 return 0;
419
420 iterate_and_advance(i, bytes, v,
421 __copy_from_user((to += v.iov_len) - v.iov_len, v.iov_base,
422 v.iov_len),
423 memcpy_from_page((to += v.bv_len) - v.bv_len, v.bv_page,
424 v.bv_offset, v.bv_len)
425 )
426
427 return bytes;
Matthew Wilcoxc35e0242014-08-01 09:27:22 -0400428}
429EXPORT_SYMBOL(copy_from_iter);
430
Al Virod2715242014-11-27 14:22:37 -0500431size_t copy_page_to_iter(struct page *page, size_t offset, size_t bytes,
432 struct iov_iter *i)
433{
434 if (i->type & (ITER_BVEC|ITER_KVEC)) {
435 void *kaddr = kmap_atomic(page);
436 size_t wanted = copy_to_iter(kaddr + offset, bytes, i);
437 kunmap_atomic(kaddr);
438 return wanted;
439 } else
440 return copy_page_to_iter_iovec(page, offset, bytes, i);
441}
442EXPORT_SYMBOL(copy_page_to_iter);
443
444size_t copy_page_from_iter(struct page *page, size_t offset, size_t bytes,
445 struct iov_iter *i)
446{
447 if (i->type & ITER_BVEC) {
448 void *kaddr = kmap_atomic(page);
449 size_t wanted = copy_from_iter(kaddr + offset, bytes, i);
450 kunmap_atomic(kaddr);
451 return wanted;
452 } else
453 return copy_page_from_iter_iovec(page, offset, bytes, i);
454}
455EXPORT_SYMBOL(copy_page_from_iter);
456
Matthew Wilcoxc35e0242014-08-01 09:27:22 -0400457size_t iov_iter_zero(size_t bytes, struct iov_iter *i)
458{
Al Viro8442fa42014-11-27 14:18:54 -0500459 if (unlikely(bytes > i->count))
460 bytes = i->count;
461
462 if (unlikely(!bytes))
463 return 0;
464
465 iterate_and_advance(i, bytes, v,
466 __clear_user(v.iov_base, v.iov_len),
467 memzero_page(v.bv_page, v.bv_offset, v.bv_len)
468 )
469
470 return bytes;
Matthew Wilcoxc35e0242014-08-01 09:27:22 -0400471}
472EXPORT_SYMBOL(iov_iter_zero);
473
Al Viro62a80672014-04-04 23:12:29 -0400474size_t iov_iter_copy_from_user_atomic(struct page *page,
475 struct iov_iter *i, unsigned long offset, size_t bytes)
476{
Al Viro04a31162014-11-27 13:51:41 -0500477 char *kaddr = kmap_atomic(page), *p = kaddr + offset;
478 iterate_all_kinds(i, bytes, v,
479 __copy_from_user_inatomic((p += v.iov_len) - v.iov_len,
480 v.iov_base, v.iov_len),
481 memcpy_from_page((p += v.bv_len) - v.bv_len, v.bv_page,
482 v.bv_offset, v.bv_len)
483 )
484 kunmap_atomic(kaddr);
485 return bytes;
Al Viro62a80672014-04-04 23:12:29 -0400486}
487EXPORT_SYMBOL(iov_iter_copy_from_user_atomic);
488
489void iov_iter_advance(struct iov_iter *i, size_t size)
490{
Al Viro7ce2a912014-11-27 13:59:45 -0500491 iterate_and_advance(i, size, v, 0, 0)
Al Viro62a80672014-04-04 23:12:29 -0400492}
493EXPORT_SYMBOL(iov_iter_advance);
494
495/*
496 * Return the count of just the current iov_iter segment.
497 */
498size_t iov_iter_single_seg_count(const struct iov_iter *i)
499{
500 if (i->nr_segs == 1)
501 return i->count;
502 else if (i->type & ITER_BVEC)
Al Viro62a80672014-04-04 23:12:29 -0400503 return min(i->count, i->bvec->bv_len - i->iov_offset);
Paul Mackerrasad0eab92014-11-13 20:15:23 +1100504 else
505 return min(i->count, i->iov->iov_len - i->iov_offset);
Al Viro62a80672014-04-04 23:12:29 -0400506}
507EXPORT_SYMBOL(iov_iter_single_seg_count);
508
509unsigned long iov_iter_alignment(const struct iov_iter *i)
510{
Al Viro04a31162014-11-27 13:51:41 -0500511 unsigned long res = 0;
512 size_t size = i->count;
513
514 if (!size)
515 return 0;
516
517 iterate_all_kinds(i, size, v,
518 (res |= (unsigned long)v.iov_base | v.iov_len, 0),
519 res |= v.bv_offset | v.bv_len
520 )
521 return res;
Al Viro62a80672014-04-04 23:12:29 -0400522}
523EXPORT_SYMBOL(iov_iter_alignment);
524
525ssize_t iov_iter_get_pages(struct iov_iter *i,
Miklos Szeredi2c809292014-09-24 17:09:11 +0200526 struct page **pages, size_t maxsize, unsigned maxpages,
Al Viro62a80672014-04-04 23:12:29 -0400527 size_t *start)
528{
Al Viroe5393fa2014-11-27 14:12:09 -0500529 if (maxsize > i->count)
530 maxsize = i->count;
531
532 if (!maxsize)
533 return 0;
534
535 iterate_all_kinds(i, maxsize, v, ({
536 unsigned long addr = (unsigned long)v.iov_base;
537 size_t len = v.iov_len + (*start = addr & (PAGE_SIZE - 1));
538 int n;
539 int res;
540
541 if (len > maxpages * PAGE_SIZE)
542 len = maxpages * PAGE_SIZE;
543 addr &= ~(PAGE_SIZE - 1);
544 n = DIV_ROUND_UP(len, PAGE_SIZE);
545 res = get_user_pages_fast(addr, n, (i->type & WRITE) != WRITE, pages);
546 if (unlikely(res < 0))
547 return res;
548 return (res == n ? len : res * PAGE_SIZE) - *start;
549 0;}),({
550 /* can't be more than PAGE_SIZE */
551 *start = v.bv_offset;
552 get_page(*pages = v.bv_page);
553 return v.bv_len;
554 })
555 )
556 return 0;
Al Viro62a80672014-04-04 23:12:29 -0400557}
558EXPORT_SYMBOL(iov_iter_get_pages);
559
Al Viro1b17f1f2014-11-27 14:14:31 -0500560static struct page **get_pages_array(size_t n)
561{
562 struct page **p = kmalloc(n * sizeof(struct page *), GFP_KERNEL);
563 if (!p)
564 p = vmalloc(n * sizeof(struct page *));
565 return p;
566}
567
Al Viro62a80672014-04-04 23:12:29 -0400568ssize_t iov_iter_get_pages_alloc(struct iov_iter *i,
569 struct page ***pages, size_t maxsize,
570 size_t *start)
571{
Al Viro1b17f1f2014-11-27 14:14:31 -0500572 struct page **p;
573
574 if (maxsize > i->count)
575 maxsize = i->count;
576
577 if (!maxsize)
578 return 0;
579
580 iterate_all_kinds(i, maxsize, v, ({
581 unsigned long addr = (unsigned long)v.iov_base;
582 size_t len = v.iov_len + (*start = addr & (PAGE_SIZE - 1));
583 int n;
584 int res;
585
586 addr &= ~(PAGE_SIZE - 1);
587 n = DIV_ROUND_UP(len, PAGE_SIZE);
588 p = get_pages_array(n);
589 if (!p)
590 return -ENOMEM;
591 res = get_user_pages_fast(addr, n, (i->type & WRITE) != WRITE, p);
592 if (unlikely(res < 0)) {
593 kvfree(p);
594 return res;
595 }
596 *pages = p;
597 return (res == n ? len : res * PAGE_SIZE) - *start;
598 0;}),({
599 /* can't be more than PAGE_SIZE */
600 *start = v.bv_offset;
601 *pages = p = get_pages_array(1);
602 if (!p)
603 return -ENOMEM;
604 get_page(*p = v.bv_page);
605 return v.bv_len;
606 })
607 )
608 return 0;
Al Viro62a80672014-04-04 23:12:29 -0400609}
610EXPORT_SYMBOL(iov_iter_get_pages_alloc);
611
612int iov_iter_npages(const struct iov_iter *i, int maxpages)
613{
Al Viroe0f2dc42014-11-27 14:09:46 -0500614 size_t size = i->count;
615 int npages = 0;
616
617 if (!size)
618 return 0;
619
620 iterate_all_kinds(i, size, v, ({
621 unsigned long p = (unsigned long)v.iov_base;
622 npages += DIV_ROUND_UP(p + v.iov_len, PAGE_SIZE)
623 - p / PAGE_SIZE;
624 if (npages >= maxpages)
625 return maxpages;
626 0;}),({
627 npages++;
628 if (npages >= maxpages)
629 return maxpages;
630 })
631 )
632 return npages;
Al Viro62a80672014-04-04 23:12:29 -0400633}
Al Virof67da302014-03-19 01:16:16 -0400634EXPORT_SYMBOL(iov_iter_npages);