aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/sparc/mm/gup.c2
-rw-r--r--fs/dax.c3
-rw-r--r--mm/hmm.c4
-rw-r--r--mm/huge_memory.c4
-rw-r--r--mm/memory.c2
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;
diff --git a/fs/dax.c b/fs/dax.c
index 95981591977a..78b72c48374e 100644
--- a/fs/dax.c
+++ b/fs/dax.c
@@ -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);
diff --git a/mm/hmm.c b/mm/hmm.c
index ea19742a5d60..93718a391611 100644
--- a/mm/hmm.c
+++ b/mm/hmm.c
@@ -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 */
1394static inline bool can_follow_write_pmd(pmd_t pmd, unsigned int flags) 1394static 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;