void *s_mem;            /* including colour offset */
                        unsigned int inuse;     /* num of objs active in slab */
                        kmem_bufctl_t free;
-                       unsigned short nodeid;
                };
                struct slab_rcu __slab_cover_slab_rcu;
        };
 
 static inline int cache_free_alien(struct kmem_cache *cachep, void *objp)
 {
-       struct slab *slabp = virt_to_slab(objp);
-       int nodeid = slabp->nodeid;
+       int nodeid = page_to_nid(virt_to_page(objp));
        struct kmem_cache_node *n;
        struct array_cache *alien = NULL;
        int node;
         * Make sure we are not freeing a object from another node to the array
         * cache on this cpu.
         */
-       if (likely(slabp->nodeid == node))
+       if (likely(nodeid == node))
                return 0;
 
        n = cachep->node[node];
        }
        slabp->inuse = 0;
        slabp->s_mem = addr + colour_off;
-       slabp->nodeid = nodeid;
        slabp->free = 0;
        return slabp;
 }
        next = slab_bufctl(slabp)[slabp->free];
 #if DEBUG
        slab_bufctl(slabp)[slabp->free] = BUFCTL_FREE;
-       WARN_ON(slabp->nodeid != nodeid);
+       WARN_ON(page_to_nid(virt_to_page(objp)) != nodeid);
 #endif
        slabp->free = next;
 
 
 #if DEBUG
        /* Verify that the slab belongs to the intended node */
-       WARN_ON(slabp->nodeid != nodeid);
+       WARN_ON(page_to_nid(virt_to_page(objp)) != nodeid);
 
        if (slab_bufctl(slabp)[objnr] + 1 <= SLAB_LIMIT + 1) {
                printk(KERN_ERR "slab: double free detected in cache "