unsigned long addr_hint,
                                struct vm_area_struct *vma,
                                unsigned int pages_per_huge_page);
-extern long copy_huge_page_from_user(struct page *dst_page,
-                               const void __user *usr_src,
-                               unsigned int pages_per_huge_page,
-                               bool allow_pagefault);
+long copy_folio_from_user(struct folio *dst_folio,
+                          const void __user *usr_src,
+                          bool allow_pagefault);
 
 /**
  * vma_is_special_huge - Are transhuge page-table entries considered special?
 
                        goto out;
                }
 
-               ret = copy_huge_page_from_user(&folio->page,
-                                               (const void __user *) src_addr,
-                                               pages_per_huge_page(h), false);
+               ret = copy_folio_from_user(folio, (const void __user *) src_addr,
+                                          false);
 
                /* fallback to copy_from_user outside mmap_lock */
                if (unlikely(ret)) {
 
        process_huge_page(addr_hint, pages_per_huge_page, copy_subpage, &arg);
 }
 
-long copy_huge_page_from_user(struct page *dst_page,
-                               const void __user *usr_src,
-                               unsigned int pages_per_huge_page,
-                               bool allow_pagefault)
+long copy_folio_from_user(struct folio *dst_folio,
+                          const void __user *usr_src,
+                          bool allow_pagefault)
 {
-       void *page_kaddr;
+       void *kaddr;
        unsigned long i, rc = 0;
-       unsigned long ret_val = pages_per_huge_page * PAGE_SIZE;
+       unsigned int nr_pages = folio_nr_pages(dst_folio);
+       unsigned long ret_val = nr_pages * PAGE_SIZE;
        struct page *subpage;
 
-       for (i = 0; i < pages_per_huge_page; i++) {
-               subpage = nth_page(dst_page, i);
-               page_kaddr = kmap_local_page(subpage);
+       for (i = 0; i < nr_pages; i++) {
+               subpage = folio_page(dst_folio, i);
+               kaddr = kmap_local_page(subpage);
                if (!allow_pagefault)
                        pagefault_disable();
-               rc = copy_from_user(page_kaddr,
-                               usr_src + i * PAGE_SIZE, PAGE_SIZE);
+               rc = copy_from_user(kaddr, usr_src + i * PAGE_SIZE, PAGE_SIZE);
                if (!allow_pagefault)
                        pagefault_enable();
-               kunmap_local(page_kaddr);
+               kunmap_local(kaddr);
 
                ret_val -= (PAGE_SIZE - rc);
                if (rc)
 
                        mmap_read_unlock(dst_mm);
                        BUG_ON(!page);
 
-                       err = copy_huge_page_from_user(page,
-                                               (const void __user *)src_addr,
-                                               vma_hpagesize / PAGE_SIZE,
-                                               true);
+                       err = copy_folio_from_user(page_folio(page),
+                                                  (const void __user *)src_addr, true);
                        if (unlikely(err)) {
                                err = -EFAULT;
                                goto out;