aboutsummaryrefslogtreecommitdiffstats
path: root/extras/mini-os/blkfront.c
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2008-06-05 13:03:31 +0100
committerKeir Fraser <keir.fraser@citrix.com>2008-06-05 13:03:31 +0100
commit226fe60191ac5466f235427270a2ff55ec848686 (patch)
treed256de51bb0a5e46c55db34bebda331110f5c84e /extras/mini-os/blkfront.c
parent98b6c37cf6517c2a262ed9ffc4bb66129b296018 (diff)
downloadxen-226fe60191ac5466f235427270a2ff55ec848686.tar.gz
xen-226fe60191ac5466f235427270a2ff55ec848686.tar.bz2
xen-226fe60191ac5466f235427270a2ff55ec848686.zip
minios: add a blkfront synchronous interface
Signed-off-by: Samuel Thibault <samuel.thibault@eu.citrix.com>
Diffstat (limited to 'extras/mini-os/blkfront.c')
-rw-r--r--extras/mini-os/blkfront.c27
1 files changed, 23 insertions, 4 deletions
diff --git a/extras/mini-os/blkfront.c b/extras/mini-os/blkfront.c
index cb82228523..2e2eea2271 100644
--- a/extras/mini-os/blkfront.c
+++ b/extras/mini-os/blkfront.c
@@ -323,14 +323,33 @@ void blkfront_aio(struct blkfront_aiocb *aiocbp, int write)
if(notify) notify_remote_via_evtchn(dev->evtchn);
}
-void blkfront_aio_write(struct blkfront_aiocb *aiocbp)
+static void blkfront_aio_cb(struct blkfront_aiocb *aiocbp, int ret)
{
- blkfront_aio(aiocbp, 1);
+ aiocbp->data = (void*) 1;
}
-void blkfront_aio_read(struct blkfront_aiocb *aiocbp)
+void blkfront_io(struct blkfront_aiocb *aiocbp, int write)
{
- blkfront_aio(aiocbp, 0);
+ unsigned long flags;
+ ASSERT(!aiocbp->aio_cb);
+ aiocbp->aio_cb = blkfront_aio_cb;
+ blkfront_aio(aiocbp, write);
+ aiocbp->data = NULL;
+
+ local_irq_save(flags);
+ DEFINE_WAIT(w);
+ while (1) {
+ blkfront_aio_poll(aiocbp->aio_dev);
+ if (aiocbp->data)
+ break;
+
+ add_waiter(w, blkfront_queue);
+ local_irq_restore(flags);
+ schedule();
+ local_irq_save(flags);
+ }
+ remove_waiter(w);
+ local_irq_restore(flags);
}
static void blkfront_push_operation(struct blkfront_dev *dev, uint8_t op, uint64_t id)