t/nvmept_trim: increase transfer size for some tests
[fio.git] / ioengines.c
index 843dd466373a28ae853b1b4e62c3cdbd6eeeff8c..6b81dc772ad3284683eb1c668e24d899f758d0ec 100644 (file)
@@ -17,6 +17,7 @@
 #include <assert.h>
 #include <sys/types.h>
 #include <dirent.h>
 #include <assert.h>
 #include <sys/types.h>
 #include <dirent.h>
+#include <errno.h>
 
 #include "fio.h"
 #include "diskutil.h"
 
 #include "fio.h"
 #include "diskutil.h"
@@ -341,10 +342,14 @@ enum fio_q_status td_io_queue(struct thread_data *td, struct io_u *io_u)
         * started the overlap check because the IO_U_F_FLIGHT
         * flag is now set
         */
         * started the overlap check because the IO_U_F_FLIGHT
         * flag is now set
         */
-       if (io_u->flags & IO_U_F_OVERLAP_LOCK) {
-               int res = pthread_mutex_unlock(&overlap_check);
-               assert(res == 0);
-               io_u_clear(td, io_u, IO_U_F_OVERLAP_LOCK);
+       if (td_offload_overlap(td)) {
+               int res;
+
+               res = pthread_mutex_unlock(&overlap_check);
+               if (fio_unlikely(res != 0)) {
+                       log_err("failed to unlock overlap check mutex, err: %i:%s", errno, strerror(errno));
+                       abort();
+               }
        }
 
        assert(fio_file_open(io_u->file));
        }
 
        assert(fio_file_open(io_u->file));
@@ -431,6 +436,8 @@ enum fio_q_status td_io_queue(struct thread_data *td, struct io_u *io_u)
                        io_u_mark_depth(td, 1);
                        td->ts.total_io_u[io_u->ddir]++;
                }
                        io_u_mark_depth(td, 1);
                        td->ts.total_io_u[io_u->ddir]++;
                }
+
+               td->last_was_sync = ddir_sync(io_u->ddir);
        } else if (ret == FIO_Q_QUEUED) {
                td->io_u_queued++;
 
        } else if (ret == FIO_Q_QUEUED) {
                td->io_u_queued++;
 
@@ -440,6 +447,8 @@ enum fio_q_status td_io_queue(struct thread_data *td, struct io_u *io_u)
 
                if (td->io_u_queued >= td->o.iodepth_batch)
                        td_io_commit(td);
 
                if (td->io_u_queued >= td->o.iodepth_batch)
                        td_io_commit(td);
+
+               td->last_was_sync = ddir_sync(io_u->ddir);
        }
 
        if (!td_ioengine_flagged(td, FIO_SYNCIO) &&
        }
 
        if (!td_ioengine_flagged(td, FIO_SYNCIO) &&
@@ -566,6 +575,10 @@ int td_io_open_file(struct thread_data *td, struct fio_file *f)
                        flags = POSIX_FADV_RANDOM;
                else if (td->o.fadvise_hint == F_ADV_SEQUENTIAL)
                        flags = POSIX_FADV_SEQUENTIAL;
                        flags = POSIX_FADV_RANDOM;
                else if (td->o.fadvise_hint == F_ADV_SEQUENTIAL)
                        flags = POSIX_FADV_SEQUENTIAL;
+#ifdef POSIX_FADV_NOREUSE
+               else if (td->o.fadvise_hint == F_ADV_NOREUSE)
+                       flags = POSIX_FADV_NOREUSE;
+#endif
                else {
                        log_err("fio: unknown fadvise type %d\n",
                                                        td->o.fadvise_hint);
                else {
                        log_err("fio: unknown fadvise type %d\n",
                                                        td->o.fadvise_hint);
@@ -581,19 +594,21 @@ int td_io_open_file(struct thread_data *td, struct fio_file *f)
        if (fio_option_is_set(&td->o, write_hint) &&
            (f->filetype == FIO_TYPE_BLOCK || f->filetype == FIO_TYPE_FILE)) {
                uint64_t hint = td->o.write_hint;
        if (fio_option_is_set(&td->o, write_hint) &&
            (f->filetype == FIO_TYPE_BLOCK || f->filetype == FIO_TYPE_FILE)) {
                uint64_t hint = td->o.write_hint;
-               int cmd;
+               int res;
 
                /*
 
                /*
-                * For direct IO, we just need/want to set the hint on
-                * the file descriptor. For buffered IO, we need to set
-                * it on the inode.
+                * For direct IO, set the hint on the file descriptor if that is
+                * supported. Otherwise set it on the inode. For buffered IO, we
+                * need to set it on the inode.
                 */
                 */
-               if (td->o.odirect)
-                       cmd = F_SET_FILE_RW_HINT;
-               else
-                       cmd = F_SET_RW_HINT;
-
-               if (fcntl(f->fd, cmd, &hint) < 0) {
+               if (td->o.odirect) {
+                       res = fcntl(f->fd, F_SET_FILE_RW_HINT, &hint);
+                       if (res < 0)
+                               res = fcntl(f->fd, F_SET_RW_HINT, &hint);
+               } else {
+                       res = fcntl(f->fd, F_SET_RW_HINT, &hint);
+               }
+               if (res < 0) {
                        td_verror(td, errno, "fcntl write hint");
                        goto err;
                }
                        td_verror(td, errno, "fcntl write hint");
                        goto err;
                }