X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=filesetup.c;h=b04fb3e9b89362d1012883f594d9e6c7943e9fb3;hb=22de5d7741f963e57dd5e3bb70d822e992dd2515;hp=ae7f8171305507d9a28417cb5afb74181cc4c655;hpb=08c44a557efc1cf301c39b5a81f8db4ccd7baa2d;p=fio.git diff --git a/filesetup.c b/filesetup.c index ae7f8171..b04fb3e9 100644 --- a/filesetup.c +++ b/filesetup.c @@ -24,6 +24,14 @@ static int root_warn; static FLIST_HEAD(filename_list); +/* + * List entry for filename_list + */ +struct file_name { + struct flist_head list; + char *filename; +}; + static inline void clear_error(struct thread_data *td) { td->error = 0; @@ -434,20 +442,22 @@ static int __file_invalidate_cache(struct thread_data *td, struct fio_file *f, if (len == -1ULL || off == -1ULL) return 0; - dprint(FD_IO, "invalidate cache %s: %llu/%llu\n", f->file_name, off, - len); - if (td->io_ops->invalidate) { + dprint(FD_IO, "invalidate %s cache %s\n", td->io_ops->name, + f->file_name); ret = td->io_ops->invalidate(td, f); if (ret < 0) errval = ret; } else if (f->filetype == FIO_TYPE_FILE) { + dprint(FD_IO, "declare unneeded cache %s: %llu/%llu\n", + f->file_name, off, len); ret = posix_fadvise(f->fd, off, len, POSIX_FADV_DONTNEED); if (ret) errval = ret; } else if (f->filetype == FIO_TYPE_BLOCK) { int retry_count = 0; + dprint(FD_IO, "drop page cache %s\n", f->file_name); ret = blockdev_invalidate_cache(f); while (ret < 0 && errno == EAGAIN && retry_count++ < 25) { /* @@ -469,8 +479,13 @@ static int __file_invalidate_cache(struct thread_data *td, struct fio_file *f, } if (ret < 0) errval = errno; - } else if (f->filetype == FIO_TYPE_CHAR || f->filetype == FIO_TYPE_PIPE) + else if (ret) /* probably not supported */ + errval = ret; + } else if (f->filetype == FIO_TYPE_CHAR || + f->filetype == FIO_TYPE_PIPE) { + dprint(FD_IO, "invalidate not supported %s\n", f->file_name); ret = 0; + } /* * Cache flushing isn't a fatal condition, and we know it will @@ -479,7 +494,8 @@ static int __file_invalidate_cache(struct thread_data *td, struct fio_file *f, * continue on our way. */ if (errval) - log_info("fio: cache invalidation of %s failed: %s\n", f->file_name, strerror(errval)); + log_info("fio: cache invalidation of %s failed: %s\n", + f->file_name, strerror(errval)); return 0; @@ -511,7 +527,7 @@ int generic_close_file(struct thread_data fio_unused *td, struct fio_file *f) f->shadow_fd = -1; } - f->engine_data = 0; + f->engine_pos = 0; return ret; } @@ -619,7 +635,8 @@ open_again: f->fd = dup(STDIN_FILENO); else from_hash = file_lookup_open(f, flags); - } else { //td trim + } else if (td_trim(td)) { + assert(!td_rw(td)); /* should have matched above */ flags |= O_RDWR; from_hash = file_lookup_open(f, flags); } @@ -904,8 +921,7 @@ int setup_files(struct thread_data *td) if (!o->file_size_low) { /* * no file size or range given, file size is equal to - * total size divided by number of files. If that is - * zero, set it to the real file size. If the size + * total size divided by number of files. If the size * doesn't divide nicely with the min blocksize, * make the first files bigger. */ @@ -915,8 +931,24 @@ int setup_files(struct thread_data *td) f->io_size += bs; } - if (!f->io_size) + /* + * We normally don't come here, but if the result is 0, + * set it to the real file size. This could be size of + * the existing one if it already exists, but otherwise + * will be set to 0. A new file won't be created because + * ->io_size + ->file_offset equals ->real_file_size. + */ + if (!f->io_size) { + if (f->file_offset > f->real_file_size) + goto err_offset; f->io_size = f->real_file_size - f->file_offset; + log_info("fio: forcing file %s size to %llu\n", + f->file_name, + (unsigned long long)f->io_size); + if (!f->io_size) + log_info("fio: file %s may be ignored\n", + f->file_name); + } } else if (f->real_file_size < o->file_size_low || f->real_file_size > o->file_size_high) { if (f->file_offset > o->file_size_low) @@ -950,9 +982,9 @@ int setup_files(struct thread_data *td) if (!o->create_on_open) { need_extend++; extend_size += (f->io_size + f->file_offset); + fio_file_set_extend(f); } else f->real_file_size = f->io_size + f->file_offset; - fio_file_set_extend(f); } } @@ -992,9 +1024,15 @@ int setup_files(struct thread_data *td) */ if (need_extend) { temp_stall_ts = 1; - if (output_format & FIO_OUTPUT_NORMAL) - log_info("%s: Laying out IO file(s) (%u file(s) / %lluMiB)\n", - o->name, need_extend, extend_size >> 20); + if (output_format & FIO_OUTPUT_NORMAL) { + log_info("%s: Laying out IO file%s (%u file%s / %s%lluMiB)\n", + o->name, + need_extend > 1 ? "s" : "", + need_extend, + need_extend > 1 ? "s" : "", + need_extend > 1 ? "total " : "", + extend_size >> 20); + } for_each_file(td, f, i) { unsigned long long old_len = -1ULL, extend_len = -1ULL;