Check block extra_len in checkb()
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 5 Apr 2016 19:36:13 +0000 (15:36 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 5 Apr 2016 19:42:19 +0000 (15:42 -0400)
This helped catch a bug.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/src/ns/allocb.c
kern/src/ns/qio.c

index 5e5bfd0..1e91709 100644 (file)
@@ -225,6 +225,7 @@ 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);
@@ -251,12 +252,19 @@ void checkb(struct block *b, char *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 buf %d, base %p has no refcnt!\n", i, 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 printblock(struct block *b)
index cf8df08..f1ddf6a 100644 (file)
@@ -302,7 +302,7 @@ struct block *pullupblock(struct block *bp, int n)
                if (len > bp->extra_len)
                        panic("pullup more than extra (%d, %d, %d)\n",
                              n, BHLEN(bp), bp->extra_len);
-               checkb(bp, "before pullup");
+               QDEBUG checkb(bp, "before pullup");
                for (int i = 0; (i < bp->nr_extra_bufs) && len; i++) {
                        ebd = &bp->extra_data[i];
                        if (!ebd->base || !ebd->len)
@@ -323,7 +323,7 @@ struct block *pullupblock(struct block *bp, int n)
                /* maybe just call pullupblock recursively here */
                if (len)
                        panic("pullup %d bytes overdrawn\n", len);
-               checkb(bp, "after pullup");
+               QDEBUG checkb(bp, "after pullup");
                return bp;
        }