- BUG_ON(!page_mapping(page));
-
- pgd = pgd_offset(mm, addr);
- spin_lock(&mm->page_table_lock);
-
- if (!vx_rsspages_avail(mm, 1))
- goto err_unlock;
-
- pmd = pmd_alloc(mm, pgd, addr);
- if (!pmd)
- goto err_unlock;
-
- pte = pte_alloc_map(mm, pmd, addr);
- if (!pte)
- goto err_unlock;
+ err = -EINVAL;
+ if (vma->vm_file) {
+ inode = vma->vm_file->f_mapping->host;
+ size = (i_size_read(inode) + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
+ if (!page->mapping || page->index >= size)
+ goto unlock;
+ err = -ENOMEM;
+ if (page_mapcount(page) > INT_MAX/2)
+ goto unlock;
+ if (!vx_rsspages_avail(mm, 1))
+ goto unlock;
+ }