ioengines: clear out ->td_ops_dlhandle if we close it
[fio.git] / ioengines.c
index fa4acab2b3fa349a57993d086048a4709cb9b68a..cec0c760f4a4a2c8c5cc089b8abc6d843dc492ea 100644 (file)
@@ -52,14 +52,12 @@ static bool check_engine_ops(struct ioengine_ops *ops)
 void unregister_ioengine(struct ioengine_ops *ops)
 {
        dprint(FD_IO, "ioengine %s unregistered\n", ops->name);
-       flist_del(&ops->list);
-       INIT_FLIST_HEAD(&ops->list);
+       flist_del_init(&ops->list);
 }
 
 void register_ioengine(struct ioengine_ops *ops)
 {
        dprint(FD_IO, "ioengine %s registered\n", ops->name);
-       INIT_FLIST_HEAD(&ops->list);
        flist_add_tail(&ops->list, &engine_list);
 }
 
@@ -133,8 +131,10 @@ static struct ioengine_ops *__load_ioengine(const char *name)
        /*
         * linux libaio has alias names, so convert to what we want
         */
-       if (!strncmp(engine, "linuxaio", 8) || !strncmp(engine, "aio", 3))
+       if (!strncmp(engine, "linuxaio", 8) || !strncmp(engine, "aio", 3)) {
+               dprint(FD_IO, "converting ioengine name: %s -> libaio\n", name);
                strcpy(engine, "libaio");
+       }
 
        dprint(FD_IO, "load ioengine %s\n", engine);
        return find_ioengine(engine);
@@ -194,8 +194,10 @@ void free_ioengine(struct thread_data *td)
                td->eo = NULL;
        }
 
-       if (td->io_ops_dlhandle)
+       if (td->io_ops_dlhandle) {
                dlclose(td->io_ops_dlhandle);
+               td->io_ops_dlhandle = NULL;
+       }
 
        td->io_ops = NULL;
 }
@@ -309,8 +311,10 @@ int td_io_queue(struct thread_data *td, struct io_u *io_u)
        }
 
        if (ddir_rw(ddir)) {
-               td->io_issues[ddir]++;
-               td->io_issue_bytes[ddir] += buflen;
+               if (!(io_u->flags & IO_U_F_VER_LIST)) {
+                       td->io_issues[ddir]++;
+                       td->io_issue_bytes[ddir] += buflen;
+               }
                td->rate_io_issue_bytes[ddir] += buflen;
        }
 
@@ -342,8 +346,8 @@ int td_io_queue(struct thread_data *td, struct io_u *io_u)
            td->o.odirect) {
 
                log_info("fio: first direct IO errored. File system may not "
-                        "support direct IO, or iomem_align= is bad. Try "
-                        "setting direct=0.\n");
+                        "support direct IO, or iomem_align= is bad, or "
+                        "invalid block size. Try setting direct=0.\n");
        }
 
        if (!td->io_ops->commit || io_u->ddir == DDIR_TRIM) {
@@ -436,6 +440,7 @@ int td_io_open_file(struct thread_data *td, struct fio_file *f)
 {
        assert(!fio_file_open(f));
        assert(f->fd == -1);
+       assert(td->io_ops->open_file);
 
        if (td->io_ops->open_file(td, f)) {
                if (td->error == EINVAL && td->o.odirect)