X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=filesetup.c;h=5e8ea357deb82a308d1102f888d895171cfc9e3c;hp=a6a94ee16f64f34467563dcccdef6a640a75792d;hb=07dff7d1d614b33e3a6d3e3ade38ce648b53a632;hpb=6c3169f9cbe179a89bbbaa9de26e54711d027e99 diff --git a/filesetup.c b/filesetup.c index a6a94ee1..5e8ea357 100644 --- a/filesetup.c +++ b/filesetup.c @@ -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) { @@ -196,12 +196,16 @@ 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 = fio_memalign(page_size, bs); + alloc_size = bs; + b = fio_memalign(page_size, alloc_size); if (!b) { td_verror(td, errno, "fio_memalign"); goto err; @@ -256,14 +260,14 @@ static int extend_file(struct thread_data *td, struct fio_file *f) f->io_size = f->real_file_size; } - fio_memfree(b, bs); + fio_memfree(b, alloc_size); done: return 0; err: close(f->fd); f->fd = -1; if (b) - fio_memfree(b, bs); + fio_memfree(b, alloc_size); return 1; } @@ -1852,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 +}