From: Ian Jackson Date: Fri, 13 Mar 2009 12:04:21 +0000 (+0000) Subject: Introduce and use qemu_paio_fsync X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=93b416a6b2fb4fdfd6f3a45bb22805c2bcfb8fd6;p=xenclient%2Fioemu.git Introduce and use qemu_paio_fsync Signed-off-by: Ian Jackson --- diff --git a/block-raw-posix.c b/block-raw-posix.c index ffc00f7c..a73d8eb4 100644 --- a/block-raw-posix.c +++ b/block-raw-posix.c @@ -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; diff --git a/console.c b/console.c index 85945491..cc33f93d 100644 --- 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; diff --git a/posix-aio-compat.c b/posix-aio-compat.c index f141cd9e..771402dd 100644 --- a/posix-aio-compat.c +++ b/posix-aio-compat.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #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) diff --git a/posix-aio-compat.h b/posix-aio-compat.h index 0bc10f5e..a9dd6938 100644 --- a/posix-aio-compat.h +++ b/posix-aio-compat.h @@ -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);