]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - mm/fremap.c
ps3av: add quirk database for broken monitors
[linux-2.6-omap-h63xx.git] / mm / fremap.c
index 5f50d736a03779dc12606abf99c46031ee45437a..95bcb5641c722b6f4d7eb49801320e0a266f7c83 100644 (file)
@@ -160,7 +160,7 @@ asmlinkage long sys_remap_file_pages(unsigned long start, unsigned long size,
        if (vma->vm_private_data && !(vma->vm_flags & VM_NONLINEAR))
                goto out;
 
-       if (!vma->vm_flags & VM_CAN_NONLINEAR)
+       if (!(vma->vm_flags & VM_CAN_NONLINEAR))
                goto out;
 
        if (end <= start || start < vma->vm_start || end > vma->vm_end)
@@ -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;