From: Tomohiro Kusumi <tkusumi@xxxxxxxxxx> 8c43ba62('filesetup: align layout buffer') and 6e344dc3('filesetup: keep OS_O_DIRECT flag when pre-allocating file') only consider OS with open(O_DIRECT). This commit adds fio_set_directio() since now OS specific direct I/O initialization is needed by both real ->fd and temporary ->fd while in extend_file() to equally support the feature. Signed-off-by: Tomohiro Kusumi <tkusumi@xxxxxxxxxx> --- file.h | 1 + filesetup.c | 31 +++++++++++++++++++++++++++++++ ioengines.c | 25 ++----------------------- 3 files changed, 34 insertions(+), 23 deletions(-) diff --git a/file.h b/file.h index 84daa5f..ad8802d 100644 --- a/file.h +++ b/file.h @@ -211,5 +211,6 @@ extern void filesetup_mem_free(void); extern void fio_file_reset(struct thread_data *, struct fio_file *); extern bool fio_files_done(struct thread_data *); extern bool exists_and_not_regfile(const char *); +extern int fio_set_directio(struct thread_data *, struct fio_file *); #endif diff --git a/filesetup.c b/filesetup.c index a6a94ee..4ceaef6 100644 --- a/filesetup.c +++ b/filesetup.c @@ -196,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) @@ -1852,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->fd); + + 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 +} diff --git a/ioengines.c b/ioengines.c index 6e135af..919781c 100644 --- a/ioengines.c +++ b/ioengines.c @@ -495,29 +495,8 @@ int td_io_open_file(struct thread_data *td, struct fio_file *f) } #endif -#ifdef FIO_OS_DIRECTIO - /* - * Some OS's have a distinct call to mark the file non-buffered, - * instead of using O_DIRECT (Solaris) - */ - if (td->o.odirect) { - int ret = fio_set_odirect(f->fd); - - if (ret) { - td_verror(td, ret, "fio_set_odirect"); -#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 - goto err; - } - } -#endif + if (td->o.odirect && !OS_O_DIRECT && fio_set_directio(td, f)) + goto err; done: log_file(td, f, FIO_LOG_OPEN_FILE); -- 2.9.5 -- To unsubscribe from this list: send the line "unsubscribe fio" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html