X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=filesetup.c;h=d79fc61081278c934fd1c4aecbfe344666c75811;hb=36361ebb75a8f543aa49ff4f3ee49274261da074;hp=e3478f582ac2c81405457546f6b8a15634521baa;hpb=ea443657ce85860b7a0dd2f39f2572d4a09fc885;p=fio.git diff --git a/filesetup.c b/filesetup.c index e3478f58..d79fc610 100644 --- a/filesetup.c +++ b/filesetup.c @@ -8,7 +8,6 @@ #include #include "fio.h" -#include "os.h" static int extend_file(struct thread_data *td, struct fio_file *f) { @@ -182,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) { @@ -201,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) { @@ -276,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; } /* @@ -310,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; @@ -445,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); @@ -470,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; } } @@ -493,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);