From bc8cd81c9cc4039b8aef6a9c8938c990fbc91ab5 Mon Sep 17 00:00:00 2001 From: Miklos Szeredi Date: Thu, 19 Jul 2007 01:47:24 -0700 Subject: [PATCH] --- yaml --- r: 61536 b: refs/heads/master c: 3ee6dafc677a68e461a7ddafc94a580ebab80735 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/mm/fremap.c | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 81d72d0be62d..5336753feb1c 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: bb2d5ce16409efcdf94017a6b6fecd468226e29c +refs/heads/master: 3ee6dafc677a68e461a7ddafc94a580ebab80735 diff --git a/trunk/mm/fremap.c b/trunk/mm/fremap.c index 5f50d736a037..c395b1abf082 100644 --- a/trunk/mm/fremap.c +++ b/trunk/mm/fremap.c @@ -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;