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
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,
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);
}
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)) {
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.
*/
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)
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);
}
}
*/
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;