fix load_ioengine() not to support no "external:" prefix
authorTomohiro Kusumi <tkusumi@tuxera.com>
Thu, 31 Aug 2017 20:13:07 +0000 (23:13 +0300)
committerJens Axboe <axboe@kernel.dk>
Thu, 31 Aug 2017 20:19:58 +0000 (14:19 -0600)
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 <tkusumi@tuxera.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
ioengines.c

index 54aa5a623aafd42541dd1affdd0498c6014dba80..0c631e85e98806921568900f564295fa1e6e4a6e 100644 (file)
@@ -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);