|
@@ -364,9 +364,10 @@ vma_address(struct page *page, struct vm_area_struct *vma)
|
|
*/
|
|
*/
|
|
unsigned long page_address_in_vma(struct page *page, struct vm_area_struct *vma)
|
|
unsigned long page_address_in_vma(struct page *page, struct vm_area_struct *vma)
|
|
{
|
|
{
|
|
- if (PageAnon(page))
|
|
|
|
- ;
|
|
|
|
- else if (page->mapping && !(vma->vm_flags & VM_NONLINEAR)) {
|
|
|
|
|
|
+ if (PageAnon(page)) {
|
|
|
|
+ if (vma->anon_vma->root != page_anon_vma(page)->root)
|
|
|
|
+ return -EFAULT;
|
|
|
|
+ } else if (page->mapping && !(vma->vm_flags & VM_NONLINEAR)) {
|
|
if (!vma->vm_file ||
|
|
if (!vma->vm_file ||
|
|
vma->vm_file->f_mapping != page->mapping)
|
|
vma->vm_file->f_mapping != page->mapping)
|
|
return -EFAULT;
|
|
return -EFAULT;
|