fix regression by 8c43ba62('filesetup: align layout buffer')
[fio.git] / filesetup.c
index 38ad9edc6e206fd919309087bf4590dd76231ea1..5e8ea357deb82a308d1102f888d895171cfc9e3c 100644 (file)
@@ -15,6 +15,7 @@
 #include "os/os.h"
 #include "hash.h"
 #include "lib/axmap.h"
+#include "lib/memalign.h"
 
 #ifdef CONFIG_LINUX_FALLOCATE
 #include <linux/falloc.h>
@@ -67,7 +68,7 @@ static void fallocate_file(struct thread_data *td, struct fio_file *f)
        switch (td->o.fallocate_mode) {
        case FIO_FALLOCATE_NATIVE:
                r = native_fallocate(td, f);
-               if (r != 0)
+               if (r != 0 && errno != ENOSYS)
                        log_err("fio: native_fallocate call failed: %s\n",
                                        strerror(errno));
                break;
@@ -100,7 +101,6 @@ static void fallocate_file(struct thread_data *td, struct fio_file *f)
                log_err("fio: unknown fallocate mode: %d\n", td->o.fallocate_mode);
                assert(0);
        }
-
 }
 
 /*
@@ -110,7 +110,7 @@ static int extend_file(struct thread_data *td, struct fio_file *f)
 {
        int new_layout = 0, unlink_file = 0, flags;
        unsigned long long left;
-       unsigned int bs;
+       unsigned int bs, alloc_size = 0;
        char *b = NULL;
 
        if (read_only) {
@@ -147,6 +147,8 @@ static int extend_file(struct thread_data *td, struct fio_file *f)
                flags |= O_CREAT;
        if (new_layout)
                flags |= O_TRUNC;
+       if (td->o.odirect)
+               flags |= OS_O_DIRECT;
 
 #ifdef WIN32
        flags |= _O_BINARY;
@@ -160,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;
        }
 
@@ -188,14 +196,18 @@ 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)
                bs = left;
 
-       b = malloc(bs);
+       alloc_size = bs;
+       b = fio_memalign(page_size, alloc_size);
        if (!b) {
-               td_verror(td, errno, "malloc");
+               td_verror(td, errno, "fio_memalign");
                goto err;
        }
 
@@ -248,14 +260,14 @@ static int extend_file(struct thread_data *td, struct fio_file *f)
                        f->io_size = f->real_file_size;
        }
 
-       free(b);
+       fio_memfree(b, alloc_size);
 done:
        return 0;
 err:
        close(f->fd);
        f->fd = -1;
        if (b)
-               free(b);
+               fio_memfree(b, alloc_size);
        return 1;
 }
 
@@ -528,8 +540,6 @@ static int __file_invalidate_cache(struct thread_data *td, struct fio_file *f,
                }
                if (ret < 0)
                        errval = errno;
-               else if (ret) /* probably not supported */
-                       errval = ret;
        } else if (f->filetype == FIO_TYPE_CHAR ||
                   f->filetype == FIO_TYPE_PIPE) {
                dprint(FD_IO, "invalidate not supported %s\n", f->file_name);
@@ -1846,3 +1856,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
+}