Memory leak fixes
[fio.git] / fio.c
diff --git a/fio.c b/fio.c
index e5d3bbf3c204790e7f98b2b36b749f870acdac22..856ca753fdd472e7c435c9138422e343ff08edfa 100644 (file)
--- a/fio.c
+++ b/fio.c
@@ -1361,7 +1361,6 @@ err:
        if (td->o.write_iolog_file)
                write_iolog_close(td);
 
        if (td->o.write_iolog_file)
                write_iolog_close(td);
 
-       options_mem_free(td);
        td_set_runstate(td, TD_EXITED);
        return (void *) (unsigned long) td->error;
 }
        td_set_runstate(td, TD_EXITED);
        return (void *) (unsigned long) td->error;
 }
@@ -1773,11 +1772,17 @@ static void run_threads(void)
 
 int exec_run(void)
 {
 
 int exec_run(void)
 {
+       struct thread_data *td;
+       int i;
+
        if (nr_clients)
                return fio_handle_clients();
        if (nr_clients)
                return fio_handle_clients();
-       if (exec_profile && load_profile(exec_profile))
-               return 1;
-
+       if (exec_profile) {
+               if (load_profile(exec_profile))
+                       return 1;
+               free(exec_profile);
+               exec_profile = NULL;
+       }
        if (!thread_number)
                return 0;
 
        if (!thread_number)
                return 0;
 
@@ -1810,6 +1815,9 @@ int exec_run(void)
                }
        }
 
                }
        }
 
+       for_each_td(td, i)
+               fio_options_free(td);
+
        cgroup_kill(cgroup_list);
        sfree(cgroup_list);
        sfree(cgroup_mnt);
        cgroup_kill(cgroup_list);
        sfree(cgroup_list);
        sfree(cgroup_mnt);