+ ld->iocbs[ld->iocbs_nr] = &io_u->iocb;
+ ld->io_us[ld->iocbs_nr] = io_u;
+ ld->iocbs_nr++;
+ return FIO_Q_QUEUED;
+}
+
+static void fio_libaio_queued(struct thread_data *td, struct io_u **io_us,
+ unsigned int nr)
+{
+ struct timeval now;
+ unsigned int i;
+
+ fio_gettime(&now, NULL);
+
+ for (i = 0; i < nr; i++) {
+ struct io_u *io_u = io_us[i];
+
+ memcpy(&io_u->issue_time, &now, sizeof(now));
+ io_u_queued(td, io_u);
+ }
+}
+
+static int fio_libaio_commit(struct thread_data *td)
+{
+ struct libaio_data *ld = td->io_ops->data;
+ struct iocb **iocbs;
+ struct io_u **io_us;
+ int ret;
+
+ if (!ld->iocbs_nr)
+ return 0;
+
+ io_us = ld->io_us;
+ iocbs = ld->iocbs;
+ do {
+ ret = io_submit(ld->aio_ctx, ld->iocbs_nr, iocbs);
+ if (ret > 0) {
+ fio_libaio_queued(td, io_us, ret);
+ ld->iocbs_nr -= ret;
+ io_us += ret;
+ iocbs += ret;
+ ret = 0;
+ } else if (!ret || ret == -EAGAIN || ret == -EINTR)
+ continue;
+ else
+ break;
+ } while (ld->iocbs_nr);
+