* be enough slots to hold all possible variants
         */
        unsigned long slot[BUDDY_MASK + 1];
-       unsigned long pool; /* back link + flags */
+       unsigned long pool; /* back link */
        rwlock_t lock;
 };
 #define HANDLE_FLAG_MASK       (0x03)
        PAGE_CLAIMED, /* by either reclaim or free */
 };
 
-/*
- * handle flags, go under HANDLE_FLAG_MASK
- */
-enum z3fold_handle_flags {
-       HANDLES_ORPHANED = 0,
-};
-
 /*
  * Forward declarations
  */
                z3fold_page_unlock(zhdr);
 }
 
-static inline void free_handle(unsigned long handle)
+static inline void free_handle(unsigned long handle, struct z3fold_header *zhdr)
 {
        struct z3fold_buddy_slots *slots;
-       struct z3fold_header *zhdr;
        int i;
        bool is_free;
 
        if (WARN_ON(*(unsigned long *)handle == 0))
                return;
 
-       zhdr = handle_to_z3fold_header(handle);
        slots = handle_to_slots(handle);
        write_lock(&slots->lock);
        *(unsigned long *)handle = 0;
-       if (zhdr->slots == slots) {
-               write_unlock(&slots->lock);
-               return; /* simple case, nothing else to do */
-       }
+       if (zhdr->slots != slots)
+               zhdr->foreign_handles--;
 
-       /* we are freeing a foreign handle if we are here */
-       zhdr->foreign_handles--;
        is_free = true;
-       if (!test_bit(HANDLES_ORPHANED, &slots->pool)) {
-               write_unlock(&slots->lock);
-               return;
-       }
        for (i = 0; i <= BUDDY_MASK; i++) {
                if (slots->slot[i]) {
                        is_free = false;
        if (is_free) {
                struct z3fold_pool *pool = slots_to_pool(slots);
 
+               if (zhdr->slots == slots)
+                       zhdr->slots = NULL;
                kmem_cache_free(pool->c_handle, slots);
        }
 }
 {
        struct page *page = virt_to_page(zhdr);
        struct z3fold_pool *pool = zhdr_to_pool(zhdr);
-       bool is_free = true;
-       int i;
 
        WARN_ON(!list_empty(&zhdr->buddy));
        set_bit(PAGE_STALE, &page->private);
                list_del_init(&page->lru);
        spin_unlock(&pool->lock);
 
-       /* If there are no foreign handles, free the handles array */
-       read_lock(&zhdr->slots->lock);
-       for (i = 0; i <= BUDDY_MASK; i++) {
-               if (zhdr->slots->slot[i]) {
-                       is_free = false;
-                       break;
-               }
-       }
-       if (!is_free)
-               set_bit(HANDLES_ORPHANED, &zhdr->slots->pool);
-       read_unlock(&zhdr->slots->lock);
-
-       if (is_free)
-               kmem_cache_free(pool->c_handle, zhdr->slots);
-
        if (locked)
                z3fold_page_unlock(zhdr);
 
                }
        }
 
+       if (zhdr && !zhdr->slots)
+               zhdr->slots = alloc_slots(pool,
+                                       can_sleep ? GFP_NOIO : GFP_ATOMIC);
        return zhdr;
 }
 
        }
 
        if (!page_claimed)
-               free_handle(handle);
+               free_handle(handle, zhdr);
        if (kref_put(&zhdr->refcount, release_z3fold_page_locked_list)) {
                atomic64_dec(&pool->pages_nr);
                return;
                        ret = pool->ops->evict(pool, middle_handle);
                        if (ret)
                                goto next;
-                       free_handle(middle_handle);
+                       free_handle(middle_handle, zhdr);
                }
                if (first_handle) {
                        ret = pool->ops->evict(pool, first_handle);
                        if (ret)
                                goto next;
-                       free_handle(first_handle);
+                       free_handle(first_handle, zhdr);
                }
                if (last_handle) {
                        ret = pool->ops->evict(pool, last_handle);
                        if (ret)
                                goto next;
-                       free_handle(last_handle);
+                       free_handle(last_handle, zhdr);
                }
 next:
                if (test_bit(PAGE_HEADLESS, &page->private)) {