change fio_set_odirect() prototype not to use int fd
[fio.git] / filesetup.c
index b9d68c458650f299f25f9eb934a1aac6722e7e65..c4240d2a8c9bb457ee2c92c9d5a3375a27885795 100644 (file)
@@ -162,8 +162,14 @@ static int extend_file(struct thread_data *td, struct fio_file *f)
                if (err == ENOENT && !td->o.allow_create)
                        log_err("fio: file creation disallowed by "
                                        "allow_file_create=0\n");
-               else
+               else {
+                       if (err == EINVAL && (flags & OS_O_DIRECT))
+                               log_err("fio: looks like your filesystem "
+                                       "does not support "
+                                       "direct=1/buffered=0\n");
+
                        td_verror(td, err, "open");
+               }
                return 1;
        }
 
@@ -190,6 +196,9 @@ static int extend_file(struct thread_data *td, struct fio_file *f)
                }
        }
 
+       if (td->o.odirect && !OS_O_DIRECT && fio_set_directio(td, f))
+               goto err;
+
        left = f->real_file_size;
        bs = td->o.max_bs[DDIR_WRITE];
        if (bs > left)
@@ -1846,3 +1855,31 @@ void filesetup_mem_free(void)
 {
        free_already_allocated();
 }
+
+/*
+ * This function is for platforms which support direct I/O but not O_DIRECT.
+ */
+int fio_set_directio(struct thread_data *td, struct fio_file *f)
+{
+#ifdef FIO_OS_DIRECTIO
+       int ret = fio_set_odirect(f);
+
+       if (ret) {
+               td_verror(td, ret, "fio_set_directio");
+#if defined(__sun__)
+               if (ret == ENOTTY) { /* ENOTTY suggests RAW device or ZFS */
+                       log_err("fio: doing directIO to RAW devices or ZFS not supported\n");
+               } else {
+                       log_err("fio: the file system does not seem to support direct IO\n");
+               }
+#else
+               log_err("fio: the file system does not seem to support direct IO\n");
+#endif
+               return -1;
+       }
+
+       return 0;
+#else
+       return -1;
+#endif
+}