diff options
author | Keir Fraser <keir.fraser@citrix.com> | 2008-06-05 13:03:31 +0100 |
---|---|---|
committer | Keir Fraser <keir.fraser@citrix.com> | 2008-06-05 13:03:31 +0100 |
commit | 226fe60191ac5466f235427270a2ff55ec848686 (patch) | |
tree | d256de51bb0a5e46c55db34bebda331110f5c84e /extras | |
parent | 98b6c37cf6517c2a262ed9ffc4bb66129b296018 (diff) | |
download | xen-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')
-rw-r--r-- | extras/mini-os/blkfront.c | 27 | ||||
-rw-r--r-- | extras/mini-os/include/blkfront.h | 7 |
2 files changed, 28 insertions, 6 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) diff --git a/extras/mini-os/include/blkfront.h b/extras/mini-os/include/blkfront.h index c8de59d335..a4e691140f 100644 --- a/extras/mini-os/include/blkfront.h +++ b/extras/mini-os/include/blkfront.h @@ -29,8 +29,11 @@ struct blkfront_dev *init_blkfront(char *nodename, struct blkfront_info *info); int blkfront_open(struct blkfront_dev *dev); #endif void blkfront_aio(struct blkfront_aiocb *aiocbp, int write); -void blkfront_aio_read(struct blkfront_aiocb *aiocbp); -void blkfront_aio_write(struct blkfront_aiocb *aiocbp); +#define blkfront_aio_read(aiocbp) blkfront_aio(aiocbp, 0) +#define blkfront_aio_write(aiocbp) blkfront_aio(aiocbp, 1) +void blkfront_io(struct blkfront_aiocb *aiocbp, int write); +#define blkfront_read(aiocbp) blkfront_io(aiocbp, 0) +#define blkfront_write(aiocbp) blkfront_io(aiocbp, 1) void blkfront_aio_push_operation(struct blkfront_aiocb *aiocbp, uint8_t op); int blkfront_aio_poll(struct blkfront_dev *dev); void blkfront_sync(struct blkfront_dev *dev); |