[PATCH] libaio engine: fake work-around for sync issue
[fio.git] / engines / libaio.c
index c95600548c645449a07946b7cabb8c7b6de5162b..acc125f48e46df799c7d7fdcf0c42daea9694145 100644 (file)
@@ -18,6 +18,7 @@
 struct libaio_data {
        io_context_t aio_ctx;
        struct io_event *aio_events;
 struct libaio_data {
        io_context_t aio_ctx;
        struct io_event *aio_events;
+       struct io_u *sync_io_u;
 };
 
 static int fio_libaio_prep(struct thread_data fio_unused *td, struct io_u *io_u)
 };
 
 static int fio_libaio_prep(struct thread_data fio_unused *td, struct io_u *io_u)
@@ -40,6 +41,13 @@ static struct io_u *fio_libaio_event(struct thread_data *td, int event)
 {
        struct libaio_data *ld = td->io_ops->data;
 
 {
        struct libaio_data *ld = td->io_ops->data;
 
+       if (ld->sync_io_u) {
+               struct io_u *ret = ld->sync_io_u;
+
+               ld->sync_io_u = NULL;
+               return ret;
+       }
+
        return ev_to_iou(ld->aio_events + event);
 }
 
        return ev_to_iou(ld->aio_events + event);
 }
 
@@ -49,6 +57,9 @@ static int fio_libaio_getevents(struct thread_data *td, int min, int max,
        struct libaio_data *ld = td->io_ops->data;
        long r;
 
        struct libaio_data *ld = td->io_ops->data;
        long r;
 
+       if (ld->sync_io_u)
+               return 1;
+
        do {
                r = io_getevents(ld->aio_ctx, min, max, ld->aio_events, t);
                if (r >= min)
        do {
                r = io_getevents(ld->aio_ctx, min, max, ld->aio_events, t);
                if (r >= min)
@@ -91,6 +102,7 @@ static int fio_libaio_queue(struct thread_data *td, struct io_u *io_u)
                         * requests to flush first.
                         */
                        ret = fsync(io_u->file->fd);
                         * requests to flush first.
                         */
                        ret = fsync(io_u->file->fd);
+                       ld->sync_io_u = io_u;
                        break;
                } else
                        break;
                        break;
                } else
                        break;