X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=filesetup.c;h=789f0ed29ea501be4c5e3c3ee895093b305b5787;hb=b47b45887dcd4c9bd7d0391a393809ef892a34ff;hp=a6a94ee16f64f34467563dcccdef6a640a75792d;hpb=a4befdc605bc253f258a99e9f0d037147775035e;p=fio.git diff --git a/filesetup.c b/filesetup.c index a6a94ee1..789f0ed2 100644 --- a/filesetup.c +++ b/filesetup.c @@ -15,7 +15,6 @@ #include "os/os.h" #include "hash.h" #include "lib/axmap.h" -#include "lib/memalign.h" #ifdef CONFIG_LINUX_FALLOCATE #include @@ -147,8 +146,6 @@ 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; @@ -162,14 +159,8 @@ 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 { - if (err == EINVAL && (flags & OS_O_DIRECT)) - log_err("fio: looks like your filesystem " - "does not support " - "direct=1/buffered=0\n"); - + else td_verror(td, err, "open"); - } return 1; } @@ -201,9 +192,9 @@ static int extend_file(struct thread_data *td, struct fio_file *f) if (bs > left) bs = left; - b = fio_memalign(page_size, bs); + b = malloc(bs); if (!b) { - td_verror(td, errno, "fio_memalign"); + td_verror(td, errno, "malloc"); goto err; } @@ -256,14 +247,14 @@ static int extend_file(struct thread_data *td, struct fio_file *f) f->io_size = f->real_file_size; } - fio_memfree(b, bs); + free(b); done: return 0; err: close(f->fd); f->fd = -1; if (b) - fio_memfree(b, bs); + free(b); return 1; } @@ -1597,7 +1588,8 @@ int add_file(struct thread_data *td, const char *fname, int numjob, int inc) if (f->filetype == FIO_TYPE_FILE) td->nr_normal_files++; - set_already_allocated(file_name); + if (td->o.numjobs > 1) + set_already_allocated(file_name); if (inc) td->o.nr_files++; @@ -1852,3 +1844,32 @@ 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 + log_err("fio: direct IO is not supported on this host operating system\n"); + return -1; +#endif +}