aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--extras/mini-os/blkfront.c5
-rw-r--r--tools/ioemu/block-vbd.c10
2 files changed, 12 insertions, 3 deletions
diff --git a/extras/mini-os/blkfront.c b/extras/mini-os/blkfront.c
index b83d5af345..1021bb018f 100644
--- a/extras/mini-os/blkfront.c
+++ b/extras/mini-os/blkfront.c
@@ -327,6 +327,11 @@ int blkfront_aio_poll(struct blkfront_dev *dev)
struct blkif_response *rsp;
moretodo:
+#ifdef HAVE_LIBC
+ files[dev->fd].read = 0;
+ mb(); /* Make sure to let the handler set read to 1 before we start looking at the ring */
+#endif
+
rp = dev->ring.sring->rsp_prod;
rmb(); /* Ensure we see queued responses up to 'rp'. */
cons = dev->ring.rsp_cons;
diff --git a/tools/ioemu/block-vbd.c b/tools/ioemu/block-vbd.c
index 9cb97255e6..5561cf1787 100644
--- a/tools/ioemu/block-vbd.c
+++ b/tools/ioemu/block-vbd.c
@@ -67,6 +67,12 @@ static int vbd_probe(const uint8_t *buf, int buf_size, const char *filename)
return 100;
}
+static void vbd_io_completed(void *opaque)
+{
+ BDRVVbdState *s = opaque;
+ blkfront_aio_poll(s->dev);
+}
+
static int vbd_open(BlockDriverState *bs, const char *filename, int flags)
{
BDRVVbdState *s = bs->opaque;
@@ -85,6 +91,7 @@ static int vbd_open(BlockDriverState *bs, const char *filename, int flags)
}
s->fd = blkfront_open(s->dev);
+ qemu_set_fd_handler(s->fd, vbd_io_completed, NULL, s);
QEMU_LIST_INSERT_HEAD(&vbds, s, list);
@@ -102,9 +109,6 @@ void qemu_aio_init(void)
void qemu_aio_poll(void)
{
- BDRVVbdState *s;
- for (s = vbds.lh_first; s; s = s->list.le_next)
- blkfront_aio_poll(s->dev);
}
/* Wait for all IO requests to complete. */