0 files changed --- linux-2.4.18-17.8.0/arch/i386/mm/init.c~kmem_cache_validate 2002-12-06 14:52:30.000000000 -0800 +++ linux-2.4.18-17.8.0-zab/arch/i386/mm/init.c 2002-12-06 14:52:30.000000000 -0800 @@ -43,6 +43,12 @@ unsigned long highstart_pfn, highend_pfn static unsigned long totalram_pages; static unsigned long totalhigh_pages; +struct page *check_get_page(unsigned long kaddr) +{ +#warning FIXME: Lustre team, is this solid? + return virt_to_page(kaddr); +} + int do_check_pgt_cache(int low, int high) { int freed = 0; --- linux-2.4.18-17.8.0/arch/ia64/mm/init.c~kmem_cache_validate 2002-12-06 14:52:30.000000000 -0800 +++ linux-2.4.18-17.8.0-zab/arch/ia64/mm/init.c 2002-12-06 14:52:30.000000000 -0800 @@ -37,6 +37,12 @@ unsigned long MAX_DMA_ADDRESS = PAGE_OFF static unsigned long totalram_pages; +struct page *check_get_page(unsigned long kaddr) +{ +#warning FIXME: Lustre team, is this solid? + return virt_to_page(kaddr); +} + int do_check_pgt_cache (int low, int high) { --- linux-2.4.18-17.8.0/include/linux/slab.h~kmem_cache_validate 2002-12-06 14:52:30.000000000 -0800 +++ linux-2.4.18-17.8.0-zab/include/linux/slab.h 2002-12-06 14:52:30.000000000 -0800 @@ -57,6 +57,7 @@ extern int kmem_cache_destroy(kmem_cache extern int kmem_cache_shrink(kmem_cache_t *); extern void *kmem_cache_alloc(kmem_cache_t *, int); extern void kmem_cache_free(kmem_cache_t *, void *); +extern int kmem_cache_validate(kmem_cache_t *cachep, void *objp); extern void *kmalloc(size_t, int); extern void kfree(const void *); --- linux-2.4.18-17.8.0/kernel/ksyms.c~kmem_cache_validate 2002-12-06 14:52:30.000000000 -0800 +++ linux-2.4.18-17.8.0-zab/kernel/ksyms.c 2002-12-06 14:52:30.000000000 -0800 @@ -119,6 +119,7 @@ EXPORT_SYMBOL(kmem_cache_destroy); EXPORT_SYMBOL(kmem_cache_shrink); EXPORT_SYMBOL(kmem_cache_alloc); EXPORT_SYMBOL(kmem_cache_free); +EXPORT_SYMBOL(kmem_cache_validate); EXPORT_SYMBOL(kmalloc); EXPORT_SYMBOL(kfree); EXPORT_SYMBOL(vfree); --- linux-2.4.18-17.8.0/mm/slab.c~kmem_cache_validate 2002-12-06 14:52:30.000000000 -0800 +++ linux-2.4.18-17.8.0-zab/mm/slab.c 2002-12-06 14:52:30.000000000 -0800 @@ -1208,6 +1208,59 @@ failed: * Called with the cache-lock held. */ +extern struct page *check_get_page(unsigned long kaddr); +struct page *page_mem_map(struct page *page); +static int kmem_check_cache_obj (kmem_cache_t * cachep, + slab_t *slabp, void * objp) +{ + int i; + unsigned int objnr; + +#if DEBUG + if (cachep->flags & SLAB_RED_ZONE) { + objp -= BYTES_PER_WORD; + if ( *(unsigned long *)objp != RED_MAGIC2) + /* Either write before start, or a double free. */ + return 0; + if (*(unsigned long *)(objp+cachep->objsize - + BYTES_PER_WORD) != RED_MAGIC2) + /* Either write past end, or a double free. */ + return 0; + } +#endif + + objnr = (objp-slabp->s_mem)/cachep->objsize; + if (objnr >= cachep->num) + return 0; + if (objp != slabp->s_mem + objnr*cachep->objsize) + return 0; + + /* Check slab's freelist to see if this obj is there. */ + for (i = slabp->free; i != BUFCTL_END; i = slab_bufctl(slabp)[i]) { + if (i == objnr) + return 0; + } + return 1; +} + + +int kmem_cache_validate(kmem_cache_t *cachep, void *objp) +{ + struct page *page = check_get_page((unsigned long)objp); + + if (!VALID_PAGE(page)) + return 0; + + if (!PageSlab(page)) + return 0; + + /* XXX check for freed slab objects ? */ + if (!kmem_check_cache_obj(cachep, GET_PAGE_SLAB(page), objp)) + return 0; + + return (cachep == GET_PAGE_CACHE(page)); +} + #if DEBUG static int kmem_extra_free_checks (kmem_cache_t * cachep, slab_t *slabp, void * objp) _