Add a more verbose/immediate warning if we fail open with O_DIRECT
[fio.git] / filesetup.c
index cf5ec8e95585ffd004c95d3ff4f2e1188aee2ec6..b1f73f7131cb6dfe086bdd45f9cd269e7cf963f2 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);
        }
 
@@ -665,7 +670,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,7 +718,8 @@ 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;
+               f->file_offset = td->o.start_offset +
+                       (td->thread_number - 1) * td->o.offset_increment;
 
                if (!td->o.file_size_low) {
                        /*
@@ -815,6 +821,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);
@@ -926,10 +937,13 @@ static void get_file_type(struct fio_file *f)
        else
                f->filetype = FIO_TYPE_FILE;
 
+       /* \\.\ is the device namespace in Windows, where every file is
+        * a block device */
+       if (strncmp(f->file_name, "\\\\.\\", 4) == 0)
+               f->filetype = FIO_TYPE_BD;
+
        if (!stat(f->file_name, &sb)) {
-               /* \\.\ is the device namespace in Windows, where every file is
-                * a block device */
-               if (S_ISBLK(sb.st_mode) || strncmp(f->file_name, "\\\\.\\", 4) == 0)
+               if (S_ISBLK(sb.st_mode))
                        f->filetype = FIO_TYPE_BD;
                else if (S_ISCHR(sb.st_mode))
                        f->filetype = FIO_TYPE_CHAR;