Rework 'dump_cmdline'
authorJens Axboe <axboe@fb.com>
Tue, 15 Dec 2015 16:53:22 +0000 (09:53 -0700)
committerJens Axboe <axboe@fb.com>
Tue, 15 Dec 2015 16:53:22 +0000 (09:53 -0700)
Store the options in &td->opt_list. Should be no change for
dump_cmdline, but it will prepare us for being able to jump
the job definition as part of the json output.

Signed-off-by: Jens Axboe <axboe@fb.com>
fio.h
init.c
options.c
parse.c
parse.h

diff --git a/fio.h b/fio.h
index fb527dab501c1051a0dbd87468cf7968f737c782..1ff6662b5ef5d5b7b09dd086e9a575e7cb694cae 100644 (file)
--- a/fio.h
+++ b/fio.h
@@ -120,6 +120,7 @@ void sk_out_drop(void);
  */
 struct thread_data {
        struct thread_options o;
+       struct flist_head opt_list;
        unsigned long flags;
        void *eo;
        char verror[FIO_VERROR_SIZE];
@@ -479,7 +480,7 @@ extern int parse_cmd_line(int, char **, int);
 extern int fio_backend(struct sk_out *);
 extern void reset_fio_state(void);
 extern void clear_io_state(struct thread_data *, int);
-extern int fio_options_parse(struct thread_data *, char **, int, int);
+extern int fio_options_parse(struct thread_data *, char **, int);
 extern void fio_keywords_init(void);
 extern void fio_keywords_exit(void);
 extern int fio_cmd_option_parse(struct thread_data *, const char *, char *);
@@ -498,6 +499,7 @@ extern int parse_dryrun(void);
 extern int fio_running_or_pending_io_threads(void);
 extern int fio_set_fd_nonblocking(int, const char *);
 extern void sig_show_status(int sig);
+extern bool is_def_thread(struct thread_data *);
 
 extern uintptr_t page_mask;
 extern uintptr_t page_size;
diff --git a/init.c b/init.c
index 63ba32481b9ba87943d320e0b6daa7f2ae31965b..fb8c9cfb7a085a7b1b1679d4add329efc9dca3db 100644 (file)
--- a/init.c
+++ b/init.c
@@ -385,6 +385,47 @@ static void set_cmd_options(struct thread_data *td)
                o->timeout = def_timeout;
 }
 
+static void dump_print_option(struct print_option *p)
+{
+       const char *delim;
+
+       if (!strcmp("description", p->name))
+               delim = "\"";
+       else
+               delim = "";
+
+       log_info("--%s%s", p->name, p->value ? "" : " ");
+       if (p->value)
+               log_info("=%s%s%s ", delim, p->value, delim);
+}
+
+static void dump_opt_list(struct thread_data *td)
+{
+       struct flist_head *entry;
+       struct print_option *p;
+
+       if (flist_empty(&td->opt_list))
+               return;
+
+       flist_for_each(entry, &td->opt_list) {
+               p = flist_entry(entry, struct print_option, list);
+               dump_print_option(p);
+       }
+}
+
+static void fio_dump_options_free(struct thread_data *td)
+{
+       while (!flist_empty(&td->opt_list)) {
+               struct print_option *p;
+
+               p = flist_first_entry(&td->opt_list, struct print_option, list);
+               flist_del_init(&p->list);
+               free(p->name);
+               free(p->value);
+               free(p);
+       }
+}
+
 /*
  * Return a free job structure.
  */
@@ -410,6 +451,8 @@ static struct thread_data *get_new_job(int global, struct thread_data *parent,
        td = &threads[thread_number++];
        *td = *parent;
 
+       INIT_FLIST_HEAD(&td->opt_list);
+
        td->io_ops = NULL;
        if (!preserve_eo)
                td->eo = NULL;
@@ -446,6 +489,7 @@ static void put_job(struct thread_data *td)
                log_info("fio: %s\n", td->verror);
 
        fio_options_free(td);
+       fio_dump_options_free(td);
        if (td->io_ops)
                free_ioengine(td);
 
@@ -1444,9 +1488,9 @@ void add_job_opts(const char **o, int client_type)
                        td = get_new_job(0, td_parent, 0, jobname);
                }
                if (in_global)
-                       fio_options_parse(td_parent, (char **) &o[i], 1, 0);
+                       fio_options_parse(td_parent, (char **) &o[i], 1);
                else
-                       fio_options_parse(td, (char **) &o[i], 1, 0);
+                       fio_options_parse(td, (char **) &o[i], 1);
                i++;
        }
 
@@ -1686,10 +1730,13 @@ int __parse_jobs_ini(struct thread_data *td,
                        goto out;
                }
 
-               ret = fio_options_parse(td, opts, num_opts, dump_cmdline);
-               if (!ret)
+               ret = fio_options_parse(td, opts, num_opts);
+               if (!ret) {
+                       if (dump_cmdline)
+                               dump_opt_list(td);
+
                        ret = add_job(td, name, 0, 0, type);
-               else {
+               else {
                        log_err("fio: job %s dropped\n", name);
                        put_job(td);
                }
@@ -2585,3 +2632,8 @@ void options_default_fill(struct thread_options *o)
 {
        memcpy(o, &def_thread.o, sizeof(*o));
 }
+
+bool is_def_thread(struct thread_data *td)
+{
+       return td == &def_thread;
+}
index 46d5fb92ea982e64aca4671105ed2128a5042278..caa00af8f5e1dcf9c74c24ef8c1a4b1ea344e5d8 100644 (file)
--- a/options.c
+++ b/options.c
@@ -4079,19 +4079,22 @@ static void show_closest_option(const char *opt)
        free(name);
 }
 
-int fio_options_parse(struct thread_data *td, char **opts, int num_opts,
-                       int dump_cmdline)
+int fio_options_parse(struct thread_data *td, char **opts, int num_opts)
 {
+       struct flist_head *opt_list = NULL;
        int i, ret, unknown;
        char **opts_copy;
 
+       if (!is_def_thread(td))
+               opt_list = &td->opt_list;
+
        sort_options(opts, fio_options, num_opts);
        opts_copy = dup_and_sub_options(opts, num_opts);
 
        for (ret = 0, i = 0, unknown = 0; i < num_opts; i++) {
                struct fio_option *o;
                int newret = parse_option(opts_copy[i], opts[i], fio_options,
-                                               &o, td, dump_cmdline);
+                                               &o, td, opt_list);
 
                if (!newret && o)
                        fio_option_mark_set(&td->o, o);
@@ -4124,7 +4127,7 @@ int fio_options_parse(struct thread_data *td, char **opts, int num_opts,
                        if (td->eo)
                                newret = parse_option(opts_copy[i], opts[i],
                                                      td->io_ops->options, &o,
-                                                     td->eo, dump_cmdline);
+                                                     td->eo, opt_list);
 
                        ret |= newret;
                        if (!o) {
diff --git a/parse.c b/parse.c
index e330deae2c805602be5b5df5f4c462c0f773c9e0..df42e227477e14f5082da58741a3a107e5d341f5 100644 (file)
--- a/parse.c
+++ b/parse.c
@@ -978,7 +978,7 @@ int parse_cmd_option(const char *opt, const char *val,
 
 int parse_option(char *opt, const char *input,
                 struct fio_option *options, struct fio_option **o, void *data,
-                int dump_cmdline)
+                struct flist_head *dump_list)
 {
        char *post;
 
@@ -1004,17 +1004,16 @@ int parse_option(char *opt, const char *input,
                return 1;
        }
 
-       if (dump_cmdline) {
-               const char *delim;
+       if (dump_list) {
+               struct print_option *p = malloc(sizeof(*p));
 
-               if (!strcmp("description", (*o)->name))
-                       delim = "\"";
+               p->name = strdup((*o)->name);
+               if (post)
+                       p->value = strdup(post);
                else
-                       delim = "";
+                       p->value = NULL;
 
-               log_info("--%s%s", (*o)->name, post ? "" : " ");
-               if (post)
-                       log_info("=%s%s%s ", delim, post, delim);
+               flist_add_tail(&p->list, dump_list);
        }
 
        return 0;
diff --git a/parse.h b/parse.h
index 0a813b0fa7852b5d45731246f7d1e9b0905ad2a0..188281050b1138835dbdc212e688309e8098e8de 100644 (file)
--- a/parse.h
+++ b/parse.h
@@ -80,7 +80,7 @@ struct fio_option {
 
 typedef int (str_cb_fn)(void *, char *);
 
-extern int parse_option(char *, const char *, struct fio_option *, struct fio_option **, void *, int);
+extern int parse_option(char *, const char *, struct fio_option *, struct fio_option **, void *, struct flist_head *);
 extern void sort_options(char **, struct fio_option *, int);
 extern int parse_cmd_option(const char *t, const char *l, struct fio_option *, void *);
 extern int show_cmd_help(struct fio_option *, const char *);
@@ -124,4 +124,10 @@ static inline int parse_is_percent(unsigned long long val)
        return val <= -1ULL && val >= (-1ULL - 100ULL);
 }
 
+struct print_option {
+       struct flist_head list;
+       char *name;
+       char *value;
+};
+
 #endif