From: Jens Axboe Date: Thu, 19 Oct 2006 18:50:14 +0000 (+0200) Subject: [PATCH] File creation and info fixes X-Git-Tag: fio-1.7~14 X-Git-Url: https://git.kernel.dk/?p=fio.git;a=commitdiff_plain;h=25205e975e6dce6079a4b94d656724011f1aabd0 [PATCH] File creation and info fixes Signed-off-by: Jens Axboe --- diff --git a/filesetup.c b/filesetup.c index 327eb5ac..d0e3ed21 100644 --- a/filesetup.c +++ b/filesetup.c @@ -8,24 +8,30 @@ #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) { @@ -80,7 +86,7 @@ err: 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 @@ -98,19 +104,32 @@ static int create_files(struct thread_data *td) 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; } diff --git a/fio.h b/fio.h index 142e6c9f..eed49503 100644 --- a/fio.h +++ b/fio.h @@ -181,7 +181,6 @@ struct thread_data { unsigned char sequential; unsigned char odirect; - unsigned char create_file; unsigned char invalidate_cache; unsigned char create_serialize; unsigned char create_fsync; diff --git a/init.c b/init.c index fae35f3c..3df76551 100644 --- a/init.c +++ b/init.c @@ -28,7 +28,6 @@ #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) @@ -917,11 +916,6 @@ int parse_jobs_ini(char *file, int stonewall_flag) 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); @@ -1029,7 +1023,6 @@ static int fill_def_thread(void) 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;