Block pullup fixes
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 8 Jul 2014 03:38:58 +0000 (20:38 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 8 Jul 2014 03:38:58 +0000 (20:38 -0700)
pullupqueue() acts like pullupblock, in that it makes sure the mainbody
has enough.

pullupblock had a minor accounting issue, in that it failed to zero out
the base (checkb() was failing).

kern/src/ns/allocb.c
kern/src/ns/qio.c

index e6125f2..5cb1850 100644 (file)
@@ -202,7 +202,8 @@ 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) {
        for (int i = 0; i < b->nr_extra_bufs; i++) {
                ebd = &b->extra_data[i];
                if (ebd->base) {
-                       assert(kmalloc_refcnt((void*)ebd->base));
+                       if (!kmalloc_refcnt((void*)ebd->base))
+                               panic("checkb buf %d, base %p has no refcnt!\n", i, ebd->base);
                }
        }
 
                }
        }
 
index f90f2d1..cc12165 100644 (file)
@@ -282,6 +282,7 @@ struct block *pullupblock(struct block *bp, int n)
                                kfree((void *)ebd->base);
                                ebd->len = 0;
                                ebd->off = 0;
                                kfree((void *)ebd->base);
                                ebd->len = 0;
                                ebd->off = 0;
+                               ebd->base = 0;
                        }
                }
                /* maybe just call pullupblock recursively here */
                        }
                }
                /* maybe just call pullupblock recursively here */
@@ -333,14 +334,14 @@ struct block *pullupblock(struct block *bp, int n)
 }
 
 /*
 }
 
 /*
- *  make sure the first block has at least n bytes
+ *  make sure the first block has at least n bytes in its main body
  */
 struct block *pullupqueue(struct queue *q, int n)
 {
        struct block *b;
 
        /* TODO: lock to protect the queue links? */
  */
 struct block *pullupqueue(struct queue *q, int n)
 {
        struct block *b;
 
        /* TODO: lock to protect the queue links? */
-       if ((BLEN(q->bfirst) >= n))
+       if ((BHLEN(q->bfirst) >= n))
                return q->bfirst;
        q->bfirst = pullupblock(q->bfirst, n);
        for (b = q->bfirst; b != NULL && b->next != NULL; b = b->next) ;
                return q->bfirst;
        q->bfirst = pullupblock(q->bfirst, n);
        for (b = q->bfirst; b != NULL && b->next != NULL; b = b->next) ;