X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=filesetup.c;h=d79fc61081278c934fd1c4aecbfe344666c75811;hp=aad0720f97e9429248f31fd439e2a6e5d1098170;hb=b12ebc65e82de1cc6174b65c79266dd0f0a4fbf3;hpb=1020a139beff50faf1bb18f761b024b664a09e14 diff --git a/filesetup.c b/filesetup.c index aad0720f..d79fc610 100644 --- a/filesetup.c +++ b/filesetup.c @@ -8,11 +8,10 @@ #include #include "fio.h" -#include "os.h" static int extend_file(struct thread_data *td, struct fio_file *f) { - int r, new_layout = 0, flags; + int r, new_layout = 0, unlink_file = 0, flags; unsigned long long left; unsigned int bs; char *b; @@ -24,8 +23,10 @@ static int extend_file(struct thread_data *td, struct fio_file *f) */ if (td_read(td) || (td_write(td) && td->o.overwrite)) new_layout = 1; + if (td_write(td) && !td->o.overwrite) + unlink_file = 1; - if (new_layout && (f->flags & FIO_FILE_EXISTS)) { + if ((unlink_file || new_layout) && (f->flags & FIO_FILE_EXISTS)) { if (unlink(f->file_name) < 0) { td_verror(td, errno, "unlink"); return 1; @@ -180,7 +181,7 @@ int file_invalidate_cache(struct thread_data *td, struct fio_file *f) log_err("fio: only root may flush block devices. Cache flush bypassed!\n"); ret = 0; } - } else if (f->filetype == FIO_TYPE_CHAR) + } else if (f->filetype == FIO_TYPE_CHAR || f->filetype == FIO_TYPE_PIPE) ret = 0; if (ret < 0) { @@ -199,27 +200,48 @@ void generic_close_file(struct thread_data fio_unused *td, struct fio_file *f) int generic_open_file(struct thread_data *td, struct fio_file *f) { + int is_std = 0; int flags = 0; + if (!strcmp(f->file_name, "-")) { + if (td_rw(td)) { + log_err("fio: can't read/write to stdin/out\n"); + return 1; + } + is_std = 1; + + /* + * move output logging to stderr, if we are writing to stdout + */ + if (td_write(td)) + f_out = stderr; + } + if (td->o.odirect) flags |= OS_O_DIRECT; if (td->o.sync_io) flags |= O_SYNC; - if (td_write(td) || td_rw(td)) { + if (td_write(td)) { flags |= O_RDWR; if (f->filetype == FIO_TYPE_FILE) flags |= O_CREAT; - f->fd = open(f->file_name, flags, 0600); + if (is_std) + f->fd = dup(STDOUT_FILENO); + else + f->fd = open(f->file_name, flags, 0600); } else { if (f->filetype == FIO_TYPE_CHAR) flags |= O_RDWR; else flags |= O_RDONLY; - f->fd = open(f->file_name, flags); + if (is_std) + f->fd = dup(STDIN_FILENO); + else + f->fd = open(f->file_name, flags); } if (f->fd == -1) { @@ -274,20 +296,29 @@ int open_files(struct thread_data *td) /* * open/close all files, so that ->real_file_size gets set */ -static void get_file_sizes(struct thread_data *td) +static int get_file_sizes(struct thread_data *td) { struct fio_file *f; unsigned int i; + int err = 0; for_each_file(td, f, i) { - if (td->io_ops->open_file(td, f)) + if (td->io_ops->open_file(td, f)) { + if (td->error != ENOENT) { + log_err("%s\n", td->verror); + err = 1; + } clear_error(td); - else - td->io_ops->close_file(td, f); + } else { + if (td->io_ops->close_file) + td->io_ops->close_file(td, f); + } if (f->real_file_size == -1ULL && td->o.size) f->real_file_size = td->o.size / td->o.nr_files; } + + return err; } /* @@ -308,7 +339,7 @@ int setup_files(struct thread_data *td) if (td->io_ops->setup) err = td->io_ops->setup(td); else - get_file_sizes(td); + err = get_file_sizes(td); if (err) return err; @@ -443,8 +474,7 @@ void close_files(struct thread_data *td) unsigned int i; for_each_file(td, f, i) { - if ((f->flags & FIO_FILE_UNLINK) && - f->filetype == FIO_TYPE_FILE) + if (td->o.unlink && f->filetype == FIO_TYPE_FILE) unlink(f->file_name); td_io_close_file(td, f); @@ -468,13 +498,18 @@ static void get_file_type(struct fio_file *f) { struct stat sb; - f->filetype = FIO_TYPE_FILE; + if (!strcmp(f->file_name, "-")) + f->filetype = FIO_TYPE_PIPE; + else + f->filetype = FIO_TYPE_FILE; if (!lstat(f->file_name, &sb)) { if (S_ISBLK(sb.st_mode)) f->filetype = FIO_TYPE_BD; else if (S_ISCHR(sb.st_mode)) f->filetype = FIO_TYPE_CHAR; + else if (S_ISFIFO(sb.st_mode)) + f->filetype = FIO_TYPE_PIPE; } } @@ -491,6 +526,12 @@ void add_file(struct thread_data *td, const char *fname) memset(f, 0, sizeof(*f)); f->fd = -1; + /* + * init function, io engine may not be loaded yet + */ + if (td->io_ops && (td->io_ops->flags & FIO_DISKLESSIO)) + f->real_file_size = -1ULL; + if (td->o.directory) len = sprintf(file_name, "%s/", td->o.directory);