Whamcloud - gitweb
file xnu_types.h was initially added on branch b_port_step.
[fs/lustre-release.git] / lustre / kernel_patches / patches / kmem_cache_validate.patch
1
2
3
4  0 files changed
5
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;
11  
12 +struct page *check_get_page(unsigned long kaddr)
13 +{
14 +#warning FIXME: Lustre team, is this solid?
15 +       return virt_to_page(kaddr);
16 +}
17 +
18  int do_check_pgt_cache(int low, int high)
19  {
20         int freed = 0;
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
24  
25  static unsigned long totalram_pages;
26  
27 +struct page *check_get_page(unsigned long kaddr)
28 +{
29 +#warning FIXME: Lustre team, is this solid?
30 +       return virt_to_page(kaddr);
31 +}
32 +
33  int
34  do_check_pgt_cache (int low, int high)
35  {
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);
43  
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);
54  EXPORT_SYMBOL(kfree);
55  EXPORT_SYMBOL(vfree);
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.
60   */
61  
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)
66 +{
67 +       int i;
68 +       unsigned int objnr;
69 +
70 +#if DEBUG
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. */
75 +                       return 0;
76 +               if (*(unsigned long *)(objp+cachep->objsize -
77 +                               BYTES_PER_WORD) != RED_MAGIC2)
78 +                       /* Either write past end, or a double free. */
79 +                       return 0;
80 +       }
81 +#endif
82 +
83 +       objnr = (objp-slabp->s_mem)/cachep->objsize;
84 +       if (objnr >= cachep->num)
85 +               return 0;
86 +       if (objp != slabp->s_mem + objnr*cachep->objsize)
87 +               return 0;
88 +
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]) {
91 +               if (i == objnr)
92 +                       return 0;
93 +       }
94 +       return 1;
95 +}
96 +
97 +
98 +int kmem_cache_validate(kmem_cache_t *cachep, void *objp)
99 +{
100 +       struct page *page = check_get_page((unsigned long)objp);
101 +
102 +       if (!VALID_PAGE(page))
103 +               return 0;
104 +
105 +       if (!PageSlab(page))
106 +               return 0;
107 +
108 +       /* XXX check for freed slab objects ? */
109 +       if (!kmem_check_cache_obj(cachep, GET_PAGE_SLAB(page), objp))
110 +               return 0;
111 +
112 +       return (cachep == GET_PAGE_CACHE(page));
113 +}
114 +
115  #if DEBUG
116  static int kmem_extra_free_checks (kmem_cache_t * cachep,
117                         slab_t *slabp, void * objp)
118
119 _