]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - arch/x86/mm/gup.c
x86, mm: fix gup_pte_range() vs DAX mappings
[mirror_ubuntu-artful-kernel.git] / arch / x86 / mm / gup.c
index 99c7805a96937c17fffa7b92eb72a8b8c776ccbb..9d32ee6088079c7ae5d83a5595a14e366f2d0e61 100644 (file)
@@ -120,6 +120,11 @@ static noinline int gup_pte_range(pmd_t pmd, unsigned long addr,
                        return 0;
                }
 
+               if (!pte_allows_gup(pte_val(pte), write)) {
+                       pte_unmap(ptep);
+                       return 0;
+               }
+
                if (pte_devmap(pte)) {
                        pgmap = get_dev_pagemap(pte_pfn(pte), pgmap);
                        if (unlikely(!pgmap)) {
@@ -127,8 +132,7 @@ static noinline int gup_pte_range(pmd_t pmd, unsigned long addr,
                                pte_unmap(ptep);
                                return 0;
                        }
-               } else if (!pte_allows_gup(pte_val(pte), write) ||
-                          pte_special(pte)) {
+               } else if (pte_special(pte)) {
                        pte_unmap(ptep);
                        return 0;
                }