void checkb(struct block *b, char *msg) { void *dead = (void *)Bdead; struct extra_bdata *ebd; size_t extra_len = 0; if (b == dead) panic("checkb b %s 0x%lx", msg, b); if (b->base == dead || b->lim == dead || b->next == dead || b->rp == dead || b->wp == dead) { printd("checkb: base 0x%8.8lx lim 0x%8.8lx next 0x%8.8lx\n", b->base, b->lim, b->next); printd("checkb: rp 0x%8.8lx wp 0x%8.8lx\n", b->rp, b->wp); panic("checkb dead: %s\n", msg); } if (b->base > b->lim) panic("checkb 0 %s 0x%lx 0x%lx", msg, b->base, b->lim); if (b->rp < b->base) panic("checkb 1 %s 0x%lx 0x%lx", msg, b->base, b->rp); if (b->wp < b->base) panic("checkb 2 %s 0x%lx 0x%lx", msg, b->base, b->wp); if (b->rp > b->lim) panic("checkb 3 %s 0x%lx 0x%lx", msg, b->rp, b->lim); if (b->wp > b->lim) panic("checkb 4 %s 0x%lx 0x%lx", msg, b->wp, b->lim); if (b->nr_extra_bufs && !b->extra_data) panic("checkb 5 %s missing extra_data", msg); for (int i = 0; i < b->nr_extra_bufs; i++) { ebd = &b->extra_data[i]; if (!ebd->base && (ebd->off || ebd->len)) panic("checkb %s: ebd %d has no base, but has off %d and len %d", msg, i, ebd->off, ebd->len); if (ebd->base) { if (!kmalloc_refcnt((void*)ebd->base)) panic("checkb %s: buf %d, base %p has no refcnt!\n", msg, i, ebd->base); extra_len += ebd->len; } } if (extra_len != b->extra_len) panic("checkb %s: block extra_len %d differs from sum of ebd len %d", msg, b->extra_len, extra_len); }
void checkb(struct block *b, char *msg) { void *dead = (void *)Bdead; struct extra_bdata *ebd; if (b == dead) panic("checkb b %s 0x%lx", msg, b); if (b->base == dead || b->lim == dead || b->next == dead || b->rp == dead || b->wp == dead) { printd("checkb: base 0x%8.8lx lim 0x%8.8lx next 0x%8.8lx\n", b->base, b->lim, b->next); printd("checkb: rp 0x%8.8lx wp 0x%8.8lx\n", b->rp, b->wp); panic("checkb dead: %s\n", msg); } if (b->base > b->lim) panic("checkb 0 %s 0x%lx 0x%lx", msg, b->base, b->lim); if (b->rp < b->base) panic("checkb 1 %s 0x%lx 0x%lx", msg, b->base, b->rp); if (b->wp < b->base) panic("checkb 2 %s 0x%lx 0x%lx", msg, b->base, b->wp); if (b->rp > b->lim) panic("checkb 3 %s 0x%lx 0x%lx", msg, b->rp, b->lim); if (b->wp > b->lim) panic("checkb 4 %s 0x%lx 0x%lx", msg, b->wp, b->lim); if (b->nr_extra_bufs && !b->extra_data) panic("checkb 5 %s missing extra_data", msg); for (int i = 0; i < b->nr_extra_bufs; i++) { ebd = &b->extra_data[i]; if (ebd->base) { if (!kmalloc_refcnt((void*)ebd->base)) panic("checkb buf %d, base %p has no refcnt!\n", i, ebd->base); } } }