]> xenbits.xensource.com Git - people/liuw/mini-os.git/commitdiff
minios: add a blkfront synchronous interface
authorKeir Fraser <keir.fraser@citrix.com>
Thu, 5 Jun 2008 12:03:31 +0000 (13:03 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Thu, 5 Jun 2008 12:03:31 +0000 (13:03 +0100)
Signed-off-by: Samuel Thibault <samuel.thibault@eu.citrix.com>
blkfront.c
include/blkfront.h

index cb82228523c33a40836e051b4f7de06a702a78a7..2e2eea2271217f75fea38a586b9df9031e3f787c 100644 (file)
@@ -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)
index c8de59d335b8fe084f29bad85d3d08fed8271c65..a4e691140fe685b4e650ab445b7232f6d620f406 100644 (file)
@@ -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);