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;
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;
+ 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) {
/*
}
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
* 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;
f->shadow_fd = -1;
}
- f->engine_data = 0;
+ f->engine_pos = 0;
return ret;
}
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);