aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/mm.h9
-rw-r--r--mm/memory.c7
2 files changed, 12 insertions, 4 deletions
diff --git a/include/linux/mm.h b/include/linux/mm.h
index ffee2f743418..2be8d9b5e46f 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -145,6 +145,15 @@ extern pgprot_t protection_map[16];
145#define FAULT_FLAG_WRITE 0x01 /* Fault was a write access */ 145#define FAULT_FLAG_WRITE 0x01 /* Fault was a write access */
146#define FAULT_FLAG_NONLINEAR 0x02 /* Fault was via a nonlinear mapping */ 146#define FAULT_FLAG_NONLINEAR 0x02 /* Fault was via a nonlinear mapping */
147 147
148static inline int is_linear_pfn_mapping(struct vm_area_struct *vma)
149{
150 return ((vma->vm_flags & VM_PFNMAP) && vma->vm_pgoff);
151}
152
153static inline int is_pfn_mapping(struct vm_area_struct *vma)
154{
155 return (vma->vm_flags & VM_PFNMAP);
156}
148 157
149/* 158/*
150 * vm_fault is filled by the the pagefault handler and passed to the vma's 159 * vm_fault is filled by the the pagefault handler and passed to the vma's
diff --git a/mm/memory.c b/mm/memory.c
index 164951c47305..cef95c8c77fa 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -1575,11 +1575,10 @@ int remap_pfn_range(struct vm_area_struct *vma, unsigned long addr,
1575 * behaviour that some programs depend on. We mark the "original" 1575 * behaviour that some programs depend on. We mark the "original"
1576 * un-COW'ed pages by matching them up with "vma->vm_pgoff". 1576 * un-COW'ed pages by matching them up with "vma->vm_pgoff".
1577 */ 1577 */
1578 if (is_cow_mapping(vma->vm_flags)) { 1578 if (addr == vma->vm_start && end == vma->vm_end)
1579 if (addr != vma->vm_start || end != vma->vm_end)
1580 return -EINVAL;
1581 vma->vm_pgoff = pfn; 1579 vma->vm_pgoff = pfn;
1582 } 1580 else if (is_cow_mapping(vma->vm_flags))
1581 return -EINVAL;
1583 1582
1584 vma->vm_flags |= VM_IO | VM_RESERVED | VM_PFNMAP; 1583 vma->vm_flags |= VM_IO | VM_RESERVED | VM_PFNMAP;
1585 1584