diff options
-rw-r--r-- | mm/iov_iter.c | 60 |
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 | ||
489 | static size_t copy_page_to_iter_bvec(struct page *page, size_t offset, | 489 | size_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 | } |
496 | EXPORT_SYMBOL(copy_to_iter); | ||
497 | 497 | ||
498 | static size_t copy_page_from_iter_bvec(struct page *page, size_t offset, | 498 | size_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 | } |
505 | EXPORT_SYMBOL(copy_from_iter); | ||
506 | 506 | ||
507 | size_t copy_page_to_iter(struct page *page, size_t offset, size_t bytes, | 507 | size_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 | } |
515 | EXPORT_SYMBOL(copy_page_to_iter); | 518 | EXPORT_SYMBOL(copy_page_to_iter); |
@@ -517,31 +520,16 @@ EXPORT_SYMBOL(copy_page_to_iter); | |||
517 | size_t copy_page_from_iter(struct page *page, size_t offset, size_t bytes, | 520 | size_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 | } |
525 | EXPORT_SYMBOL(copy_page_from_iter); | 531 | EXPORT_SYMBOL(copy_page_from_iter); |
526 | 532 | ||
527 | size_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 | } | ||
534 | EXPORT_SYMBOL(copy_to_iter); | ||
535 | |||
536 | size_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 | } | ||
543 | EXPORT_SYMBOL(copy_from_iter); | ||
544 | |||
545 | size_t iov_iter_zero(size_t bytes, struct iov_iter *i) | 533 | size_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)) |