mm/various: give up if pte_offset_map[_lock]() fails
[platform/kernel/linux-starfive.git] / mm / gup.c
index d448fd2..598e8c9 100644 (file)
--- a/mm/gup.c
+++ b/mm/gup.c
@@ -545,10 +545,10 @@ static struct page *follow_page_pte(struct vm_area_struct *vma,
        if (WARN_ON_ONCE((flags & (FOLL_PIN | FOLL_GET)) ==
                         (FOLL_PIN | FOLL_GET)))
                return ERR_PTR(-EINVAL);
-       if (unlikely(pmd_bad(*pmd)))
-               return no_page_table(vma, flags);
 
        ptep = pte_offset_map_lock(mm, pmd, address, &ptl);
+       if (!ptep)
+               return no_page_table(vma, flags);
        pte = *ptep;
        if (!pte_present(pte))
                goto no_page;
@@ -852,8 +852,9 @@ static int get_gate_page(struct mm_struct *mm, unsigned long address,
        pmd = pmd_offset(pud, address);
        if (!pmd_present(*pmd))
                return -EFAULT;
-       VM_BUG_ON(pmd_trans_huge(*pmd));
        pte = pte_offset_map(pmd, address);
+       if (!pte)
+               return -EFAULT;
        if (pte_none(*pte))
                goto unmap;
        *vma = get_gate_vma(mm);
@@ -2468,6 +2469,8 @@ static int gup_pte_range(pmd_t pmd, pmd_t *pmdp, unsigned long addr,
        pte_t *ptep, *ptem;
 
        ptem = ptep = pte_offset_map(&pmd, addr);
+       if (!ptep)
+               return 0;
        do {
                pte_t pte = ptep_get_lockless(ptep);
                struct page *page;