Fix crash on specifying bad IO engine on the command line
[fio.git] / init.c
diff --git a/init.c b/init.c
index 2ae93a026f2aad21025ea3eae8bfc1491646062b..26e42ef64fd018c1219f8112929fbd7f91f8a942 100644 (file)
--- a/init.c
+++ b/init.c
@@ -22,7 +22,7 @@
 
 #include "lib/getopt.h"
 
-static char fio_version_string[] = "fio 1.51";
+static char fio_version_string[] = "fio 1.53";
 
 #define FIO_RANDSEED           (0xb1899bedUL)
 
@@ -64,82 +64,82 @@ static char cmd_optstr[256];
  */
 static struct option l_opts[FIO_NR_OPTIONS] = {
        {
-               .name           = "output",
+               .name           = (char *) "output",
                .has_arg        = required_argument,
                .val            = 'o',
        },
        {
-               .name           = "timeout",
+               .name           = (char *) "timeout",
                .has_arg        = required_argument,
                .val            = 't',
        },
        {
-               .name           = "latency-log",
+               .name           = (char *) "latency-log",
                .has_arg        = required_argument,
                .val            = 'l',
        },
        {
-               .name           = "bandwidth-log",
+               .name           = (char *) "bandwidth-log",
                .has_arg        = required_argument,
                .val            = 'b',
        },
        {
-               .name           = "minimal",
+               .name           = (char *) "minimal",
                .has_arg        = optional_argument,
                .val            = 'm',
        },
        {
-               .name           = "version",
+               .name           = (char *) "version",
                .has_arg        = no_argument,
                .val            = 'v',
        },
        {
-               .name           = "help",
+               .name           = (char *) "help",
                .has_arg        = no_argument,
                .val            = 'h',
        },
        {
-               .name           = "cmdhelp",
+               .name           = (char *) "cmdhelp",
                .has_arg        = optional_argument,
                .val            = 'c',
        },
        {
-               .name           = "showcmd",
+               .name           = (char *) "showcmd",
                .has_arg        = no_argument,
                .val            = 's',
        },
        {
-               .name           = "readonly",
+               .name           = (char *) "readonly",
                .has_arg        = no_argument,
                .val            = 'r',
        },
        {
-               .name           = "eta",
+               .name           = (char *) "eta",
                .has_arg        = required_argument,
                .val            = 'e',
        },
        {
-               .name           = "debug",
+               .name           = (char *) "debug",
                .has_arg        = required_argument,
                .val            = 'd',
        },
        {
-               .name           = "section",
+               .name           = (char *) "section",
                .has_arg        = required_argument,
                .val            = 'x',
        },
        {
-               .name           = "alloc-size",
+               .name           = (char *) "alloc-size",
                .has_arg        = required_argument,
                .val            = 'a',
        },
        {
-               .name           = "profile",
+               .name           = (char *) "profile",
                .has_arg        = required_argument,
                .val            = 'p',
        },
        {
-               .name           = "warnings-fatal",
+               .name           = (char *) "warnings-fatal",
                .has_arg        = no_argument,
                .val            = 'w',
        },
@@ -191,7 +191,7 @@ static void put_job(struct thread_data *td)
 {
        if (td == &def_thread)
                return;
-       
+
        profile_td_exit(td);
 
        if (td->error)
@@ -463,7 +463,7 @@ static int exists_and_not_file(const char *filename)
        return 1;
 }
 
-void td_fill_rand_seeds(struct thread_data *td)
+static void td_fill_rand_seeds_os(struct thread_data *td)
 {
        os_random_seed(td->rand_seeds[0], &td->bsrange_state);
        os_random_seed(td->rand_seeds[1], &td->verify_state);
@@ -482,9 +482,37 @@ void td_fill_rand_seeds(struct thread_data *td)
                td->rand_seeds[4] = FIO_RANDSEED * td->thread_number;
 
        os_random_seed(td->rand_seeds[4], &td->random_state);
+}
+
+static void td_fill_rand_seeds_internal(struct thread_data *td)
+{
+       init_rand_seed(&td->__bsrange_state, td->rand_seeds[0]);
+       init_rand_seed(&td->__verify_state, td->rand_seeds[1]);
+       init_rand_seed(&td->__rwmix_state, td->rand_seeds[2]);
+
+       if (td->o.file_service_type == FIO_FSERVICE_RANDOM)
+               init_rand_seed(&td->__next_file_state, td->rand_seeds[3]);
+
+       init_rand_seed(&td->__file_size_state, td->rand_seeds[5]);
+       init_rand_seed(&td->__trim_state, td->rand_seeds[6]);
+
+       if (!td_random(td))
+               return;
+
+       if (td->o.rand_repeatable)
+               td->rand_seeds[4] = FIO_RANDSEED * td->thread_number;
+
        init_rand_seed(&td->__random_state, td->rand_seeds[4]);
 }
 
+void td_fill_rand_seeds(struct thread_data *td)
+{
+       if (td->o.use_os_rand)
+               td_fill_rand_seeds_os(td);
+       else
+               td_fill_rand_seeds_internal(td);
+}
+
 /*
  * Initialize the various random states we need (random io, block size ranges,
  * read/write mix, etc).
@@ -540,7 +568,7 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num)
        }
 
        if (profile_td_init(td))
-               return 1;
+               goto err;
 
        engine = get_engine_name(td->o.ioengine);
        td->io_ops = load_ioengine(td, engine);
@@ -807,7 +835,7 @@ static int parse_jobs_ini(char *file, int stonewall_flag)
 
                if (is_empty_or_comment(p))
                        continue;
-               if (sscanf(p, "[%255s]", name) != 1) {
+               if (sscanf(p, "[%255[^\n]]", name) != 1) {
                        if (inside_skip)
                                continue;
                        log_err("fio: option <%s> outside of [] job section\n",
@@ -1194,10 +1222,8 @@ static int parse_cmd_line(int argc, char *argv[])
 
                        if (!strncmp(opt, "name", 4) && td) {
                                ret = add_job(td, td->o.name ?: "fio", 0);
-                               if (ret) {
-                                       put_job(td);
+                               if (ret)
                                        return 0;
-                               }
                                td = NULL;
                        }
                        if (!td) {
@@ -1234,8 +1260,6 @@ static int parse_cmd_line(int argc, char *argv[])
        if (td) {
                if (!ret)
                        ret = add_job(td, td->o.name ?: "fio", 0);
-               if (ret)
-                       put_job(td);
        }
 
        while (optind < argc) {