X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=filesetup.c;h=93cddb1f467b3aea77cfc3b858c1164e89da8964;hp=78264d3d5526d4924f8f49e1509bd9d87dce7bf9;hb=a9a18a3f1b341c7025e63b47f706663cbf19836a;hpb=bab3fd58530027a67df288783f4a70759b3c84b7 diff --git a/filesetup.c b/filesetup.c index 78264d3d..93cddb1f 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) { @@ -284,11 +304,15 @@ static int get_file_sizes(struct thread_data *td) for_each_file(td, f, i) { if (td->io_ops->open_file(td, f)) { - log_err("%s\n", td->verror); - err = 1; + 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; @@ -450,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); @@ -475,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; } } @@ -498,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); @@ -513,6 +547,7 @@ void add_file(struct thread_data *td, const char *fname) void get_file(struct fio_file *f) { + assert(f->flags & FIO_FILE_OPEN); f->references++; }