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);
738738size_t copy_page_from_iter (struct page * page , size_t offset , size_t bytes ,
739739 struct iov_iter * i )
740740{
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 ) {
742747 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 );
744750 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+ }
746760 }
747- return 0 ;
761+ return res ;
748762}
749763EXPORT_SYMBOL (copy_page_from_iter );
750764
You can’t perform that action at this time.
0 commit comments