From 81647a9a229b92635062e0a1ee570997634b7848 Mon Sep 17 00:00:00 2001 From: Tomohiro Kusumi Date: Thu, 31 Aug 2017 23:13:07 +0300 Subject: [PATCH] fix load_ioengine() not to support no "external:" prefix To load ioengines, it should be done by either 1) find the ioengine from the existing (static linked) ioengines or 2) dlopen the path in case of external ioengine, but not to do 2 if 1 failed, as fio doesn't expect an ioengine to be dynamically loaded unless with "external:" prefix by design. The current implementation (i.e. do 2 if 1 failed) happened to have been able to load an external ioengine with below syntax without "external:" prefix, but this is a bug rather than a feature. (--)ioengine=./engines/skeleton_external.so The design of the external ioengine option since below commits in 2007 7b395ca5('Prefix external io engine loading with 'external'') 8a7bd877('Document loading external io engines') is to use "external:/path/to/so" syntax. This commit fixes above bug, which also potentially avoids the case where "/path/to/so" within the given "external:/path/to/so" happens to match the existing name, though this is normally unlikely to happen. Signed-off-by: Tomohiro Kusumi Signed-off-by: Jens Axboe --- ioengines.c | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/ioengines.c b/ioengines.c index 54aa5a62..0c631e85 100644 --- a/ioengines.c +++ b/ioengines.c @@ -125,26 +125,29 @@ static struct ioengine_ops *dlopen_ioengine(struct thread_data *td, struct ioengine_ops *load_ioengine(struct thread_data *td) { - struct ioengine_ops *ops; - char engine[64]; - char *name; - - name = td->o.ioengine_so_path ?: td->o.ioengine; + struct ioengine_ops *ops = NULL; + const char *name = NULL; - dprint(FD_IO, "load ioengine %s\n", name); + if (strcmp(td->o.ioengine, "external")) { + char engine[64]; - engine[sizeof(engine) - 1] = '\0'; - strncpy(engine, name, sizeof(engine) - 1); + name = td->o.ioengine; + engine[sizeof(engine) - 1] = '\0'; + strncpy(engine, name, sizeof(engine) - 1); - /* - * linux libaio has alias names, so convert to what we want - */ - if (!strncmp(engine, "linuxaio", 8) || !strncmp(engine, "aio", 3)) - strcpy(engine, "libaio"); + /* + * linux libaio has alias names, so convert to what we want + */ + if (!strncmp(engine, "linuxaio", 8) || !strncmp(engine, "aio", 3)) + strcpy(engine, "libaio"); - ops = find_ioengine(engine); - if (!ops) + dprint(FD_IO, "load ioengine %s\n", engine); + ops = find_ioengine(engine); + } else if (td->o.ioengine_so_path) { + name = td->o.ioengine_so_path; ops = dlopen_ioengine(td, name); + } else + log_err("fio: missing external ioengine path\n"); if (!ops) { log_err("fio: engine %s not loadable\n", name); -- 2.25.1