This isfor test coverage of nonlinear mappings. - Force all PROT_EXEC file mmappings to be nonlinear. - Force _all_ file-backed mappings to be treated as nonlinear after they are unmapped. mm/fremap.c | 2 +- mm/mmap.c | 6 ++++-- mm/rmap.c | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff -puN mm/mmap.c~fremap-all-mappings mm/mmap.c --- 25/mm/mmap.c~fremap-all-mappings 2003-03-14 20:28:46.000000000 -0800 +++ 25-akpm/mm/mmap.c 2003-03-14 20:28:46.000000000 -0800 @@ -714,9 +714,11 @@ out: mm->locked_vm += len >> PAGE_SHIFT; make_pages_present(addr, addr + len); } - if (flags & MAP_POPULATE) { + if ((file && (prot & PROT_EXEC)) || (flags & MAP_POPULATE)) { + int err; + up_write(&mm->mmap_sem); - sys_remap_file_pages(addr, len, prot, + err = sys_remap_file_pages(addr, len, prot & 0, pgoff, flags & MAP_NONBLOCK); down_write(&mm->mmap_sem); } diff -puN mm/rmap.c~fremap-all-mappings mm/rmap.c --- 25/mm/rmap.c~fremap-all-mappings 2003-03-14 20:28:46.000000000 -0800 +++ 25-akpm/mm/rmap.c 2003-03-14 20:28:46.000000000 -0800 @@ -383,7 +383,7 @@ static int try_to_unmap_one(struct page pgidx = (address - vma->vm_start) >> PAGE_SHIFT; pgidx += vma->vm_pgoff; pgidx >>= PAGE_CACHE_SHIFT - PAGE_SHIFT; - if (page->index != pgidx) { + if (1 || page->index != pgidx) { set_pte(ptep, pgoff_to_pte(page->index)); BUG_ON(!pte_file(*ptep)); } diff -puN mm/fremap.c~fremap-all-mappings mm/fremap.c --- 25/mm/fremap.c~fremap-all-mappings 2003-03-14 20:28:46.000000000 -0800 +++ 25-akpm/mm/fremap.c 2003-03-14 20:28:46.000000000 -0800 @@ -147,7 +147,7 @@ int sys_remap_file_pages(unsigned long s * and that the remapped range is valid and fully within * the single existing vma: */ - if (vma && (vma->vm_flags & VM_SHARED) && + if (vma && /*(vma->vm_flags & VM_SHARED) && */ vma->vm_ops && vma->vm_ops->populate && end > start && start >= vma->vm_start && end <= vma->vm_end) _