}
}
- b = malloc(td->o.max_bs[DDIR_WRITE]);
-
left = f->real_file_size;
+ bs = td->o.max_bs[DDIR_WRITE];
+ if (bs > left)
+ bs = left;
+
+ b = malloc(bs);
+ if (!b) {
+ td_verror(td, errno, "malloc");
+ goto err;
+ }
+
while (left && !td->terminate) {
- bs = td->o.max_bs[DDIR_WRITE];
if (bs > left)
bs = left;
unsigned int bs;
char *b;
- if (td_ioengine_flagged(td, FIO_PIPEIO))
+ if (td_ioengine_flagged(td, FIO_PIPEIO) ||
+ td_ioengine_flagged(td, FIO_NOIO))
+ return 0;
+
+ if (f->filetype == FIO_TYPE_CHAR)
return 0;
if (!fio_file_open(f)) {
old_runstate = td_bump_runstate(td, TD_PRE_READING);
+ left = f->io_size;
bs = td->o.max_bs[DDIR_READ];
+ if (bs > left)
+ bs = left;
+
b = malloc(bs);
+ if (!b) {
+ td_verror(td, errno, "malloc");
+ ret = 1;
+ goto error;
+ }
memset(b, 0, bs);
if (lseek(f->fd, f->file_offset, SEEK_SET) < 0) {
goto error;
}
- left = f->io_size;
-
while (left && !td->terminate) {
if (bs > left)
bs = left;
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;
}
/*
- * 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
+ * We normally don't come here for regular files, but
+ * if the result is 0 for a regular file, 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);
dprint(FD_FILE, "pre_read files\n");
for_each_file(td, f, i) {
- pre_read_file(td, f);
+ if (pre_read_file(td, f))
+ return -1;
}
- return 1;
+ return 0;
}
static int __init_rand_distribution(struct thread_data *td, struct fio_file *f)