+struct null_data {
+ struct io_u **io_us;
+ int queued;
+ int events;
+};
+
+static struct io_u *fio_null_event(struct thread_data *td, int event)
+{
+ struct null_data *nd = (struct null_data *) td->io_ops_data;
+
+ return nd->io_us[event];
+}
+
+static int fio_null_getevents(struct thread_data *td, unsigned int min_events,
+ unsigned int fio_unused max,
+ const struct timespec fio_unused *t)
+{
+ struct null_data *nd = (struct null_data *) td->io_ops_data;
+ int ret = 0;
+
+ if (min_events) {
+ ret = nd->events;
+ nd->events = 0;
+ }
+
+ return ret;
+}
+
+static int fio_null_commit(struct thread_data *td)
+{
+ struct null_data *nd = (struct null_data *) td->io_ops_data;
+
+ if (!nd->events) {
+#ifndef FIO_EXTERNAL_ENGINE
+ io_u_mark_submit(td, nd->queued);
+#endif
+ nd->events = nd->queued;
+ nd->queued = 0;
+ }
+
+ return 0;
+}
+
+static int fio_null_queue(struct thread_data *td, struct io_u *io_u)
+{
+ struct null_data *nd = (struct null_data *) td->io_ops_data;
+
+ fio_ro_check(td, io_u);
+
+ if (td->io_ops->flags & FIO_SYNCIO)
+ return FIO_Q_COMPLETED;
+ if (nd->events)
+ return FIO_Q_BUSY;
+
+ nd->io_us[nd->queued++] = io_u;
+ return FIO_Q_QUEUED;
+}
+
+static int fio_null_open(struct thread_data fio_unused *td,
+ struct fio_file fio_unused *f)