va_end(args);
}
+static void object_err(struct kmem_cache *s, struct slab *slab,
+ u8 *object, char *reason);
+
static bool freelist_corrupted(struct kmem_cache *s, struct slab *slab,
void **freelist, void *nextfree)
{
if ((s->flags & SLAB_CONSISTENCY_CHECKS) &&
!check_valid_pointer(s, slab, nextfree) && freelist) {
- object_err(s, slab_page(slab), *freelist, "Freechain corrupt");
+ object_err(s, slab, *freelist, "Freechain corrupt");
*freelist = NULL;
slab_fix(s, "Isolate corrupted freechain");
return true;
dump_stack();
}
-void object_err(struct kmem_cache *s, struct page *page,
+static void object_err(struct kmem_cache *s, struct slab *slab,
u8 *object, char *reason)
{
if (slab_add_kunit_errors())
return;
slab_bug(s, "%s", reason);
- print_trailer(s, page, object);
+ print_trailer(s, slab_page(slab), object);
add_taint(TAINT_BAD_PAGE, LOCKDEP_NOW_UNRELIABLE);
}
/* Check free pointer validity */
if (!check_valid_pointer(s, slab, get_freepointer(s, p))) {
- object_err(s, slab_page(slab), p, "Freepointer corrupt");
+ object_err(s, slab, p, "Freepointer corrupt");
/*
* No choice but to zap it and thus lose the remainder
* of the free objects in this slab. May cause
return 1;
if (!check_valid_pointer(s, slab, fp)) {
if (object) {
- object_err(s, slab_page(slab), object,
+ object_err(s, slab, object,
"Freechain corrupt");
set_freepointer(s, object, NULL);
} else {
return 0;
if (!check_valid_pointer(s, slab, object)) {
- object_err(s, slab_page(slab), object, "Freelist Pointer check fails");
+ object_err(s, slab, object, "Freelist Pointer check fails");
return 0;
}
}
if (on_freelist(s, slab, object)) {
- object_err(s, slab_page(slab), object, "Object already free");
+ object_err(s, slab, object, "Object already free");
return 0;
}
object);
dump_stack();
} else
- object_err(s, slab_page(slab), object,
- "slab pointer corrupt.");
+ object_err(s, slab, object, "slab pointer corrupt.");
return 0;
}
return 1;