From c229232543f2ca4c492ea32fe7ca6ee894e543a8 Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Tue, 15 Dec 2015 09:53:22 -0700 Subject: [PATCH] Rework 'dump_cmdline' 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 --- fio.h | 4 +++- init.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++----- options.c | 11 ++++++---- parse.c | 17 +++++++-------- parse.h | 8 ++++++- 5 files changed, 82 insertions(+), 20 deletions(-) diff --git a/fio.h b/fio.h index fb527dab..1ff6662b 100644 --- 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 63ba3248..fb8c9cfb 100644 --- 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; +} diff --git a/options.c b/options.c index 46d5fb92..caa00af8 100644 --- 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 e330deae..df42e227 100644 --- 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 0a813b0f..18828105 100644 --- 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 -- 2.25.1