static void
 hugetlb_install_folio(struct vm_area_struct *vma, pte_t *ptep, unsigned long addr,
-                    struct folio *new_folio)
+                     struct folio *new_folio, pte_t old)
 {
+       pte_t newpte = make_huge_pte(vma, &new_folio->page, 1);
+
        __folio_mark_uptodate(new_folio);
        hugepage_add_new_anon_rmap(new_folio, vma, addr);
-       set_huge_pte_at(vma->vm_mm, addr, ptep, make_huge_pte(vma, &new_folio->page, 1));
+       if (userfaultfd_wp(vma) && huge_pte_uffd_wp(old))
+               newpte = huge_pte_mkuffd_wp(newpte);
+       set_huge_pte_at(vma->vm_mm, addr, ptep, newpte);
        hugetlb_count_add(pages_per_huge_page(hstate_vma(vma)), vma->vm_mm);
        folio_set_hugetlb_migratable(new_folio);
 }
                         */
                        ;
                } else if (unlikely(is_hugetlb_entry_hwpoisoned(entry))) {
-                       bool uffd_wp = huge_pte_uffd_wp(entry);
-
-                       if (!userfaultfd_wp(dst_vma) && uffd_wp)
+                       if (!userfaultfd_wp(dst_vma))
                                entry = huge_pte_clear_uffd_wp(entry);
                        set_huge_pte_at(dst, addr, dst_pte, entry);
                } else if (unlikely(is_hugetlb_entry_migration(entry))) {
                        swp_entry_t swp_entry = pte_to_swp_entry(entry);
-                       bool uffd_wp = huge_pte_uffd_wp(entry);
+                       bool uffd_wp = pte_swp_uffd_wp(entry);
 
                        if (!is_readable_migration_entry(swp_entry) && cow) {
                                /*
                                                        swp_offset(swp_entry));
                                entry = swp_entry_to_pte(swp_entry);
                                if (userfaultfd_wp(src_vma) && uffd_wp)
-                                       entry = huge_pte_mkuffd_wp(entry);
+                                       entry = pte_swp_mkuffd_wp(entry);
                                set_huge_pte_at(src, addr, src_pte, entry);
                        }
-                       if (!userfaultfd_wp(dst_vma) && uffd_wp)
+                       if (!userfaultfd_wp(dst_vma))
                                entry = huge_pte_clear_uffd_wp(entry);
                        set_huge_pte_at(dst, addr, dst_pte, entry);
                } else if (unlikely(is_pte_marker(entry))) {
                                        /* huge_ptep of dst_pte won't change as in child */
                                        goto again;
                                }
-                               hugetlb_install_folio(dst_vma, dst_pte, addr, new_folio);
+                               hugetlb_install_folio(dst_vma, dst_pte, addr,
+                                                     new_folio, src_pte_old);
                                spin_unlock(src_ptl);
                                spin_unlock(dst_ptl);
                                continue;
                                entry = huge_pte_wrprotect(entry);
                        }
 
+                       if (!userfaultfd_wp(dst_vma))
+                               entry = huge_pte_clear_uffd_wp(entry);
+
                        set_huge_pte_at(dst, addr, dst_pte, entry);
                        hugetlb_count_add(npages, dst);
                }