]> xenbits.xensource.com Git - xenclient/ioemu.git/commitdiff
Introduce and use qemu_paio_fsync
authorIan Jackson <ian.jackson@eu.citrix.com>
Fri, 13 Mar 2009 12:04:21 +0000 (12:04 +0000)
committerIan Jackson <Ian.Jackson@eu.citrix.com>
Fri, 13 Mar 2009 12:04:21 +0000 (12:04 +0000)
Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
block-raw-posix.c
console.c
posix-aio-compat.c
posix-aio-compat.h

index ffc00f7c4a13a53114c46f13c696225015474d40..a73d8eb429d007e7faa5be9484885f0711898254 100644 (file)
@@ -694,8 +694,8 @@ static BlockDriverAIOCB *raw_aio_flush(BlockDriverState *bs,
     acb = raw_aio_setup(bs, 0, NULL, 0, cb, opaque);
     if (!acb)
         return NULL;
-    if (aio_fsync(O_SYNC, &acb->aiocb) < 0) {
-        qemu_aio_release(acb);
+    if (qemu_paio_fsync(&acb->aiocb) < 0) {
+        raw_aio_remove(acb);
         return NULL;
     }
     return &acb->common;
index 859454916e07eac0c4588d43a120bc0d480e4091..cc33f93d7478bbea9b5cfcfdc901d1022e099965 100644 (file)
--- a/console.c
+++ b/console.c
@@ -62,7 +62,7 @@ typedef struct QEMUFIFO {
     int count, wptr, rptr;
 } QEMUFIFO;
 
-int qemu_fifo_write(QEMUFIFO *f, const uint8_t *buf, int len1)
+static int qemu_fifo_write(QEMUFIFO *f, const uint8_t *buf, int len1)
 {
     int l, len;
 
@@ -85,7 +85,7 @@ int qemu_fifo_write(QEMUFIFO *f, const uint8_t *buf, int len1)
     return len1;
 }
 
-int qemu_fifo_read(QEMUFIFO *f, uint8_t *buf, int len1)
+static int qemu_fifo_read(QEMUFIFO *f, uint8_t *buf, int len1)
 {
     int l, len;
 
index f141cd9e1a3b215b1fa975bf335049b31f336295..771402dde13f3b6b0cabfb605fcb0118a1b1b2f0 100644 (file)
@@ -14,6 +14,7 @@
 #include <pthread.h>
 #include <unistd.h>
 #include <errno.h>
+#include <assert.h>
 #include <sys/time.h>
 #include "osdep.h"
 
@@ -67,16 +68,10 @@ static void *aio_thread(void *unused)
         while (offset < aiocb->aio_nbytes) {
             ssize_t len;
 
-            if (aiocb->is_write)
-                len = pwrite(aiocb->aio_fildes,
-                             (const char *)aiocb->aio_buf + offset,
+            len = aiocb->function(aiocb->aio_fildes,
+                             aiocb->aio_buf + offset,
                              aiocb->aio_nbytes - offset,
                              aiocb->aio_offset + offset);
-            else
-                len = pread(aiocb->aio_fildes,
-                            (char *)aiocb->aio_buf + offset,
-                            aiocb->aio_nbytes - offset,
-                            aiocb->aio_offset + offset);
 
             if (len == -1 && errno == EINTR)
                 continue;
@@ -127,9 +122,9 @@ int qemu_paio_init(struct qemu_paioinit *aioinit)
     return 0;
 }
 
-static int qemu_paio_submit(struct qemu_paiocb *aiocb, int is_write)
+static int qemu_paio_submit(struct qemu_paiocb *aiocb, qemu_paio_function fn)
 {
-    aiocb->is_write = is_write;
+    aiocb->function = fn;
     aiocb->ret = -EINPROGRESS;
     aiocb->active = 0;
     pthread_mutex_lock(&lock);
@@ -144,12 +139,26 @@ static int qemu_paio_submit(struct qemu_paiocb *aiocb, int is_write)
 
 int qemu_paio_read(struct qemu_paiocb *aiocb)
 {
-    return qemu_paio_submit(aiocb, 0);
+    return qemu_paio_submit(aiocb, pread);
 }
 
 int qemu_paio_write(struct qemu_paiocb *aiocb)
 {
-    return qemu_paio_submit(aiocb, 1);
+    return qemu_paio_submit(aiocb, (qemu_paio_function*)pwrite);
+}
+
+static ssize_t fsync_like_pwrite(int fd, void *buf,
+                                 size_t count, off_t offset) {
+    assert(count==1);
+    assert(offset==0);
+    return fsync(fd) ? -1 : 1;
+}
+int qemu_paio_fsync(struct qemu_paiocb *aiocb)
+{
+    assert(aiocb->aio_offset==0);
+    assert(aiocb->aio_buf==0);
+    aiocb->aio_nbytes = 1;
+    return qemu_paio_submit(aiocb, fsync_like_pwrite);
 }
 
 ssize_t qemu_paio_return(struct qemu_paiocb *aiocb)
index 0bc10f5e08cba1b779f12277f3ed88c330018fe1..a9dd69389ca3752066f4c692707dad47b5e4fb41 100644 (file)
@@ -24,6 +24,9 @@
 #define QEMU_PAIO_NOTCANCELED  0x02
 #define QEMU_PAIO_ALLDONE      0x03
 
+typedef ssize_t qemu_paio_function(int fd, void *buf,
+                                  size_t count, off_t offset);
+
 struct qemu_paiocb
 {
     int aio_fildes;
@@ -34,7 +37,7 @@ struct qemu_paiocb
 
     /* private */
     TAILQ_ENTRY(qemu_paiocb) node;
-    int is_write;
+    qemu_paio_function *function;
     ssize_t ret;
     int active;
 };
@@ -50,6 +53,7 @@ int qemu_paio_init(struct qemu_paioinit *aioinit);
 int qemu_paio_read(struct qemu_paiocb *aiocb);
 int qemu_paio_write(struct qemu_paiocb *aiocb);
 int qemu_paio_error(struct qemu_paiocb *aiocb);
+int qemu_paio_fsync(struct qemu_paiocb *aiocb);
 ssize_t qemu_paio_return(struct qemu_paiocb *aiocb);
 int qemu_paio_cancel(int fd, struct qemu_paiocb *aiocb);