X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=engines%2Flibaio.c;h=7c44927a3b8b5a3ac39b37b4eb43ed6760582d87;hb=8999fe9a2a21de218b92a9e993f756ca9700eef9;hp=bd702e30f132ab082a69add4b729ca9e6dd6d9b5;hpb=e1161c325f7866bae879e686d1c673ca32ab09ae;p=fio.git diff --git a/engines/libaio.c b/engines/libaio.c index bd702e30..7c44927a 100644 --- a/engines/libaio.c +++ b/engines/libaio.c @@ -1,5 +1,7 @@ /* - * native linux aio io engine + * libaio engine + * + * IO engine using the Linux native aio interface. * */ #include @@ -42,8 +44,21 @@ static int fio_libaio_prep(struct thread_data fio_unused *td, struct io_u *io_u) static struct io_u *fio_libaio_event(struct thread_data *td, int event) { struct libaio_data *ld = td->io_ops->data; + struct io_event *ev; + struct io_u *io_u; + + ev = ld->aio_events + event; + io_u = ev_to_iou(ev); - return ev_to_iou(ld->aio_events + event); + if (ev->res != io_u->xfer_buflen) { + if (ev->res > io_u->xfer_buflen) + io_u->error = -ev->res; + else + io_u->resid = io_u->xfer_buflen - ev->res; + } else + io_u->error = 0; + + return io_u; } static int fio_libaio_getevents(struct thread_data *td, int min, int max, @@ -72,7 +87,7 @@ static int fio_libaio_queue(struct thread_data *td, struct io_u *io_u) { struct libaio_data *ld = td->io_ops->data; - if (ld->iocbs_nr == (int) td->iodepth) + if (ld->iocbs_nr == (int) td->o.iodepth) return FIO_Q_BUSY; /* @@ -175,20 +190,23 @@ static void fio_libaio_cleanup(struct thread_data *td) static int fio_libaio_init(struct thread_data *td) { struct libaio_data *ld = malloc(sizeof(*ld)); + int err; memset(ld, 0, sizeof(*ld)); - if (io_queue_init(td->iodepth, &ld->aio_ctx)) { - td_verror(td, errno, "io_queue_init"); + + err = io_queue_init(td->o.iodepth, &ld->aio_ctx); + if (err) { + td_verror(td, -err, "io_queue_init"); 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)); - ld->iocbs = malloc(td->iodepth * sizeof(struct iocb *)); + ld->aio_events = malloc(td->o.iodepth * sizeof(struct io_event)); + memset(ld->aio_events, 0, td->o.iodepth * sizeof(struct io_event)); + ld->iocbs = malloc(td->o.iodepth * sizeof(struct iocb *)); memset(ld->iocbs, 0, sizeof(struct iocb *)); - ld->io_us = malloc(td->iodepth * sizeof(struct io_u *)); - memset(ld->io_us, 0, td->iodepth * sizeof(struct io_u *)); + ld->io_us = malloc(td->o.iodepth * sizeof(struct io_u *)); + memset(ld->io_us, 0, td->o.iodepth * sizeof(struct io_u *)); ld->iocbs_nr = 0; td->io_ops->data = ld; @@ -206,6 +224,8 @@ static struct ioengine_ops ioengine = { .getevents = fio_libaio_getevents, .event = fio_libaio_event, .cleanup = fio_libaio_cleanup, + .open_file = generic_open_file, + .close_file = generic_close_file, }; #else /* FIO_HAVE_LIBAIO */