aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mm/iov_iter.c60
1 files changed, 24 insertions, 36 deletions
diff --git a/mm/iov_iter.c b/mm/iov_iter.c
index 39ad7137f739..17b7144c3165 100644
--- a/mm/iov_iter.c
+++ b/mm/iov_iter.c
@@ -486,30 +486,33 @@ static size_t copy_from_iter_bvec(void *to, size_t bytes, struct iov_iter *i)
486 return wanted; 486 return wanted;
487} 487}
488 488
489static size_t copy_page_to_iter_bvec(struct page *page, size_t offset, 489size_t copy_to_iter(void *addr, size_t bytes, struct iov_iter *i)
490 size_t bytes, struct iov_iter *i)
491{ 490{
492 void *kaddr = kmap_atomic(page); 491 if (i->type & ITER_BVEC)
493 size_t wanted = copy_to_iter_bvec(kaddr + offset, bytes, i); 492 return copy_to_iter_bvec(addr, bytes, i);
494 kunmap_atomic(kaddr); 493 else
495 return wanted; 494 return copy_to_iter_iovec(addr, bytes, i);
496} 495}
496EXPORT_SYMBOL(copy_to_iter);
497 497
498static size_t copy_page_from_iter_bvec(struct page *page, size_t offset, 498size_t copy_from_iter(void *addr, size_t bytes, struct iov_iter *i)
499 size_t bytes, struct iov_iter *i)
500{ 499{
501 void *kaddr = kmap_atomic(page); 500 if (i->type & ITER_BVEC)
502 size_t wanted = copy_from_iter_bvec(kaddr + offset, bytes, i); 501 return copy_from_iter_bvec(addr, bytes, i);
503 kunmap_atomic(kaddr); 502 else
504 return wanted; 503 return copy_from_iter_iovec(addr, bytes, i);
505} 504}
505EXPORT_SYMBOL(copy_from_iter);
506 506
507size_t copy_page_to_iter(struct page *page, size_t offset, size_t bytes, 507size_t copy_page_to_iter(struct page *page, size_t offset, size_t bytes,
508 struct iov_iter *i) 508 struct iov_iter *i)
509{ 509{
510 if (i->type & ITER_BVEC) 510 if (i->type & (ITER_BVEC|ITER_KVEC)) {
511 return copy_page_to_iter_bvec(page, offset, bytes, i); 511 void *kaddr = kmap_atomic(page);
512 else 512 size_t wanted = copy_to_iter(kaddr + offset, bytes, i);
513 kunmap_atomic(kaddr);
514 return wanted;
515 } else
513 return copy_page_to_iter_iovec(page, offset, bytes, i); 516 return copy_page_to_iter_iovec(page, offset, bytes, i);
514} 517}
515EXPORT_SYMBOL(copy_page_to_iter); 518EXPORT_SYMBOL(copy_page_to_iter);
@@ -517,31 +520,16 @@ EXPORT_SYMBOL(copy_page_to_iter);
517size_t copy_page_from_iter(struct page *page, size_t offset, size_t bytes, 520size_t copy_page_from_iter(struct page *page, size_t offset, size_t bytes,
518 struct iov_iter *i) 521 struct iov_iter *i)
519{ 522{
520 if (i->type & ITER_BVEC) 523 if (i->type & ITER_BVEC) {
521 return copy_page_from_iter_bvec(page, offset, bytes, i); 524 void *kaddr = kmap_atomic(page);
522 else 525 size_t wanted = copy_from_iter(kaddr + offset, bytes, i);
526 kunmap_atomic(kaddr);
527 return wanted;
528 } else
523 return copy_page_from_iter_iovec(page, offset, bytes, i); 529 return copy_page_from_iter_iovec(page, offset, bytes, i);
524} 530}
525EXPORT_SYMBOL(copy_page_from_iter); 531EXPORT_SYMBOL(copy_page_from_iter);
526 532
527size_t copy_to_iter(void *addr, size_t bytes, struct iov_iter *i)
528{
529 if (i->type & ITER_BVEC)
530 return copy_to_iter_bvec(addr, bytes, i);
531 else
532 return copy_to_iter_iovec(addr, bytes, i);
533}
534EXPORT_SYMBOL(copy_to_iter);
535
536size_t copy_from_iter(void *addr, size_t bytes, struct iov_iter *i)
537{
538 if (i->type & ITER_BVEC)
539 return copy_from_iter_bvec(addr, bytes, i);
540 else
541 return copy_from_iter_iovec(addr, bytes, i);
542}
543EXPORT_SYMBOL(copy_from_iter);
544
545size_t iov_iter_zero(size_t bytes, struct iov_iter *i) 533size_t iov_iter_zero(size_t bytes, struct iov_iter *i)
546{ 534{
547 if (unlikely(bytes > i->count)) 535 if (unlikely(bytes > i->count))