X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=filesetup.c;h=c4240d2a8c9bb457ee2c92c9d5a3375a27885795;hp=38ad9edc6e206fd919309087bf4590dd76231ea1;hb=63463983ce10e9678c5ad309608630eea873b4df;hpb=2c3e17be4c7c9a737317ada414b98929652fec15 diff --git a/filesetup.c b/filesetup.c index 38ad9edc..c4240d2a 100644 --- a/filesetup.c +++ b/filesetup.c @@ -15,6 +15,7 @@ #include "os/os.h" #include "hash.h" #include "lib/axmap.h" +#include "lib/memalign.h" #ifdef CONFIG_LINUX_FALLOCATE #include @@ -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); } - } /* @@ -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,17 @@ 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); + b = fio_memalign(page_size, bs); if (!b) { - td_verror(td, errno, "malloc"); + td_verror(td, errno, "fio_memalign"); goto err; } @@ -248,14 +259,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, bs); done: return 0; err: close(f->fd); f->fd = -1; if (b) - free(b); + fio_memfree(b, bs); return 1; } @@ -528,8 +539,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 +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 +}