Make experimental_verify=1 handle all cases properly
[fio.git] / ioengines.c
index 4c609f2b88ae4c537dc90489241808acd711fa1f..234f8edd13251ab07e7f7b431d3d90279c4c9b9a 100644 (file)
@@ -104,7 +104,9 @@ static struct ioengine_ops *dlopen_ioengine(struct thread_data *td,
         * Unlike the included modules, external engines should have a
         * non-static ioengine structure that we can reference.
         */
-       ops = dlsym(dlhandle, "ioengine");
+       ops = dlsym(dlhandle, engine_lib);
+       if (!ops)
+               ops = dlsym(dlhandle, "ioengine");
        if (!ops) {
                td_vmsg(td, -1, dlerror(), "dlsym");
                dlclose(dlhandle);
@@ -208,6 +210,16 @@ int td_io_getevents(struct thread_data *td, unsigned int min, unsigned int max,
 {
        int r = 0;
 
+       /*
+        * For ioengine=rdma one side operation RDMA_WRITE or RDMA_READ,
+        * server side gets a message from the client
+        * side that the task is finished, and
+        * td->done is set to 1 after td_io_commit(). In this case,
+        * there is no need to reap complete event in server side.
+        */
+       if (td->done)
+               return 0;
+
        if (min > 0 && td->io_ops->commit) {
                r = td->io_ops->commit(td);
                if (r < 0)
@@ -248,6 +260,11 @@ int td_io_queue(struct thread_data *td, struct io_u *io_u)
 
        assert(fio_file_open(io_u->file));
 
+       /*
+        * If using a write iolog, store this entry.
+        */
+       log_io_u(td, io_u);
+
        io_u->error = 0;
        io_u->resid = 0;
 
@@ -263,8 +280,8 @@ int td_io_queue(struct thread_data *td, struct io_u *io_u)
                                        sizeof(struct timeval));
        }
 
-       if (ddir_rw(io_u->ddir))
-               td->io_issues[io_u->ddir]++;
+       if (ddir_rw(acct_ddir(io_u)))
+               td->io_issues[acct_ddir(io_u)]++;
 
        ret = td->io_ops->queue(td, io_u);
 
@@ -278,11 +295,12 @@ int td_io_queue(struct thread_data *td, struct io_u *io_u)
         */
        if (io_u->error == EINVAL && td->io_issues[io_u->ddir & 1] == 1 &&
            td->o.odirect) {
+
                log_info("fio: first direct IO errored. File system may not "
                         "support direct IO, or iomem_align= is bad.\n");
        }
 
-       if (!td->io_ops->commit) {
+       if (!td->io_ops->commit || ddir_trim(io_u->ddir)) {
                io_u_mark_submit(td, 1);
                io_u_mark_complete(td, 1);
        }
@@ -291,8 +309,7 @@ int td_io_queue(struct thread_data *td, struct io_u *io_u)
                if (ddir_rw(io_u->ddir)) {
                        io_u_mark_depth(td, 1);
                        td->ts.total_io_u[io_u->ddir]++;
-               } else if (io_u->ddir == DDIR_TRIM)
-                       td->ts.total_io_u[2]++;
+               }
        } else if (ret == FIO_Q_QUEUED) {
                int r;
 
@@ -385,7 +402,7 @@ int td_io_open_file(struct thread_data *td, struct fio_file *f)
                return 1;
        }
 
-       fio_file_reset(f);
+       fio_file_reset(td, f);
        fio_file_set_open(f);
        fio_file_clear_closing(f);
        disk_util_inc(f->du);
@@ -491,7 +508,7 @@ int do_io_u_sync(struct thread_data *td, struct io_u *io_u)
        if (io_u->ddir == DDIR_SYNC) {
                ret = fsync(io_u->file->fd);
        } else if (io_u->ddir == DDIR_DATASYNC) {
-#ifdef FIO_HAVE_FDATASYNC
+#ifdef CONFIG_FDATASYNC
                ret = fdatasync(io_u->file->fd);
 #else
                ret = io_u->xfer_buflen;