X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=filesetup.c;h=0631a01f96a635789f925e6f54f7abf9a23ce92f;hp=a6a94ee16f64f34467563dcccdef6a640a75792d;hb=a9f517ae84b6183fee8cdafe83b8ecb4b76e05a3;hpb=6c3169f9cbe179a89bbbaa9de26e54711d027e99 diff --git a/filesetup.c b/filesetup.c index a6a94ee1..0631a01f 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; } @@ -1351,6 +1342,7 @@ void close_and_free_files(struct thread_data *td) { struct fio_file *f; unsigned int i; + bool use_free = td_ioengine_flagged(td, FIO_NOFILEHASH); dprint(FD_FILE, "close files\n"); @@ -1370,13 +1362,19 @@ void close_and_free_files(struct thread_data *td) td_io_unlink_file(td, f); } - sfree(f->file_name); + if (use_free) + free(f->file_name); + else + sfree(f->file_name); f->file_name = NULL; if (fio_file_axmap(f)) { axmap_free(f->io_axmap); f->io_axmap = NULL; } - sfree(f); + if (use_free) + free(f); + else + sfree(f); } td->o.filename = NULL; @@ -1490,7 +1488,10 @@ static struct fio_file *alloc_new_file(struct thread_data *td) { struct fio_file *f; - f = smalloc(sizeof(*f)); + if (td_ioengine_flagged(td, FIO_NOFILEHASH)) + f = calloc(1, sizeof(*f)); + else + f = smalloc(sizeof(*f)); if (!f) { assert(0); return NULL; @@ -1573,7 +1574,10 @@ int add_file(struct thread_data *td, const char *fname, int numjob, int inc) if (td->io_ops && td_ioengine_flagged(td, FIO_DISKLESSIO)) f->real_file_size = -1ULL; - f->file_name = smalloc_strdup(file_name); + if (td_ioengine_flagged(td, FIO_NOFILEHASH)) + f->file_name = strdup(file_name); + else + f->file_name = smalloc_strdup(file_name); if (!f->file_name) assert(0); @@ -1597,7 +1601,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++; @@ -1777,7 +1782,10 @@ void dup_files(struct thread_data *td, struct thread_data *org) __f = alloc_new_file(td); if (f->file_name) { - __f->file_name = smalloc_strdup(f->file_name); + if (td_ioengine_flagged(td, FIO_NOFILEHASH)) + __f->file_name = strdup(f->file_name); + else + __f->file_name = smalloc_strdup(f->file_name); if (!__f->file_name) assert(0); @@ -1852,3 +1860,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 +}