#include "fio.h"
#include "os.h"
-static int create_file(struct thread_data *td, struct fio_file *f)
+/*
+ * Check if the file exists and it's large enough.
+ */
+static int file_ok(struct thread_data *td, struct fio_file *f)
{
- unsigned long long left;
- unsigned int bs;
struct stat st;
- char *b;
- int r;
if (td->filetype != FIO_TYPE_FILE)
return 0;
- if (stat(f->file_name, &st) == -1) {
- if (!td->create_file) {
- td_verror(td, ENOENT);
- return 1;
- }
- } else if (st.st_size >= (off_t) f->file_size)
- return 0;
+ if (stat(f->file_name, &st) == -1)
+ return 1;
+ else if (st.st_size < (off_t) f->file_size)
+ return 1;
+
+ return 0;
+}
+
+static int create_file(struct thread_data *td, struct fio_file *f)
+{
+ unsigned long long left;
+ unsigned int bs;
+ char *b;
+ int r;
f->fd = open(f->file_name, O_WRONLY | O_CREAT | O_TRUNC, 0644);
if (f->fd < 0) {
static int create_files(struct thread_data *td)
{
struct fio_file *f;
- int i, err;
+ int i, err, need_create;
/*
* unless specifically asked for overwrite, let normal io extend it
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) (%LuMiB)\n",
- td->name, td->total_file_size >> 20);
+ 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->total_file_size >> 20);
err = 0;
for_each_file(td, f, i) {
- f->file_size = td->total_file_size / td->nr_files;
- err = create_file(td, f);
- if (err)
- break;
+ if (file_ok(td, f)) {
+ err = create_file(td, f);
+ if (err)
+ break;
+ }
}
- td->io_size = td->total_file_size;
temp_stall_ts = 0;
return err;
}
#define DEF_SEQUENTIAL (1)
#define DEF_RAND_REPEAT (1)
#define DEF_OVERWRITE (1)
-#define DEF_CREATE (1)
#define DEF_INVALIDATE (1)
#define DEF_SYNCIO (0)
#define DEF_RANDSEED (0xb1899bedUL)
fgetpos(f, &off);
continue;
}
- if (!check_strset(p, "create")) {
- td->create_file = 1;
- fgetpos(f, &off);
- continue;
- }
if (!check_strset(p, "exitall")) {
exitall_on_terminate = 1;
fgetpos(f, &off);
def_thread.ratecycle = DEF_RATE_CYCLE;
def_thread.sequential = DEF_SEQUENTIAL;
def_thread.timeout = def_timeout;
- def_thread.create_file = DEF_CREATE;
def_thread.overwrite = DEF_OVERWRITE;
def_thread.invalidate_cache = DEF_INVALIDATE;
def_thread.sync_io = DEF_SYNCIO;