X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=filesetup.c;h=085d0c89fc9e6381fcc4c3dd05c6e2ddb0864a66;hb=4499dbef877f3df59a65e9a53b6a6d832a94e315;hp=793b08d07549c895944f406e7afcdb7d7765e840;hpb=79591fa9555024aa9564656bbbb9d4c828a3e189;p=fio.git diff --git a/filesetup.c b/filesetup.c index 793b08d0..085d0c89 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; @@ -377,12 +385,8 @@ static int get_file_size(struct thread_data *td, struct fio_file *f) ret = bdev_size(td, f); else if (f->filetype == FIO_TYPE_CHAR) ret = char_size(td, f); - else { - f->real_file_size = -1; - log_info("%s: failed to get file size of %s\n", td->o.name, - f->file_name); - return 1; /* avoid offset extends end error message */ - } + else + f->real_file_size = -1ULL; /* * Leave ->real_file_size with 0 since it could be expectation @@ -391,11 +395,23 @@ static int get_file_size(struct thread_data *td, struct fio_file *f) if (ret) return ret; + /* + * If ->real_file_size is -1, a conditional for the message + * "offset extends end" is always true, but it makes no sense, + * so just return the same value here. + */ + if (f->real_file_size == -1ULL) { + log_info("%s: failed to get file size of %s\n", td->o.name, + f->file_name); + return 1; + } + + if (td->o.start_offset && f->file_offset == 0) + dprint(FD_FILE, "offset of file %s not initialized yet\n", + f->file_name); /* * ->file_offset normally hasn't been initialized yet, so this - * is basically always false unless ->real_file_size is -1, but - * if ->real_file_size is -1 this message doesn't make sense. - * As a result, this message is basically useless. + * is basically always false. */ if (f->file_offset > f->real_file_size) { log_err("%s: offset extends end (%llu > %llu)\n", td->o.name, @@ -426,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) { /* @@ -461,8 +479,11 @@ 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 (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 @@ -503,7 +524,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; } @@ -611,7 +632,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); } @@ -685,7 +707,7 @@ static int get_file_sizes(struct thread_data *td) int err = 0; for_each_file(td, f, i) { - dprint(FD_FILE, "get file size for %p/%d/%p\n", f, i, + dprint(FD_FILE, "get file size for %p/%d/%s\n", f, i, f->file_name); if (td_io_get_file_size(td, f)) { @@ -896,8 +918,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. */ @@ -907,8 +928,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) @@ -942,9 +979,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); } } @@ -984,9 +1021,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;