From 8c16d840377c1e6fb79f479ee60590a2da5b52ee Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Fri, 20 Oct 2006 11:48:33 +0200 Subject: [PATCH] [PATCH] Sanity check ops on loaded io engine We require certain handlers to be there, or fio will either malfunction or crash. Signed-off-by: Jens Axboe --- fio.c | 8 -------- fio.h | 1 + ioengines.c | 41 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 8 deletions(-) diff --git a/fio.c b/fio.c index 818394a0..5673d9ef 100644 --- a/fio.c +++ b/fio.c @@ -424,14 +424,6 @@ static void do_io(struct thread_data *td) } } -static int td_io_init(struct thread_data *td) -{ - if (td->io_ops->init) - return td->io_ops->init(td); - - return 0; -} - static void cleanup_io_u(struct thread_data *td) { struct list_head *entry, *n; diff --git a/fio.h b/fio.h index 03a2378d..3817fc9a 100644 --- a/fio.h +++ b/fio.h @@ -497,6 +497,7 @@ extern void io_completed(struct thread_data *, struct io_u *, struct io_completi /* * io engine entry points */ +extern int td_io_init(struct thread_data *); extern int td_io_prep(struct thread_data *, struct io_u *); extern int td_io_queue(struct thread_data *, struct io_u *); extern int td_io_sync(struct thread_data *, struct fio_file *); diff --git a/ioengines.c b/ioengines.c index 5a321653..9b1ad606 100644 --- a/ioengines.c +++ b/ioengines.c @@ -14,9 +14,34 @@ #include #include #include + #include "fio.h" #include "os.h" +static int check_engine_ops(struct ioengine_ops *ops) +{ + /* + * cpu thread doesn't need to provide anything + */ + if (ops->flags & FIO_CPUIO) + return 0; + + if (!ops->event) { + log_err("%s: no event handler)\n", ops->name); + return 1; + } + if (!ops->getevents) { + log_err("%s: no getevents handler)\n", ops->name); + return 1; + } + if (!ops->queue) { + log_err("%s: no queue handler)\n", ops->name); + return 1; + } + + return 0; +} + struct ioengine_ops *load_ioengine(struct thread_data *td, char *name) { char engine[16], engine_lib[256]; @@ -52,6 +77,14 @@ struct ioengine_ops *load_ioengine(struct thread_data *td, char *name) return NULL; } + /* + * Check that the required methods are there. + */ + if (check_engine_ops(ops)) { + dlclose(dlhandle); + return NULL; + } + ret = malloc(sizeof(*ret)); memcpy(ret, ops, sizeof(*ret)); ret->data = NULL; @@ -98,3 +131,11 @@ int td_io_queue(struct thread_data *td, struct io_u *io_u) return td->io_ops->queue(td, io_u); } + +int td_io_init(struct thread_data *td) +{ + if (td->io_ops->init) + return td->io_ops->init(td); + + return 0; +} -- 2.25.1