Skip to content

Commit

Permalink
only allow nonlinear vmas for ram backed filesystems
Browse files Browse the repository at this point in the history
page_mkclean() doesn't re-protect ptes for non-linear mappings, so a later
re-dirty through such a mapping will not generate a fault, PG_dirty will
not reflect the dirty state and the dirty count will be skewed.  This
implies that msync() is also currently broken for nonlinear mappings.

The easiest solution is to emulate remap_file_pages on non-linear mappings
with simple mmap() for non ram-backed filesystems.  Applications continue
to work (albeit slower), as long as the number of remappings remain below
the maximum vma count.

However all currently known real uses of non-linear mappings are for ram
backed filesystems, which this patch doesn't affect.

Signed-off-by: Miklos Szeredi <[email protected]>
Acked-by: Peter Zijlstra <[email protected]>
Cc: William Lee Irwin III <[email protected]>
Cc: Nick Piggin <[email protected]>
Cc: Ingo Molnar <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
Miklos Szeredi authored and Linus Torvalds committed Jul 19, 2007
1 parent bb2d5ce commit 3ee6daf
Showing 1 changed file with 19 additions and 0 deletions.
19 changes: 19 additions & 0 deletions mm/fremap.c
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,25 @@ asmlinkage long sys_remap_file_pages(unsigned long start, unsigned long size,
goto retry;
}
mapping = vma->vm_file->f_mapping;
/*
* page_mkclean doesn't work on nonlinear vmas, so if
* dirty pages need to be accounted, emulate with linear
* vmas.
*/
if (mapping_cap_account_dirty(mapping)) {
unsigned long addr;

flags &= MAP_NONBLOCK;
addr = mmap_region(vma->vm_file, start, size,
flags, vma->vm_flags, pgoff, 1);
if (IS_ERR_VALUE(addr)) {
err = addr;
} else {
BUG_ON(addr != start);
err = 0;
}
goto out;
}
spin_lock(&mapping->i_mmap_lock);
flush_dcache_mmap_lock(mapping);
vma->vm_flags |= VM_NONLINEAR;
Expand Down

0 comments on commit 3ee6daf

Please sign in to comment.