[PATCH] Fix warnings from icc
[fio.git] / engines / fio-engine-libaio.c
index c3fefdaccda7ea97cf660c0db4007b158807310e..45e69e90b600704df35dfb1d2f23a91857531c7f 100644 (file)
@@ -7,8 +7,11 @@
 #include <unistd.h>
 #include <errno.h>
 #include <assert.h>
-#include "fio.h"
-#include "os.h"
+
+#include "../fio.h"
+#include "../os.h"
+
+#ifdef FIO_HAVE_LIBAIO
 
 #define ev_to_iou(ev)  (struct io_u *) ((unsigned long) (ev)->obj)
 
@@ -17,20 +20,18 @@ struct libaio_data {
        struct io_event *aio_events;
 };
 
-static int fio_libaio_sync(struct thread_data fio_unused *td,
-                          struct fio_file *f)
-{
-       return fsync(f->fd);
-}
-
 static int fio_libaio_prep(struct thread_data fio_unused *td, struct io_u *io_u)
 {
        struct fio_file *f = io_u->file;
 
        if (io_u->ddir == DDIR_READ)
                io_prep_pread(&io_u->iocb, f->fd, io_u->buf, io_u->buflen, io_u->offset);
-       else
+       else if (io_u->ddir == DDIR_WRITE)
                io_prep_pwrite(&io_u->iocb, f->fd, io_u->buf, io_u->buflen, io_u->offset);
+       else if (io_u->ddir == DDIR_SYNC)
+               io_prep_fsync(&io_u->iocb, f->fd);
+       else
+               return 1;
 
        return 0;
 }
@@ -55,10 +56,13 @@ static int fio_libaio_getevents(struct thread_data *td, int min, int max,
                        continue;
                } else if (r == -EINTR)
                        continue;
-               else
+               else if (r != 0)
                        break;
        } while (1);
 
+       if (r < 0)
+               r = -r;
+
        return (int) r;
 }
 
@@ -72,7 +76,7 @@ static int fio_libaio_queue(struct thread_data *td, struct io_u *io_u)
                ret = io_submit(ld->aio_ctx, 1, &iocb);
                if (ret == 1)
                        return 0;
-               else if (ret == -EAGAIN)
+               else if (ret == -EAGAIN || !ret)
                        usleep(100);
                else if (ret == -EINTR)
                        continue;
@@ -80,8 +84,13 @@ static int fio_libaio_queue(struct thread_data *td, struct io_u *io_u)
                        break;
        } while (1);
 
-       return (int) ret;
+       if (ret <= 0) {
+               io_u->resid = io_u->buflen;
+               io_u->error = -ret;
+               return 1;
+       }
 
+       return 0;
 }
 
 static int fio_libaio_cancel(struct thread_data *td, struct io_u *io_u)
@@ -112,15 +121,17 @@ static int fio_libaio_init(struct thread_data *td)
        memset(ld, 0, sizeof(*ld));
        if (io_queue_init(td->iodepth, &ld->aio_ctx)) {
                td_verror(td, errno);
+               free(ld);
                return 1;
        }
 
        ld->aio_events = malloc(td->iodepth * sizeof(struct io_event));
+       memset(ld->aio_events, 0, td->iodepth * sizeof(struct io_event));
        td->io_ops->data = ld;
        return 0;
 }
 
-struct ioengine_ops ioengine = {
+static struct ioengine_ops ioengine = {
        .name           = "libaio",
        .version        = FIO_IOOPS_VERSION,
        .init           = fio_libaio_init,
@@ -130,5 +141,35 @@ struct ioengine_ops ioengine = {
        .getevents      = fio_libaio_getevents,
        .event          = fio_libaio_event,
        .cleanup        = fio_libaio_cleanup,
-       .sync           = fio_libaio_sync,
 };
+
+#else /* FIO_HAVE_LIBAIO */
+
+/*
+ * When we have a proper configure system in place, we simply wont build
+ * and install this io engine. For now install a crippled version that
+ * just complains and fails to load.
+ */
+static int fio_libaio_init(struct thread_data fio_unused *td)
+{
+       fprintf(stderr, "fio: libaio not available\n");
+       return 1;
+}
+
+static struct ioengine_ops ioengine = {
+       .name           = "libaio",
+       .version        = FIO_IOOPS_VERSION,
+       .init           = fio_libaio_init,
+};
+
+#endif
+
+static void fio_init fio_libaio_register(void)
+{
+       register_ioengine(&ioengine);
+}
+
+static void fio_exit fio_libaio_unregister(void)
+{
+       unregister_ioengine(&ioengine);
+}