#include <linux/falloc.h>
#endif
-static int root_warn;
-
static FLIST_HEAD(filename_list);
/*
static void fallocate_file(struct thread_data *td, struct fio_file *f)
{
- int r;
-
if (td->o.fill_device)
return;
case FIO_FALLOCATE_NONE:
break;
#ifdef CONFIG_POSIX_FALLOCATE
- case FIO_FALLOCATE_POSIX:
+ case FIO_FALLOCATE_POSIX: {
+ int r;
+
dprint(FD_FILE, "posix_fallocate file %s size %llu\n",
f->file_name,
(unsigned long long) f->real_file_size);
if (r > 0)
log_err("fio: posix_fallocate fails: %s\n", strerror(r));
break;
+ }
#endif /* CONFIG_POSIX_FALLOCATE */
#ifdef CONFIG_LINUX_FALLOCATE
- case FIO_FALLOCATE_KEEP_SIZE:
+ case FIO_FALLOCATE_KEEP_SIZE: {
+ int r;
+
dprint(FD_FILE, "fallocate(FALLOC_FL_KEEP_SIZE) "
"file %s size %llu\n", f->file_name,
(unsigned long long) f->real_file_size);
td_verror(td, errno, "fallocate");
break;
+ }
#endif /* CONFIG_LINUX_FALLOCATE */
default:
log_err("fio: unknown fallocate mode: %d\n", td->o.fallocate_mode);
ret = bdev_size(td, f);
else if (f->filetype == FIO_TYPE_CHAR)
ret = char_size(td, f);
- else
- f->real_file_size = -1ULL;
+ 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 */
+ }
/*
* 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.
+ * 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.
*/
if (f->file_offset > f->real_file_size) {
log_err("%s: offset extends end (%llu > %llu)\n", td->o.name,
ret = td->io_ops->invalidate(td, f);
if (ret < 0)
errval = -ret;
+ } else if (td_ioengine_flagged(td, FIO_DISKLESSIO)) {
+ dprint(FD_IO, "invalidate not supported by ioengine %s\n",
+ td->io_ops->name);
+ ret = 0;
} else if (f->filetype == FIO_TYPE_FILE) {
dprint(FD_IO, "declare unneeded cache %s: %llu/%llu\n",
f->file_name, off, len);
ret = blockdev_invalidate_cache(f);
}
if (ret < 0 && errno == EACCES && geteuid()) {
- if (!root_warn) {
+ if (!fio_did_warn(FIO_WARN_ROOT_FLUSH)) {
log_err("fio: only root may flush block "
"devices. Cache flush bypassed!\n");
- root_warn = 1;
}
ret = 0;
}
if (f->io_size == -1ULL)
total_size = -1ULL;
else {
- if (o->size_percent) {
+ if (o->size_percent && o->size_percent != 100) {
uint64_t file_size;
file_size = f->io_size + f->file_offset;
return true;
}
-static int __init_rand_distribution(struct thread_data *td, struct fio_file *f)
+static void __init_rand_distribution(struct thread_data *td, struct fio_file *f)
{
unsigned int range_size, seed;
unsigned long nranges;
pareto_init(&f->zipf, nranges, td->o.pareto_h.u.f, seed);
else if (td->o.random_distribution == FIO_RAND_DIST_GAUSS)
gauss_init(&f->gauss, nranges, td->o.gauss_dev.u.f, seed);
-
- return 1;
}
-static int init_rand_distribution(struct thread_data *td)
+static bool init_rand_distribution(struct thread_data *td)
{
struct fio_file *f;
unsigned int i;
int state;
if (td->o.random_distribution == FIO_RAND_DIST_RANDOM)
- return 0;
+ return false;
state = td_bump_runstate(td, TD_SETTING_UP);
__init_rand_distribution(td, f);
td_restore_runstate(td, state);
-
- return 1;
+ return true;
}
/*
return 0;
}
-int init_random_map(struct thread_data *td)
+bool init_random_map(struct thread_data *td)
{
unsigned long long blocks;
struct fio_file *f;
unsigned int i;
if (init_rand_distribution(td))
- return 0;
+ return true;
if (!td_random(td))
- return 0;
+ return true;
for_each_file(td, f, i) {
uint64_t fsize = min(f->real_file_size, f->io_size);
blocks = fsize / (unsigned long long) td->o.rw_min_bs;
if (check_rand_gen_limits(td, f, blocks))
- return 1;
+ return false;
if (td->o.random_generator == FIO_RAND_GEN_LFSR) {
unsigned long seed;
" a large number of jobs, try the 'norandommap'"
" option or set 'softrandommap'. Or give"
" a larger --alloc-size to fio.\n");
- return 1;
+ return false;
}
log_info("fio: file %s failed allocating random map. Running "
"job without.\n", f->file_name);
}
- return 0;
+ return true;
}
void close_files(struct thread_data *td)
if (td_ioengine_flagged(td, FIO_NOFILEHASH))
f = calloc(1, sizeof(*f));
else
- f = smalloc(sizeof(*f));
+ f = scalloc(1, sizeof(*f));
if (!f) {
assert(0);
return NULL;
return true;
}
-static int create_work_dirs(struct thread_data *td, const char *fname)
+static bool create_work_dirs(struct thread_data *td, const char *fname)
{
char path[PATH_MAX];
char *start, *end;
#endif
log_err("fio: failed to create dir (%s): %d\n",
start, errno);
- return 1;
+ return false;
}
*end = FIO_OS_PATH_SEPARATOR;
end++;
}
td->flags |= TD_F_DIRS_CREATED;
- return 0;
+ return true;
}
int add_file(struct thread_data *td, const char *fname, int numjob, int inc)
if (strchr(fname, FIO_OS_PATH_SEPARATOR) &&
!(td->flags & TD_F_DIRS_CREATED) &&
- create_work_dirs(td, fname))
+ !create_work_dirs(td, fname))
return 1;
/* clean cloned siblings using existing files */
}
td->files_index++;
- if (f->filetype == FIO_TYPE_FILE)
- td->nr_normal_files++;
if (td->o.numjobs > 1)
set_already_allocated(file_name);
unlock_file(td, f);
}
-static int recurse_dir(struct thread_data *td, const char *dirname)
+static bool recurse_dir(struct thread_data *td, const char *dirname)
{
struct dirent *dir;
- int ret = 0;
+ bool ret = false;
DIR *D;
D = opendir(dirname);
snprintf(buf, FIO_VERROR_SIZE, "opendir(%s)", dirname);
td_verror(td, errno, buf);
- return 1;
+ return true;
}
while ((dir = readdir(D)) != NULL) {
if (lstat(full_path, &sb) == -1) {
if (errno != ENOENT) {
td_verror(td, errno, "stat");
- ret = 1;
+ ret = true;
break;
}
}
td->o.nr_files = 0;
td->o.open_files = 0;
td->files_index = 0;
- td->nr_normal_files = 0;
}
void fio_file_reset(struct thread_data *td, struct fio_file *f)