Pass the buf to block_append_extra()
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 28 Mar 2016 19:34:08 +0000 (15:34 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 31 Mar 2016 20:53:42 +0000 (16:53 -0400)
Instead of assuming that they want us to allocate the block, we just take
any old buffer of kmalloc'd memory.

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

index 3973cb7..8deffaa 100644 (file)
@@ -650,7 +650,8 @@ void addrootfile(char *unused_char_p_t, uint8_t * unused_uint8_p_t, uint32_t);
 struct block *adjustblock(struct block *, int);
 struct block *block_alloc(size_t, int);
 int block_add_extd(struct block *b, unsigned int nr_bufs, int mem_flags);
-int block_append_extra(struct block *b, int len, int mem_flags);
+int block_append_extra(struct block *b, uintptr_t base, uint32_t off,
+                       uint32_t len, int mem_flags);
 int anyhigher(void);
 int anyready(void);
 void _assert(char *unused_char_p_t);
index bc2057d..3d96ec3 100644 (file)
@@ -139,10 +139,11 @@ static struct extra_bdata *next_unused_slot(struct block *b)
        return ebd;
 }
 
-/* Append a zero-filled extra data buffer of length @len to block @b.
- * Reuse an unused extra data slot if there's any.
+/* Append an extra data buffer @base with offset @off of length @len to block
+ * @b.  Reuse an unused extra data slot if there's any.
  * Return 0 on success or -1 on error. */
-int block_append_extra(struct block *b, int len, int mem_flags)
+int block_append_extra(struct block *b, uintptr_t base, uint32_t off,
+                       uint32_t len, int mem_flags)
 {
        unsigned int nr_bufs = b->nr_extra_bufs + 1;
        struct extra_bdata *ebd;
@@ -154,10 +155,8 @@ int block_append_extra(struct block *b, int len, int mem_flags)
                ebd = next_unused_slot(b);
                assert(ebd);
        }
-       ebd->base = (uintptr_t)kzmalloc(len, mem_flags);
-       if (!ebd->base)
-               return -1;
-       ebd->off = 0;
+       ebd->base = base;
+       ebd->off = off;
        ebd->len = len;
        b->extra_len += ebd->len;
        return 0;
index 113c345..a9d34d0 100644 (file)
@@ -563,6 +563,7 @@ struct block *copyblock(struct block *bp, int count)
 struct block *adjustblock(struct block *bp, int len)
 {
        struct extra_bdata *ebd;
+       void *buf;
        int i;
 
        if (len < 0) {
@@ -591,7 +592,8 @@ struct block *adjustblock(struct block *bp, int len)
                        return bp;
                }
                /* Grow with extra data buffers. */
-               block_append_extra(bp, len - BLEN(bp), MEM_WAIT);
+               buf = kzmalloc(len - BLEN(bp), MEM_WAIT);
+               block_append_extra(bp, (uintptr_t)buf, 0, len - BLEN(bp), MEM_WAIT);
                QDEBUG checkb(bp, "adjustblock 3");
                return bp;
        }