6 --- linux-2.4.18-17.8.0/arch/i386/mm/init.c~kmem_cache_validate 2002-12-06 14:52:30.000000000 -0800
7 +++ linux-2.4.18-17.8.0-zab/arch/i386/mm/init.c 2002-12-06 14:52:30.000000000 -0800
8 @@ -43,6 +43,12 @@ unsigned long highstart_pfn, highend_pfn
9 static unsigned long totalram_pages;
10 static unsigned long totalhigh_pages;
12 +struct page *check_get_page(unsigned long kaddr)
14 +#warning FIXME: Lustre team, is this solid?
15 + return virt_to_page(kaddr);
18 int do_check_pgt_cache(int low, int high)
21 --- linux-2.4.18-17.8.0/arch/ia64/mm/init.c~kmem_cache_validate 2002-12-06 14:52:30.000000000 -0800
22 +++ linux-2.4.18-17.8.0-zab/arch/ia64/mm/init.c 2002-12-06 14:52:30.000000000 -0800
23 @@ -37,6 +37,12 @@ unsigned long MAX_DMA_ADDRESS = PAGE_OFF
25 static unsigned long totalram_pages;
27 +struct page *check_get_page(unsigned long kaddr)
29 +#warning FIXME: Lustre team, is this solid?
30 + return virt_to_page(kaddr);
34 do_check_pgt_cache (int low, int high)
36 --- linux-2.4.18-17.8.0/include/linux/slab.h~kmem_cache_validate 2002-12-06 14:52:30.000000000 -0800
37 +++ linux-2.4.18-17.8.0-zab/include/linux/slab.h 2002-12-06 14:52:30.000000000 -0800
38 @@ -57,6 +57,7 @@ extern int kmem_cache_destroy(kmem_cache
39 extern int kmem_cache_shrink(kmem_cache_t *);
40 extern void *kmem_cache_alloc(kmem_cache_t *, int);
41 extern void kmem_cache_free(kmem_cache_t *, void *);
42 +extern int kmem_cache_validate(kmem_cache_t *cachep, void *objp);
44 extern void *kmalloc(size_t, int);
45 extern void kfree(const void *);
46 --- linux-2.4.18-17.8.0/kernel/ksyms.c~kmem_cache_validate 2002-12-06 14:52:30.000000000 -0800
47 +++ linux-2.4.18-17.8.0-zab/kernel/ksyms.c 2002-12-06 14:52:30.000000000 -0800
48 @@ -119,6 +119,7 @@ EXPORT_SYMBOL(kmem_cache_destroy);
49 EXPORT_SYMBOL(kmem_cache_shrink);
50 EXPORT_SYMBOL(kmem_cache_alloc);
51 EXPORT_SYMBOL(kmem_cache_free);
52 +EXPORT_SYMBOL(kmem_cache_validate);
53 EXPORT_SYMBOL(kmalloc);
56 --- linux-2.4.18-17.8.0/mm/slab.c~kmem_cache_validate 2002-12-06 14:52:30.000000000 -0800
57 +++ linux-2.4.18-17.8.0-zab/mm/slab.c 2002-12-06 14:52:30.000000000 -0800
58 @@ -1208,6 +1208,59 @@ failed:
59 * Called with the cache-lock held.
62 +extern struct page *check_get_page(unsigned long kaddr);
63 +struct page *page_mem_map(struct page *page);
64 +static int kmem_check_cache_obj (kmem_cache_t * cachep,
65 + slab_t *slabp, void * objp)
71 + if (cachep->flags & SLAB_RED_ZONE) {
72 + objp -= BYTES_PER_WORD;
73 + if ( *(unsigned long *)objp != RED_MAGIC2)
74 + /* Either write before start, or a double free. */
76 + if (*(unsigned long *)(objp+cachep->objsize -
77 + BYTES_PER_WORD) != RED_MAGIC2)
78 + /* Either write past end, or a double free. */
83 + objnr = (objp-slabp->s_mem)/cachep->objsize;
84 + if (objnr >= cachep->num)
86 + if (objp != slabp->s_mem + objnr*cachep->objsize)
89 + /* Check slab's freelist to see if this obj is there. */
90 + for (i = slabp->free; i != BUFCTL_END; i = slab_bufctl(slabp)[i]) {
98 +int kmem_cache_validate(kmem_cache_t *cachep, void *objp)
100 + struct page *page = check_get_page((unsigned long)objp);
102 + if (!VALID_PAGE(page))
105 + if (!PageSlab(page))
108 + /* XXX check for freed slab objects ? */
109 + if (!kmem_check_cache_obj(cachep, GET_PAGE_SLAB(page), objp))
112 + return (cachep == GET_PAGE_CACHE(page));
116 static int kmem_extra_free_checks (kmem_cache_t * cachep,
117 slab_t *slabp, void * objp)