@@ -819,6 +819,7 @@ copy_present_pte(struct mm_struct *dst_mm, struct mm_struct *src_mm,
819819
820820static int copy_pte_range (struct mm_struct * dst_mm , struct mm_struct * src_mm ,
821821 pmd_t * dst_pmd , pmd_t * src_pmd , struct vm_area_struct * vma ,
822+ struct vm_area_struct * new ,
822823 unsigned long addr , unsigned long end )
823824{
824825 pte_t * orig_src_pte , * orig_dst_pte ;
@@ -889,6 +890,7 @@ static int copy_pte_range(struct mm_struct *dst_mm, struct mm_struct *src_mm,
889890
890891static inline int copy_pmd_range (struct mm_struct * dst_mm , struct mm_struct * src_mm ,
891892 pud_t * dst_pud , pud_t * src_pud , struct vm_area_struct * vma ,
893+ struct vm_area_struct * new ,
892894 unsigned long addr , unsigned long end )
893895{
894896 pmd_t * src_pmd , * dst_pmd ;
@@ -915,14 +917,15 @@ static inline int copy_pmd_range(struct mm_struct *dst_mm, struct mm_struct *src
915917 if (pmd_none_or_clear_bad (src_pmd ))
916918 continue ;
917919 if (copy_pte_range (dst_mm , src_mm , dst_pmd , src_pmd ,
918- vma , addr , next ))
920+ vma , new , addr , next ))
919921 return - ENOMEM ;
920922 } while (dst_pmd ++ , src_pmd ++ , addr = next , addr != end );
921923 return 0 ;
922924}
923925
924926static inline int copy_pud_range (struct mm_struct * dst_mm , struct mm_struct * src_mm ,
925927 p4d_t * dst_p4d , p4d_t * src_p4d , struct vm_area_struct * vma ,
928+ struct vm_area_struct * new ,
926929 unsigned long addr , unsigned long end )
927930{
928931 pud_t * src_pud , * dst_pud ;
@@ -949,14 +952,15 @@ static inline int copy_pud_range(struct mm_struct *dst_mm, struct mm_struct *src
949952 if (pud_none_or_clear_bad (src_pud ))
950953 continue ;
951954 if (copy_pmd_range (dst_mm , src_mm , dst_pud , src_pud ,
952- vma , addr , next ))
955+ vma , new , addr , next ))
953956 return - ENOMEM ;
954957 } while (dst_pud ++ , src_pud ++ , addr = next , addr != end );
955958 return 0 ;
956959}
957960
958961static inline int copy_p4d_range (struct mm_struct * dst_mm , struct mm_struct * src_mm ,
959962 pgd_t * dst_pgd , pgd_t * src_pgd , struct vm_area_struct * vma ,
963+ struct vm_area_struct * new ,
960964 unsigned long addr , unsigned long end )
961965{
962966 p4d_t * src_p4d , * dst_p4d ;
@@ -971,14 +975,14 @@ static inline int copy_p4d_range(struct mm_struct *dst_mm, struct mm_struct *src
971975 if (p4d_none_or_clear_bad (src_p4d ))
972976 continue ;
973977 if (copy_pud_range (dst_mm , src_mm , dst_p4d , src_p4d ,
974- vma , addr , next ))
978+ vma , new , addr , next ))
975979 return - ENOMEM ;
976980 } while (dst_p4d ++ , src_p4d ++ , addr = next , addr != end );
977981 return 0 ;
978982}
979983
980984int copy_page_range (struct mm_struct * dst_mm , struct mm_struct * src_mm ,
981- struct vm_area_struct * vma )
985+ struct vm_area_struct * vma , struct vm_area_struct * new )
982986{
983987 pgd_t * src_pgd , * dst_pgd ;
984988 unsigned long next ;
@@ -1033,7 +1037,7 @@ int copy_page_range(struct mm_struct *dst_mm, struct mm_struct *src_mm,
10331037 if (pgd_none_or_clear_bad (src_pgd ))
10341038 continue ;
10351039 if (unlikely (copy_p4d_range (dst_mm , src_mm , dst_pgd , src_pgd ,
1036- vma , addr , next ))) {
1040+ vma , new , addr , next ))) {
10371041 ret = - ENOMEM ;
10381042 break ;
10391043 }
0 commit comments