|
@@ -5,6 +5,7 @@
|
|
|
*
|
|
|
* started by Ingo Molnar, Copyright (C) 2002, 2003
|
|
|
*/
|
|
|
+#include <linux/export.h>
|
|
|
#include <linux/backing-dev.h>
|
|
|
#include <linux/mm.h>
|
|
|
#include <linux/swap.h>
|
|
@@ -80,9 +81,10 @@ out:
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
-static int populate_range(struct mm_struct *mm, struct vm_area_struct *vma,
|
|
|
- unsigned long addr, unsigned long size, pgoff_t pgoff)
|
|
|
+int generic_file_remap_pages(struct vm_area_struct *vma, unsigned long addr,
|
|
|
+ unsigned long size, pgoff_t pgoff)
|
|
|
{
|
|
|
+ struct mm_struct *mm = vma->vm_mm;
|
|
|
int err;
|
|
|
|
|
|
do {
|
|
@@ -95,9 +97,9 @@ static int populate_range(struct mm_struct *mm, struct vm_area_struct *vma,
|
|
|
pgoff++;
|
|
|
} while (size);
|
|
|
|
|
|
- return 0;
|
|
|
-
|
|
|
+ return 0;
|
|
|
}
|
|
|
+EXPORT_SYMBOL(generic_file_remap_pages);
|
|
|
|
|
|
/**
|
|
|
* sys_remap_file_pages - remap arbitrary pages of an existing VM_SHARED vma
|
|
@@ -167,7 +169,7 @@ SYSCALL_DEFINE5(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_ops->remap_pages)
|
|
|
goto out;
|
|
|
|
|
|
if (start < vma->vm_start || start + size > vma->vm_end)
|
|
@@ -228,7 +230,7 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size,
|
|
|
}
|
|
|
|
|
|
mmu_notifier_invalidate_range_start(mm, start, start + size);
|
|
|
- err = populate_range(mm, vma, start, size, pgoff);
|
|
|
+ err = vma->vm_ops->remap_pages(vma, start, size, pgoff);
|
|
|
mmu_notifier_invalidate_range_end(mm, start, start + size);
|
|
|
if (!err && !(flags & MAP_NONBLOCK)) {
|
|
|
if (vma->vm_flags & VM_LOCKED) {
|