X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=ioengines.c;h=abc385303d86c466ba34ed261a5624e2546e03de;hb=84585003d025a38b91749cb0d68f6b5653d1f1a3;hp=658b2eb50772771c93ca43fd605238fec3beb81e;hpb=d4dbaaa821b9d3dd34ca002d1976d4f924a07a47;p=fio.git diff --git a/ioengines.c b/ioengines.c index 658b2eb5..abc38530 100644 --- a/ioengines.c +++ b/ioengines.c @@ -20,7 +20,7 @@ struct ioengine_ops *load_ioengine(struct thread_data *td, char *name) { char engine[16], engine_lib[256]; - struct ioengine_ops *ops; + struct ioengine_ops *ops, *ret; void *dlhandle; strcpy(engine, name); @@ -31,7 +31,7 @@ struct ioengine_ops *load_ioengine(struct thread_data *td, char *name) if (!strncmp(engine, "linuxaio", 8) || !strncmp(engine, "aio", 3)) strcpy(engine, "libaio"); - sprintf(engine_lib, "/usr/local/lib/fio/fio-engine-%s.o", engine); + sprintf(engine_lib, "%s/lib/fio/fio-engine-%s.o", fio_inst_prefix, engine); dlerror(); dlhandle = dlopen(engine_lib, RTLD_LAZY); if (!dlhandle) { @@ -46,8 +46,18 @@ struct ioengine_ops *load_ioengine(struct thread_data *td, char *name) return NULL; } - ops->dlhandle = dlhandle; - return ops; + if (ops->version != FIO_IOOPS_VERSION) { + log_err("bad ioops version %d (want %d)\n", ops->version, FIO_IOOPS_VERSION); + dlclose(dlhandle); + return NULL; + } + + ret = malloc(sizeof(*ret)); + memcpy(ret, ops, sizeof(*ret)); + ret->data = NULL; + ret->dlhandle = dlhandle; + + return ret; } void close_ioengine(struct thread_data *td) @@ -56,4 +66,6 @@ void close_ioengine(struct thread_data *td) td->io_ops->cleanup(td); dlclose(td->io_ops->dlhandle); + free(td->io_ops); + td->io_ops = NULL; }