enum migrate_reason reason)
 {
        int rc = MIGRATEPAGE_SUCCESS;
-       struct page *newpage;
+       struct page *newpage = NULL;
 
        if (!thp_migration_supported() && PageTransHuge(page))
                return -ENOMEM;
 
-       newpage = get_new_page(page, private);
-       if (!newpage)
-               return -ENOMEM;
-
        if (page_count(page) == 1) {
                /* page was freed from under us. So we are done. */
                ClearPageActive(page);
                                __ClearPageIsolated(page);
                        unlock_page(page);
                }
-               if (put_new_page)
-                       put_new_page(newpage, private);
-               else
-                       put_page(newpage);
                goto out;
        }
 
+       newpage = get_new_page(page, private);
+       if (!newpage)
+               return -ENOMEM;
+
        rc = __unmap_and_move(page, newpage, force, mode);
        if (rc == MIGRATEPAGE_SUCCESS)
                set_page_owner_migrate_reason(newpage, reason);