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)) |
