devicetree: Add DTS file to support the Nexus7 2013 (flo) device.
[cascardo/linux.git] / mm / mprotect.c
index ef5be8e..8eb7bb4 100644 (file)
@@ -149,7 +149,8 @@ static inline unsigned long change_pmd_range(struct vm_area_struct *vma,
                unsigned long this_pages;
 
                next = pmd_addr_end(addr, end);
-               if (!pmd_trans_huge(*pmd) && pmd_none_or_clear_bad(pmd))
+               if (!pmd_trans_huge(*pmd) && !pmd_devmap(*pmd)
+                               && pmd_none_or_clear_bad(pmd))
                        continue;
 
                /* invoke the mmu notifier if the pmd is populated */
@@ -158,9 +159,9 @@ static inline unsigned long change_pmd_range(struct vm_area_struct *vma,
                        mmu_notifier_invalidate_range_start(mm, mni_start, end);
                }
 
-               if (pmd_trans_huge(*pmd)) {
+               if (pmd_trans_huge(*pmd) || pmd_devmap(*pmd)) {
                        if (next - addr != HPAGE_PMD_SIZE)
-                               split_huge_page_pmd(vma, addr, pmd);
+                               split_huge_pmd(vma, pmd, addr);
                        else {
                                int nr_ptes = change_huge_pmd(vma, pmd, addr,
                                                newprot, prot_numa);
@@ -278,6 +279,10 @@ mprotect_fixup(struct vm_area_struct *vma, struct vm_area_struct **pprev,
         * even if read-only so there is no need to account for them here
         */
        if (newflags & VM_WRITE) {
+               /* Check space limits when area turns into data. */
+               if (!may_expand_vm(mm, newflags, nrpages) &&
+                               may_expand_vm(mm, oldflags, nrpages))
+                       return -ENOMEM;
                if (!(oldflags & (VM_ACCOUNT|VM_WRITE|VM_HUGETLB|
                                                VM_SHARED|VM_NORESERVE))) {
                        charged = nrpages;
@@ -334,8 +339,8 @@ success:
                populate_vma_page_range(vma, start, end, NULL);
        }
 
-       vm_stat_account(mm, oldflags, vma->vm_file, -nrpages);
-       vm_stat_account(mm, newflags, vma->vm_file, nrpages);
+       vm_stat_account(mm, oldflags, -nrpages);
+       vm_stat_account(mm, newflags, nrpages);
        perf_event_mmap(vma);
        return 0;