goto err;
}
- b = malloc(td->max_bs);
- memset(b, 0, td->max_bs);
+ if (posix_fallocate(f->fd, 0, f->file_size) < 0) {
+ td_verror(td, errno);
+ goto err;
+ }
+
+ b = malloc(td->max_bs[DDIR_WRITE]);
+ memset(b, 0, td->max_bs[DDIR_WRITE]);
left = f->file_size;
while (left && !td->terminate) {
- bs = td->max_bs;
+ bs = td->max_bs[DDIR_WRITE];
if (bs > left)
bs = left;
return 0;
}
+ need_create = 0;
+ if (td->filetype == FIO_TYPE_FILE)
+ for_each_file(td, f, i)
+ need_create += file_ok(td, f);
+
+ if (!need_create)
+ return 0;
+
if (!td->total_file_size) {
log_err("Need size for create\n");
td_verror(td, EINVAL);
return 1;
}
- need_create = 0;
- for_each_file(td, f, i) {
- f->file_size = td->total_file_size / td->nr_files;
- need_create += file_ok(td, f);
- }
-
- td->io_size = td->total_file_size;
-
- if (!need_create)
- return 0;
-
temp_stall_ts = 1;
fprintf(f_out, "%s: Laying out IO file(s) (%d x %LuMiB == %LuMiB)\n",
- td->name, td->nr_files,
- (td->total_file_size >> 20) / td->nr_files,
+ td->name, td->nr_uniq_files,
+ (td->total_file_size >> 20) / td->nr_uniq_files,
td->total_file_size >> 20);
err = 0;
if (create_files(td))
return 1;
+ err = 0;
for_each_file(td, f, i) {
err = setup_file(td, f);
if (err)
break;
}
+ if (err)
+ return err;
+
+ /*
+ * Recalculate the total file size now that files are set up.
+ */
+ td->total_file_size = 0;
+ for_each_file(td, f, i)
+ td->total_file_size += f->file_size;
+
+ td->io_size = td->total_file_size;
if (td->io_size == 0) {
log_err("%s: no io blocks\n", td->name);
td_verror(td, EINVAL);
for_each_file(td, f, i) {
if (f->fd != -1) {
- if (td->unlink && td->filetype == FIO_TYPE_FILE)
+ if (td->unlink && td->filetype == FIO_TYPE_FILE &&
+ td->filename) {
unlink(f->file_name);
+ td->filename = NULL;
+ }
+ free(f->file_name);
+ f->file_name = NULL;
close(f->fd);
f->fd = -1;
}
f->mmap = NULL;
}
}
+
+ free(td->files);
+ td->files = NULL;
+ td->nr_files = 0;
}