File tree Expand file tree Collapse file tree 1 file changed +18
-4
lines changed Expand file tree Collapse file tree 1 file changed +18
-4
lines changed Original file line number Diff line number Diff line change @@ -738,13 +738,27 @@ EXPORT_SYMBOL(copy_page_to_iter);
738
738
size_t copy_page_from_iter (struct page * page , size_t offset , size_t bytes ,
739
739
struct iov_iter * i )
740
740
{
741
- if (page_copy_sane (page , offset , bytes )) {
741
+ size_t res = 0 ;
742
+ if (!page_copy_sane (page , offset , bytes ))
743
+ return 0 ;
744
+ page += offset / PAGE_SIZE ; // first subpage
745
+ offset %= PAGE_SIZE ;
746
+ while (1 ) {
742
747
void * kaddr = kmap_local_page (page );
743
- size_t wanted = _copy_from_iter (kaddr + offset , bytes , i );
748
+ size_t n = min (bytes , (size_t )PAGE_SIZE - offset );
749
+ n = _copy_from_iter (kaddr + offset , n , i );
744
750
kunmap_local (kaddr );
745
- return wanted ;
751
+ res += n ;
752
+ bytes -= n ;
753
+ if (!bytes || !n )
754
+ break ;
755
+ offset += n ;
756
+ if (offset == PAGE_SIZE ) {
757
+ page ++ ;
758
+ offset = 0 ;
759
+ }
746
760
}
747
- return 0 ;
761
+ return res ;
748
762
}
749
763
EXPORT_SYMBOL (copy_page_from_iter );
750
764
You can’t perform that action at this time.
0 commit comments