make ioengine specific command line options work
[fio.git] / options.c
index d0c53b6c988ed3ee3d61a774eee595091478a6e9..f26ff77647329a645f0fa4ead9eb9a58adcceba7 100644 (file)
--- a/options.c
+++ b/options.c
@@ -104,7 +104,7 @@ static int bssplit_ddir(struct thread_options *o, int ddir, char *str)
 
                if (str_to_decimal(fname, &val, 1, o)) {
                        log_err("fio: bssplit conversion failed\n");
-                       free(o->bssplit);
+                       free(bssplit);
                        return 1;
                }
 
@@ -168,6 +168,9 @@ static int str_bssplit_cb(void *data, const char *input)
        char *str, *p, *odir, *ddir;
        int ret = 0;
 
+       if (parse_dryrun())
+               return 0;
+
        p = str = strdup(input);
 
        strip_blank_front(&str);
@@ -271,6 +274,7 @@ static int ignore_error_type(struct thread_data *td, int etype, char *str)
                if (!error[i]) {
                        log_err("Unknown error %s, please use number value \n",
                                  fname);
+                       free(error);
                        return 1;
                }
                i++;
@@ -289,6 +293,10 @@ static int str_ignore_error_cb(void *data, const char *input)
        struct thread_data *td = data;
        char *str, *p, *n;
        int type = 0, ret = 1;
+
+       if (parse_dryrun())
+               return 0;
+
        p = str = strdup(input);
 
        strip_blank_front(&str);
@@ -314,6 +322,9 @@ static int str_rw_cb(void *data, const char *str)
        struct thread_options *o = &td->o;
        char *nr = get_opt_postfix(str);
 
+       if (parse_dryrun())
+               return 0;
+
        o->ddir_seq_nr = 1;
        o->ddir_seq_add = 0;
 
@@ -376,23 +387,6 @@ static int str_rwmix_write_cb(void *data, unsigned long long *val)
        return 0;
 }
 
-static int str_perc_rand_cb(void *data, unsigned long long *val)
-{
-       struct thread_data *td = data;
-
-       td->o.perc_rand = *val;
-       return 0;
-}
-
-static int str_perc_seq_cb(void *data, unsigned long long *val)
-{
-       struct thread_data *td = data;
-
-       td->o.perc_rand = 100 - *val;
-       return 0;
-}
-
-
 static int str_exitall_cb(void)
 {
        exitall_on_terminate = 1;
@@ -407,6 +401,9 @@ static int str_cpumask_cb(void *data, unsigned long long *val)
        long max_cpu;
        int ret;
 
+       if (parse_dryrun())
+               return 0;
+
        ret = fio_cpuset_init(&td->o.cpumask);
        if (ret < 0) {
                log_err("fio: cpuset_init failed\n");
@@ -505,6 +502,9 @@ static int str_cpus_allowed_cb(void *data, const char *input)
        struct thread_data *td = data;
        int ret;
 
+       if (parse_dryrun())
+               return 0;
+
        ret = set_cpus_allowed(td, &td->o.cpumask, input);
        if (!ret)
                td->o.cpumask_set = 1;
@@ -530,6 +530,9 @@ static int str_numa_cpunodes_cb(void *data, char *input)
 {
        struct thread_data *td = data;
 
+       if (parse_dryrun())
+               return 0;
+
        /* numa_parse_nodestring() parses a character string list
         * of nodes into a bit mask. The bit mask is allocated by
         * numa_allocate_nodemask(), so it should be freed by
@@ -550,10 +553,14 @@ static int str_numa_mpol_cb(void *data, char *input)
 {
        struct thread_data *td = data;
        const char * const policy_types[] =
-               { "default", "prefer", "bind", "interleave", "local" };
+               { "default", "prefer", "bind", "interleave", "local", NULL };
        int i;
+       char *nodelist;
 
-       char *nodelist = strchr(input, ':');
+       if (parse_dryrun())
+               return 0;
+
+       nodelist = strchr(input, ':');
        if (nodelist) {
                /* NUL-terminate mode */
                *nodelist++ = '\0';
@@ -685,6 +692,9 @@ static int str_random_distribution_cb(void *data, const char *str)
        double val;
        char *nr;
 
+       if (parse_dryrun())
+               return 0;
+
        if (td->o.random_distribution == FIO_RAND_DIST_ZIPF)
                val = 1.1;
        else if (td->o.random_distribution == FIO_RAND_DIST_PARETO)
@@ -793,6 +803,9 @@ static int str_directory_cb(void *data, const char fio_unused *str)
        struct thread_data *td = data;
        struct stat sb;
 
+       if (parse_dryrun())
+               return 0;
+
        if (lstat(td->o.directory, &sb) < 0) {
                int ret = errno;
 
@@ -812,6 +825,9 @@ static int str_opendir_cb(void *data, const char fio_unused *str)
 {
        struct thread_data *td = data;
 
+       if (parse_dryrun())
+               return 0;
+
        if (!td->files_index)
                td->o.nr_files = 0;
 
@@ -1498,6 +1514,16 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
                .category = FIO_OPT_C_IO,
                .group  = FIO_OPT_G_INVALID,
        },
+       {
+               .name   = "number_ios",
+               .lname  = "Number of IOs to perform",
+               .type   = FIO_OPT_STR_VAL,
+               .off1   = td_var_offset(number_ios),
+               .help   = "Force job completion of this number of IOs",
+               .def    = "0",
+               .category = FIO_OPT_C_IO,
+               .group  = FIO_OPT_G_INVALID,
+       },
        {
                .name   = "bs",
                .lname  = "Block size",
@@ -1573,6 +1599,17 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
                .category = FIO_OPT_C_IO,
                .group  = FIO_OPT_G_INVALID,
        },
+       {
+               .name   = "bs_is_seq_rand",
+               .lname  = "Block size division is seq/random (not read/write)",
+               .type   = FIO_OPT_BOOL,
+               .off1   = td_var_offset(bs_is_seq_rand),
+               .help   = "Consider any blocksize setting to be sequential,ramdom",
+               .def    = "0",
+               .parent = "blocksize",
+               .category = FIO_OPT_C_IO,
+               .group  = FIO_OPT_G_INVALID,
+       },
        {
                .name   = "randrepeat",
                .lname  = "Random repeatable",
@@ -1668,10 +1705,12 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
                .name   = "percentage_random",
                .lname  = "Percentage Random",
                .type   = FIO_OPT_INT,
-               .cb     = str_perc_rand_cb,
+               .off1   = td_var_offset(perc_rand[DDIR_READ]),
+               .off2   = td_var_offset(perc_rand[DDIR_WRITE]),
+               .off3   = td_var_offset(perc_rand[DDIR_TRIM]),
                .maxval = 100,
                .help   = "Percentage of seq/random mix that should be random",
-               .def    = "100",
+               .def    = "100,100,100",
                .interval = 5,
                .inverse = "percentage_sequential",
                .category = FIO_OPT_C_IO,
@@ -1680,13 +1719,7 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
        {
                .name   = "percentage_sequential",
                .lname  = "Percentage Sequential",
-               .type   = FIO_OPT_INT,
-               .cb     = str_perc_seq_cb,
-               .maxval = 100,
-               .help   = "Percentage of seq/random mix that should be sequential",
-               .def    = "0",
-               .interval = 5,
-               .inverse = "percentage_random",
+               .type   = FIO_OPT_DEPRECATED,
                .category = FIO_OPT_C_IO,
                .group  = FIO_OPT_G_RANDOM,
        },
@@ -2778,7 +2811,7 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
        {
                .name   = "write_iops_log",
                .lname  = "Write IOPS log",
-               .type   = FIO_OPT_STR,
+               .type   = FIO_OPT_STR_STORE,
                .off1   = td_var_offset(iops_log_file),
                .help   = "Write log of IOPS during run",
                .category = FIO_OPT_C_LOG,
@@ -3570,7 +3603,7 @@ int fio_cmd_option_parse(struct thread_data *td, const char *opt, char *val)
 int fio_cmd_ioengine_option_parse(struct thread_data *td, const char *opt,
                                char *val)
 {
-       return parse_cmd_option(opt, val, td->io_ops->options, td);
+       return parse_cmd_option(opt, val, td->io_ops->options, td->eo);
 }
 
 void fio_fill_default_options(struct thread_data *td)