Make sure that exec_prerun/postrun work for shell commands
[fio.git] / fio.c
diff --git a/fio.c b/fio.c
index 4a02f2ebee198584e477f5e6b8749447c6f94463..62fab49c17ea4be20e416344f90c9278333976f2 100644 (file)
--- a/fio.c
+++ b/fio.c
@@ -925,6 +925,22 @@ static void clear_io_state(struct thread_data *td)
                f->flags &= ~FIO_FILE_DONE;
 }
 
+static int exec_string(const char *string)
+{
+       int ret, newlen = strlen(string) + 1 + 8;
+       char *str;
+
+       str = malloc(newlen);
+       sprintf(str, "sh -c %s", string);
+
+       ret = system(str);
+       if (ret == -1)
+               log_err("fio: exec of cmd <%s> failed\n", str);
+
+       free(str);
+       return ret;
+}
+
 /*
  * Entry point for the thread based jobs. The process based jobs end up
  * here as well, after a little setup.
@@ -1014,7 +1030,12 @@ static void *thread_main(void *data)
                goto err;
 
        if (td->o.exec_prerun) {
-               if (system(td->o.exec_prerun) < 0)
+               if (exec_string(td->o.exec_prerun))
+                       goto err;
+       }
+
+       if (td->o.pre_read) {
+               if (pre_read_files(td) < 0)
                        goto err;
        }
 
@@ -1110,10 +1131,8 @@ static void *thread_main(void *data)
                        finish_log(td, td->ts.clat_log, "clat");
        }
        fio_mutex_up(writeout_mutex);
-       if (td->o.exec_postrun) {
-               if (system(td->o.exec_postrun) < 0)
-                       log_err("fio: postrun %s failed\n", td->o.exec_postrun);
-       }
+       if (td->o.exec_postrun)
+               exec_string(td->o.exec_postrun);
 
        if (exitall_on_terminate)
                terminate_threads(td->groupid);