[PATCH] File creation and info fixes
authorJens Axboe <jens.axboe@oracle.com>
Thu, 19 Oct 2006 18:50:14 +0000 (20:50 +0200)
committerJens Axboe <jens.axboe@oracle.com>
Thu, 19 Oct 2006 18:50:14 +0000 (20:50 +0200)
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
filesetup.c
fio.h
init.c

index 327eb5a..d0e3ed2 100644 (file)
@@ -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 142e6c9..eed4950 100644 (file)
--- 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 fae35f3..3df7655 100644 (file)
--- 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;