z3fold_page_unlock(zhdr);
                return -EBUSY;
        }
+       if (work_pending(&zhdr->work)) {
+               z3fold_page_unlock(zhdr);
+               return -EAGAIN;
+       }
        new_zhdr = page_address(newpage);
        memcpy(new_zhdr, zhdr, PAGE_SIZE);
        newpage->private = page->private;
        page->private = 0;
        z3fold_page_unlock(zhdr);
        spin_lock_init(&new_zhdr->page_lock);
+       INIT_WORK(&new_zhdr->work, compact_page_work);
+       /*
+        * z3fold_page_isolate() ensures that new_zhdr->buddy is empty,
+        * so we only have to reinitialize it.
+        */
+       INIT_LIST_HEAD(&new_zhdr->buddy);
        new_mapping = page_mapping(page);
        __ClearPageMovable(page);
        ClearPagePrivate(page);