set_huge_pte_at(mm, addr, ptep, pte);
 }
 #endif
+
+#ifndef huge_ptep_modify_prot_start
+#define huge_ptep_modify_prot_start huge_ptep_modify_prot_start
+static inline pte_t huge_ptep_modify_prot_start(struct vm_area_struct *vma,
+                                               unsigned long addr, pte_t *ptep)
+{
+       return huge_ptep_get_and_clear(vma->vm_mm, addr, ptep);
+}
+#endif
+
+#ifndef huge_ptep_modify_prot_commit
+#define huge_ptep_modify_prot_commit huge_ptep_modify_prot_commit
+static inline void huge_ptep_modify_prot_commit(struct vm_area_struct *vma,
+                                               unsigned long addr, pte_t *ptep,
+                                               pte_t old_pte, pte_t pte)
+{
+       set_huge_pte_at(vma->vm_mm, addr, ptep, pte);
+}
+#endif
+
 #else  /* CONFIG_HUGETLB_PAGE */
 struct hstate {};
 #define alloc_huge_page(v, a, r) NULL
 
                        continue;
                }
                if (!huge_pte_none(pte)) {
-                       pte = huge_ptep_get_and_clear(mm, address, ptep);
-                       pte = pte_mkhuge(huge_pte_modify(pte, newprot));
+                       pte_t old_pte;
+
+                       old_pte = huge_ptep_modify_prot_start(vma, address, ptep);
+                       pte = pte_mkhuge(huge_pte_modify(old_pte, newprot));
                        pte = arch_make_huge_pte(pte, vma, NULL, 0);
-                       set_huge_pte_at(mm, address, ptep, pte);
+                       huge_ptep_modify_prot_commit(vma, address, ptep, old_pte, pte);
                        pages++;
                }
                spin_unlock(ptl);