iov_iter.c (93cd6fa6806cb3455e8231578840afb031606352) | iov_iter.c (cbbd26b8b1a6af9c02e2b6523e12bd50cc765059) |
---|---|
1#include <linux/export.h> 2#include <linux/uio.h> 3#include <linux/pagemap.h> 4#include <linux/slab.h> 5#include <linux/vmalloc.h> 6#include <linux/splice.h> 7#include <net/checksum.h> 8 --- 554 unchanged lines hidden (view full) --- 563 v.bv_offset, v.bv_len), 564 memcpy((to += v.iov_len) - v.iov_len, v.iov_base, v.iov_len) 565 ) 566 567 return bytes; 568} 569EXPORT_SYMBOL(copy_from_iter); 570 | 1#include <linux/export.h> 2#include <linux/uio.h> 3#include <linux/pagemap.h> 4#include <linux/slab.h> 5#include <linux/vmalloc.h> 6#include <linux/splice.h> 7#include <net/checksum.h> 8 --- 554 unchanged lines hidden (view full) --- 563 v.bv_offset, v.bv_len), 564 memcpy((to += v.iov_len) - v.iov_len, v.iov_base, v.iov_len) 565 ) 566 567 return bytes; 568} 569EXPORT_SYMBOL(copy_from_iter); 570 |
571bool copy_from_iter_full(void *addr, size_t bytes, struct iov_iter *i) 572{ 573 char *to = addr; 574 if (unlikely(i->type & ITER_PIPE)) { 575 WARN_ON(1); 576 return false; 577 } 578 if (unlikely(i->count < bytes)) \ 579 return false; 580 581 iterate_all_kinds(i, bytes, v, ({ 582 if (__copy_from_user((to += v.iov_len) - v.iov_len, 583 v.iov_base, v.iov_len)) 584 return false; 585 0;}), 586 memcpy_from_page((to += v.bv_len) - v.bv_len, v.bv_page, 587 v.bv_offset, v.bv_len), 588 memcpy((to += v.iov_len) - v.iov_len, v.iov_base, v.iov_len) 589 ) 590 591 iov_iter_advance(i, bytes); 592 return true; 593} 594EXPORT_SYMBOL(copy_from_iter_full); 595 |
|
571size_t copy_from_iter_nocache(void *addr, size_t bytes, struct iov_iter *i) 572{ 573 char *to = addr; 574 if (unlikely(i->type & ITER_PIPE)) { 575 WARN_ON(1); 576 return 0; 577 } 578 iterate_and_advance(i, bytes, v, 579 __copy_from_user_nocache((to += v.iov_len) - v.iov_len, 580 v.iov_base, v.iov_len), 581 memcpy_from_page((to += v.bv_len) - v.bv_len, v.bv_page, 582 v.bv_offset, v.bv_len), 583 memcpy((to += v.iov_len) - v.iov_len, v.iov_base, v.iov_len) 584 ) 585 586 return bytes; 587} 588EXPORT_SYMBOL(copy_from_iter_nocache); 589 | 596size_t copy_from_iter_nocache(void *addr, size_t bytes, struct iov_iter *i) 597{ 598 char *to = addr; 599 if (unlikely(i->type & ITER_PIPE)) { 600 WARN_ON(1); 601 return 0; 602 } 603 iterate_and_advance(i, bytes, v, 604 __copy_from_user_nocache((to += v.iov_len) - v.iov_len, 605 v.iov_base, v.iov_len), 606 memcpy_from_page((to += v.bv_len) - v.bv_len, v.bv_page, 607 v.bv_offset, v.bv_len), 608 memcpy((to += v.iov_len) - v.iov_len, v.iov_base, v.iov_len) 609 ) 610 611 return bytes; 612} 613EXPORT_SYMBOL(copy_from_iter_nocache); 614 |
615bool copy_from_iter_full_nocache(void *addr, size_t bytes, struct iov_iter *i) 616{ 617 char *to = addr; 618 if (unlikely(i->type & ITER_PIPE)) { 619 WARN_ON(1); 620 return false; 621 } 622 if (unlikely(i->count < bytes)) \ 623 return false; 624 iterate_all_kinds(i, bytes, v, ({ 625 if (__copy_from_user_nocache((to += v.iov_len) - v.iov_len, 626 v.iov_base, v.iov_len)) 627 return false; 628 0;}), 629 memcpy_from_page((to += v.bv_len) - v.bv_len, v.bv_page, 630 v.bv_offset, v.bv_len), 631 memcpy((to += v.iov_len) - v.iov_len, v.iov_base, v.iov_len) 632 ) 633 634 iov_iter_advance(i, bytes); 635 return true; 636} 637EXPORT_SYMBOL(copy_from_iter_full_nocache); 638 |
|
590size_t copy_page_to_iter(struct page *page, size_t offset, size_t bytes, 591 struct iov_iter *i) 592{ 593 if (i->type & (ITER_BVEC|ITER_KVEC)) { 594 void *kaddr = kmap_atomic(page); 595 size_t wanted = copy_to_iter(kaddr + offset, bytes, i); 596 kunmap_atomic(kaddr); 597 return wanted; --- 405 unchanged lines hidden (view full) --- 1003 size_t off = 0; 1004 sum = *csum; 1005 if (unlikely(i->type & ITER_PIPE)) { 1006 WARN_ON(1); 1007 return 0; 1008 } 1009 iterate_and_advance(i, bytes, v, ({ 1010 int err = 0; | 639size_t copy_page_to_iter(struct page *page, size_t offset, size_t bytes, 640 struct iov_iter *i) 641{ 642 if (i->type & (ITER_BVEC|ITER_KVEC)) { 643 void *kaddr = kmap_atomic(page); 644 size_t wanted = copy_to_iter(kaddr + offset, bytes, i); 645 kunmap_atomic(kaddr); 646 return wanted; --- 405 unchanged lines hidden (view full) --- 1052 size_t off = 0; 1053 sum = *csum; 1054 if (unlikely(i->type & ITER_PIPE)) { 1055 WARN_ON(1); 1056 return 0; 1057 } 1058 iterate_and_advance(i, bytes, v, ({ 1059 int err = 0; |
1011 next = csum_and_copy_from_user(v.iov_base, | 1060 next = csum_and_copy_from_user(v.iov_base, |
1012 (to += v.iov_len) - v.iov_len, 1013 v.iov_len, 0, &err); 1014 if (!err) { 1015 sum = csum_block_add(sum, next, off); 1016 off += v.iov_len; 1017 } 1018 err ? v.iov_len : 0; 1019 }), ({ --- 12 unchanged lines hidden (view full) --- 1032 off += v.iov_len; 1033 }) 1034 ) 1035 *csum = sum; 1036 return bytes; 1037} 1038EXPORT_SYMBOL(csum_and_copy_from_iter); 1039 | 1061 (to += v.iov_len) - v.iov_len, 1062 v.iov_len, 0, &err); 1063 if (!err) { 1064 sum = csum_block_add(sum, next, off); 1065 off += v.iov_len; 1066 } 1067 err ? v.iov_len : 0; 1068 }), ({ --- 12 unchanged lines hidden (view full) --- 1081 off += v.iov_len; 1082 }) 1083 ) 1084 *csum = sum; 1085 return bytes; 1086} 1087EXPORT_SYMBOL(csum_and_copy_from_iter); 1088 |
1089bool csum_and_copy_from_iter_full(void *addr, size_t bytes, __wsum *csum, 1090 struct iov_iter *i) 1091{ 1092 char *to = addr; 1093 __wsum sum, next; 1094 size_t off = 0; 1095 sum = *csum; 1096 if (unlikely(i->type & ITER_PIPE)) { 1097 WARN_ON(1); 1098 return false; 1099 } 1100 if (unlikely(i->count < bytes)) 1101 return false; 1102 iterate_all_kinds(i, bytes, v, ({ 1103 int err = 0; 1104 next = csum_and_copy_from_user(v.iov_base, 1105 (to += v.iov_len) - v.iov_len, 1106 v.iov_len, 0, &err); 1107 if (err) 1108 return false; 1109 sum = csum_block_add(sum, next, off); 1110 off += v.iov_len; 1111 0; 1112 }), ({ 1113 char *p = kmap_atomic(v.bv_page); 1114 next = csum_partial_copy_nocheck(p + v.bv_offset, 1115 (to += v.bv_len) - v.bv_len, 1116 v.bv_len, 0); 1117 kunmap_atomic(p); 1118 sum = csum_block_add(sum, next, off); 1119 off += v.bv_len; 1120 }),({ 1121 next = csum_partial_copy_nocheck(v.iov_base, 1122 (to += v.iov_len) - v.iov_len, 1123 v.iov_len, 0); 1124 sum = csum_block_add(sum, next, off); 1125 off += v.iov_len; 1126 }) 1127 ) 1128 *csum = sum; 1129 iov_iter_advance(i, bytes); 1130 return true; 1131} 1132EXPORT_SYMBOL(csum_and_copy_from_iter_full); 1133 |
|
1040size_t csum_and_copy_to_iter(const void *addr, size_t bytes, __wsum *csum, 1041 struct iov_iter *i) 1042{ 1043 const char *from = addr; 1044 __wsum sum, next; 1045 size_t off = 0; 1046 sum = *csum; 1047 if (unlikely(i->type & ITER_PIPE)) { 1048 WARN_ON(1); /* for now */ 1049 return 0; 1050 } 1051 iterate_and_advance(i, bytes, v, ({ 1052 int err = 0; 1053 next = csum_and_copy_to_user((from += v.iov_len) - v.iov_len, | 1134size_t csum_and_copy_to_iter(const void *addr, size_t bytes, __wsum *csum, 1135 struct iov_iter *i) 1136{ 1137 const char *from = addr; 1138 __wsum sum, next; 1139 size_t off = 0; 1140 sum = *csum; 1141 if (unlikely(i->type & ITER_PIPE)) { 1142 WARN_ON(1); /* for now */ 1143 return 0; 1144 } 1145 iterate_and_advance(i, bytes, v, ({ 1146 int err = 0; 1147 next = csum_and_copy_to_user((from += v.iov_len) - v.iov_len, |
1054 v.iov_base, | 1148 v.iov_base, |
1055 v.iov_len, 0, &err); 1056 if (!err) { 1057 sum = csum_block_add(sum, next, off); 1058 off += v.iov_len; 1059 } 1060 err ? v.iov_len : 0; 1061 }), ({ 1062 char *p = kmap_atomic(v.bv_page); --- 160 unchanged lines hidden --- | 1149 v.iov_len, 0, &err); 1150 if (!err) { 1151 sum = csum_block_add(sum, next, off); 1152 off += v.iov_len; 1153 } 1154 err ? v.iov_len : 0; 1155 }), ({ 1156 char *p = kmap_atomic(v.bv_page); --- 160 unchanged lines hidden --- |