Assign io_u->error directly in do_io_u_sync()
[fio.git] / io_u.c
diff --git a/io_u.c b/io_u.c
index 278d47a4d88baaf30e8a4c0bfeaff9a8e128dd87..a4bf0c08581861076ccd31a8f720dcd861fbfe01 100644 (file)
--- a/io_u.c
+++ b/io_u.c
@@ -233,8 +233,10 @@ static int __get_next_offset(struct thread_data *td, struct io_u *io_u)
 
 static int get_next_offset(struct thread_data *td, struct io_u *io_u)
 {
-       if (td->fill_io_u_off)
-               return td->fill_io_u_off(td, io_u);
+       struct prof_io_ops *ops = &td->prof_io_ops;
+
+       if (ops->fill_io_u_off)
+               return ops->fill_io_u_off(td, io_u);
 
        return __get_next_offset(td, io_u);
 }
@@ -286,8 +288,10 @@ static unsigned int __get_next_buflen(struct thread_data *td, struct io_u *io_u)
 
 static unsigned int get_next_buflen(struct thread_data *td, struct io_u *io_u)
 {
-       if (td->fill_io_u_size)
-               return td->fill_io_u_size(td, io_u);
+       struct prof_io_ops *ops = &td->prof_io_ops;
+
+       if (ops->fill_io_u_size)
+               return ops->fill_io_u_size(td, io_u);
 
        return __get_next_buflen(td, io_u);
 }
@@ -390,6 +394,14 @@ static enum fio_ddir get_rw_ddir(struct thread_data *td)
             td->io_issues[DDIR_WRITE] && should_fsync(td))
                return DDIR_DATASYNC;
 
+       /*
+        * see if it's time to sync_file_range
+        */
+       if (td->sync_file_range_nr &&
+          !(td->io_issues[DDIR_WRITE] % td->sync_file_range_nr) &&
+            td->io_issues[DDIR_WRITE] && should_fsync(td))
+               return DDIR_SYNC_FILE_RANGE;
+
        if (td_rw(td)) {
                /*
                 * Check if it's time to seed a new data direction.
@@ -785,7 +797,7 @@ static struct fio_file *get_next_file_rr(struct thread_data *td, int goodf,
        return f;
 }
 
-static struct fio_file *get_next_file(struct thread_data *td)
+static struct fio_file *__get_next_file(struct thread_data *td)
 {
        struct fio_file *f;
 
@@ -820,6 +832,16 @@ out:
        return f;
 }
 
+static struct fio_file *get_next_file(struct thread_data *td)
+{
+       struct prof_io_ops *ops = &td->prof_io_ops;
+
+       if (ops->get_next_file)
+               return ops->get_next_file(td);
+
+       return __get_next_file(td);
+}
+
 static int set_io_u_file(struct thread_data *td, struct io_u *io_u)
 {
        struct fio_file *f;
@@ -982,6 +1004,7 @@ static void io_completed(struct thread_data *td, struct io_u *io_u,
         * initialized, silence that warning.
         */
        unsigned long uninitialized_var(usec);
+       struct fio_file *f;
 
        dprint_io_u(io_u, "io complete");
 
@@ -992,6 +1015,11 @@ static void io_completed(struct thread_data *td, struct io_u *io_u,
 
        if (ddir_sync(io_u->ddir)) {
                td->last_was_sync = 1;
+               f = io_u->file;
+               if (f) {
+                       f->first_write = -1ULL;
+                       f->last_write = -1ULL;
+               }
                return;
        }
 
@@ -1007,6 +1035,18 @@ static void io_completed(struct thread_data *td, struct io_u *io_u,
                td->io_bytes[idx] += bytes;
                td->this_io_bytes[idx] += bytes;
 
+               if (idx == DDIR_WRITE) {
+                       f = io_u->file;
+                       if (f) {
+                               if (f->first_write == -1ULL ||
+                                   io_u->offset < f->first_write)
+                                       f->first_write = io_u->offset;
+                               if (f->last_write == -1ULL ||
+                                   ((io_u->offset + bytes) > f->last_write))
+                                       f->last_write = io_u->offset + bytes;
+                       }
+               }
+
                if (ramp_time_over(td)) {
                        unsigned long uninitialized_var(lusec);