diff options
-rw-r--r-- | arch/sparc/mm/gup.c | 2 | ||||
-rw-r--r-- | fs/dax.c | 3 | ||||
-rw-r--r-- | mm/hmm.c | 4 | ||||
-rw-r--r-- | mm/huge_memory.c | 4 | ||||
-rw-r--r-- | mm/memory.c | 2 |
5 files changed, 8 insertions, 7 deletions
diff --git a/arch/sparc/mm/gup.c b/arch/sparc/mm/gup.c index 5ae2d0a01a70..33c0f8bb0f33 100644 --- a/arch/sparc/mm/gup.c +++ b/arch/sparc/mm/gup.c | |||
@@ -75,7 +75,7 @@ static int gup_huge_pmd(pmd_t *pmdp, pmd_t pmd, unsigned long addr, | |||
75 | if (!(pmd_val(pmd) & _PAGE_VALID)) | 75 | if (!(pmd_val(pmd) & _PAGE_VALID)) |
76 | return 0; | 76 | return 0; |
77 | 77 | ||
78 | if (write && !pmd_write(pmd)) | 78 | if (!pmd_access_permitted(pmd, write)) |
79 | return 0; | 79 | return 0; |
80 | 80 | ||
81 | refs = 0; | 81 | refs = 0; |
@@ -627,7 +627,8 @@ static void dax_mapping_entry_mkclean(struct address_space *mapping, | |||
627 | 627 | ||
628 | if (pfn != pmd_pfn(*pmdp)) | 628 | if (pfn != pmd_pfn(*pmdp)) |
629 | goto unlock_pmd; | 629 | goto unlock_pmd; |
630 | if (!pmd_dirty(*pmdp) && !pmd_write(*pmdp)) | 630 | if (!pmd_dirty(*pmdp) |
631 | && !pmd_access_permitted(*pmdp, WRITE)) | ||
631 | goto unlock_pmd; | 632 | goto unlock_pmd; |
632 | 633 | ||
633 | flush_cache_page(vma, address, pfn); | 634 | flush_cache_page(vma, address, pfn); |
@@ -391,11 +391,11 @@ again: | |||
391 | if (pmd_protnone(pmd)) | 391 | if (pmd_protnone(pmd)) |
392 | return hmm_vma_walk_clear(start, end, walk); | 392 | return hmm_vma_walk_clear(start, end, walk); |
393 | 393 | ||
394 | if (write_fault && !pmd_write(pmd)) | 394 | if (!pmd_access_permitted(pmd, write_fault)) |
395 | return hmm_vma_walk_clear(start, end, walk); | 395 | return hmm_vma_walk_clear(start, end, walk); |
396 | 396 | ||
397 | pfn = pmd_pfn(pmd) + pte_index(addr); | 397 | pfn = pmd_pfn(pmd) + pte_index(addr); |
398 | flag |= pmd_write(pmd) ? HMM_PFN_WRITE : 0; | 398 | flag |= pmd_access_permitted(pmd, WRITE) ? HMM_PFN_WRITE : 0; |
399 | for (; addr < end; addr += PAGE_SIZE, i++, pfn++) | 399 | for (; addr < end; addr += PAGE_SIZE, i++, pfn++) |
400 | pfns[i] = hmm_pfn_t_from_pfn(pfn) | flag; | 400 | pfns[i] = hmm_pfn_t_from_pfn(pfn) | flag; |
401 | return 0; | 401 | return 0; |
diff --git a/mm/huge_memory.c b/mm/huge_memory.c index 4fe2491056a0..05b729f45e8a 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c | |||
@@ -877,7 +877,7 @@ struct page *follow_devmap_pmd(struct vm_area_struct *vma, unsigned long addr, | |||
877 | */ | 877 | */ |
878 | WARN_ONCE(flags & FOLL_COW, "mm: In follow_devmap_pmd with FOLL_COW set"); | 878 | WARN_ONCE(flags & FOLL_COW, "mm: In follow_devmap_pmd with FOLL_COW set"); |
879 | 879 | ||
880 | if (flags & FOLL_WRITE && !pmd_write(*pmd)) | 880 | if (!pmd_access_permitted(*pmd, flags & FOLL_WRITE)) |
881 | return NULL; | 881 | return NULL; |
882 | 882 | ||
883 | if (pmd_present(*pmd) && pmd_devmap(*pmd)) | 883 | if (pmd_present(*pmd) && pmd_devmap(*pmd)) |
@@ -1393,7 +1393,7 @@ out_unlock: | |||
1393 | */ | 1393 | */ |
1394 | static inline bool can_follow_write_pmd(pmd_t pmd, unsigned int flags) | 1394 | static inline bool can_follow_write_pmd(pmd_t pmd, unsigned int flags) |
1395 | { | 1395 | { |
1396 | return pmd_write(pmd) || | 1396 | return pmd_access_permitted(pmd, WRITE) || |
1397 | ((flags & FOLL_FORCE) && (flags & FOLL_COW) && pmd_dirty(pmd)); | 1397 | ((flags & FOLL_FORCE) && (flags & FOLL_COW) && pmd_dirty(pmd)); |
1398 | } | 1398 | } |
1399 | 1399 | ||
diff --git a/mm/memory.c b/mm/memory.c index 25d283d46ea3..416e451a707e 100644 --- a/mm/memory.c +++ b/mm/memory.c | |||
@@ -4046,7 +4046,7 @@ static int __handle_mm_fault(struct vm_area_struct *vma, unsigned long address, | |||
4046 | if (pmd_protnone(orig_pmd) && vma_is_accessible(vma)) | 4046 | if (pmd_protnone(orig_pmd) && vma_is_accessible(vma)) |
4047 | return do_huge_pmd_numa_page(&vmf, orig_pmd); | 4047 | return do_huge_pmd_numa_page(&vmf, orig_pmd); |
4048 | 4048 | ||
4049 | if (dirty && !pmd_write(orig_pmd)) { | 4049 | if (dirty && !pmd_access_permitted(orig_pmd, WRITE)) { |
4050 | ret = wp_huge_pmd(&vmf, orig_pmd); | 4050 | ret = wp_huge_pmd(&vmf, orig_pmd); |
4051 | if (!(ret & VM_FAULT_FALLBACK)) | 4051 | if (!(ret & VM_FAULT_FALLBACK)) |
4052 | return ret; | 4052 | return ret; |