qio: Fix minor bugs
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 21 Sep 2016 17:59:19 +0000 (13:59 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 21 Sep 2016 21:27:46 +0000 (17:27 -0400)
Changing the state is racy, since it could muck with the receive path code
that also toggles flags.  If you made a qnonblock() call at the same time
as a qbread/qbwrite that changed the state flags, you could corrupt the
flags.

n -> len wouldn't even compile.

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

index 8a08892..047017a 100644 (file)
@@ -1624,7 +1624,7 @@ static struct block *build_block(void *from, size_t len, int mem_flags)
        b->extra_data[0].len = len;
        b->extra_len += len;
 #else
-       b = block_alloc(n, mem_flags);
+       b = block_alloc(len, mem_flags);
        if (!b)
                return 0;
        memmove(b->wp, from, len);
@@ -1802,10 +1802,12 @@ void qsetlimit(struct queue *q, int limit)
  */
 void qdropoverflow(struct queue *q, bool onoff)
 {
+       spin_lock_irqsave(&q->lock);
        if (onoff)
                q->state |= Qdropoverflow;
        else
                q->state &= ~Qdropoverflow;
+       spin_unlock_irqsave(&q->lock);
 }
 
 /*