Fixing wraparound behavior for time-based sequential read jobs
[fio.git] / filesetup.c
index f3d38290179e80d9eacefb5f2a97ef4abd479720..3594a80faf3bfe8300e29fc7cc04f7c892e826f8 100644 (file)
@@ -526,6 +526,11 @@ open_again:
 
                snprintf(buf, sizeof(buf) - 1, "open(%s)", f->file_name);
 
+               if (__e == EINVAL && (flags & OS_O_DIRECT)) {
+                       log_err("fio: looks like your file system does not " \
+                               "support direct=1/buffered=0\n");
+               }
+
                td_verror(td, __e, buf);
        }
 
@@ -652,6 +657,12 @@ static unsigned long long get_fs_free_counts(struct thread_data *td)
        return ret;
 }
 
+unsigned long long get_start_offset(struct thread_data *td)
+{
+       return td->o.start_offset +
+               (td->thread_number - 1) * td->o.offset_increment;
+}
+
 /*
  * Open the files and setup files sizes, creating files if necessary.
  */
@@ -665,7 +676,7 @@ int setup_files(struct thread_data *td)
        dprint(FD_FILE, "setup files\n");
 
        if (td->o.read_iolog_file)
-               return 0;
+               goto done;
 
        /*
         * if ioengine defines a setup() method, it's responsible for
@@ -713,8 +724,7 @@ int setup_files(struct thread_data *td)
        extend_size = total_size = 0;
        need_extend = 0;
        for_each_file(td, f, i) {
-               f->file_offset = td->o.start_offset +
-                       (td->thread_number - 1) * td->o.offset_increment;
+               f->file_offset = get_start_offset(td);
 
                if (!td->o.file_size_low) {
                        /*
@@ -816,6 +826,11 @@ int setup_files(struct thread_data *td)
         */
        if (!td->o.read_iolog_file)
                td->total_io_size = td->o.size * td->o.loops;
+
+done:
+       if (td->o.create_only)
+               td->done = 1;
+
        return 0;
 err_offset:
        log_err("%s: you need to specify valid offset=\n", td->o.name);
@@ -969,6 +984,7 @@ int add_file(struct thread_data *td, const char *fname)
                td->files_size = new_size;
        }
        td->files[cur_files] = f;
+       f->fileno = cur_files;
 
        /*
         * init function, io engine may not be loaded yet
@@ -995,7 +1011,7 @@ int add_file(struct thread_data *td, const char *fname)
                f->lock = fio_mutex_rw_init();
                break;
        case FILE_LOCK_EXCLUSIVE:
-               f->lock = fio_mutex_init(1);
+               f->lock = fio_mutex_init(FIO_MUTEX_UNLOCKED);
                break;
        default:
                log_err("fio: unknown lock mode: %d\n", td->o.file_lock_mode);