[PATCH] Add option to specify the exact file used
[fio.git] / filesetup.c
index d0e3ed212366c27c05d7e7618912f80508fdb907..4310a79f7e6e513b341324c3b2aa3679ffa39219 100644 (file)
@@ -98,27 +98,24 @@ static int create_files(struct thread_data *td)
                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;
@@ -365,12 +362,24 @@ int setup_files(struct thread_data *td)
        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);
@@ -397,6 +406,8 @@ void close_files(struct thread_data *td)
                if (f->fd != -1) {
                        if (td->unlink && td->filetype == FIO_TYPE_FILE)
                                unlink(f->file_name);
+                       free(f->file_name);
+                       f->file_name = NULL;
                        close(f->fd);
                        f->fd = -1;
                }
@@ -405,4 +416,8 @@ void close_files(struct thread_data *td)
                        f->mmap = NULL;
                }
        }
+
+       free(td->files);
+       td->files = NULL;
+       td->nr_files = 0;
 }