qio: Report partial progress for NONBLOCK queues
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 25 May 2017 20:10:45 +0000 (16:10 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 26 May 2017 16:22:40 +0000 (12:22 -0400)
commitc61ed6c456ae9e81ef84a990b12aea2306c4666c
tree3c0d69e81e325dfb150c2b5849593506022a4e3a
parent395ce5721d96b8620e6276ceecc9112364b82bb5
qio: Report partial progress for NONBLOCK queues

__qbwrite() can throw for many reasons, including EPIPE (closed queue),
EAGAIN (full for now), and EINTR (syscall aborted).  However, large
qwrites, meaning greater than Maxatomic, get broken into several block
writes.  Some could succeed before we catch the error, and we need to
report those successes as a partial write.

To make things a little trickier, __qwrite() is only allowed to throw based
on its qio flags.  Other times waserror() might be dangerous, such as in
irq context.

This came up by writing large blocks to a non-blocking pipe.  The writer
thought that none of the write made it, so it kept writing the same blocks
over and over.  However, each time the first block (at least) was actually
written.  The reader received that first block over and over.

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