unsigned long i;
 
        for (i = 0; i < npages; i++) {
-               struct folio *dst, *src;
+               struct folio *dst = NULL, *src = NULL;
                struct page *newpage = migrate_pfn_to_page(dst_pfns[i]);
                struct page *page = migrate_pfn_to_page(src_pfns[i]);
 
+               if (newpage)
+                       dst = page_folio(newpage);
+
                if (!page) {
-                       if (newpage) {
-                               unlock_page(newpage);
-                               put_page(newpage);
+                       if (dst) {
+                               folio_unlock(dst);
+                               folio_put(dst);
                        }
                        continue;
                }
 
-               if (!(src_pfns[i] & MIGRATE_PFN_MIGRATE) || !newpage) {
-                       if (newpage) {
-                               unlock_page(newpage);
-                               put_page(newpage);
+               src = page_folio(page);
+
+               if (!(src_pfns[i] & MIGRATE_PFN_MIGRATE) || !dst) {
+                       if (dst) {
+                               folio_unlock(dst);
+                               folio_put(dst);
                        }
-                       newpage = page;
+                       dst = src;
                }
 
-               src = page_folio(page);
-               dst = page_folio(newpage);
                remove_migration_ptes(src, dst, false);
                folio_unlock(src);
 
-               if (is_zone_device_page(page))
-                       put_page(page);
+               if (folio_is_zone_device(src))
+                       folio_put(src);
                else
-                       putback_lru_page(page);
+                       folio_putback_lru(src);
 
-               if (newpage != page) {
-                       unlock_page(newpage);
-                       if (is_zone_device_page(newpage))
-                               put_page(newpage);
+               if (dst != src) {
+                       folio_unlock(dst);
+                       if (folio_is_zone_device(dst))
+                               folio_put(dst);
                        else
-                               putback_lru_page(newpage);
+                               folio_putback_lru(dst);
                }
        }
 }