|
@@ -3299,7 +3299,12 @@ int make_pages_present(unsigned long addr, unsigned long end)
|
|
vma = find_vma(current->mm, addr);
|
|
vma = find_vma(current->mm, addr);
|
|
if (!vma)
|
|
if (!vma)
|
|
return -ENOMEM;
|
|
return -ENOMEM;
|
|
- write = (vma->vm_flags & VM_WRITE) != 0;
|
|
|
|
|
|
+ /*
|
|
|
|
+ * We want to touch writable mappings with a write fault in order
|
|
|
|
+ * to break COW, except for shared mappings because these don't COW
|
|
|
|
+ * and we would not want to dirty them for nothing.
|
|
|
|
+ */
|
|
|
|
+ write = (vma->vm_flags & (VM_WRITE | VM_SHARED)) == VM_WRITE;
|
|
BUG_ON(addr >= end);
|
|
BUG_ON(addr >= end);
|
|
BUG_ON(end > vma->vm_end);
|
|
BUG_ON(end > vma->vm_end);
|
|
len = DIV_ROUND_UP(end, PAGE_SIZE) - addr/PAGE_SIZE;
|
|
len = DIV_ROUND_UP(end, PAGE_SIZE) - addr/PAGE_SIZE;
|