X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=init.c;h=09bbce4c597ea6ca5aae939fe05482c069636cbd;hp=911ee32f995d4c6fd6562a2cde3194eaa1beca8c;hb=8cc7afa91ddc5a0980b9d2dbfdd66e1511a0d4b1;hpb=e47f799f567508835b60675ed659c97f78e7cc94 diff --git a/init.c b/init.c index 911ee32f..09bbce4c 100644 --- a/init.c +++ b/init.c @@ -17,12 +17,13 @@ #include "fio.h" #include "parse.h" -static char fio_version_string[] = "fio 1.14a"; +static char fio_version_string[] = "fio 1.15.2"; #define FIO_RANDSEED (0xb1899bedUL) static char **ini_file; static int max_jobs = MAX_JOBS; +static int dump_cmdline; struct thread_data def_thread; struct thread_data *threads = NULL; @@ -85,6 +86,11 @@ static struct option long_options[FIO_NR_OPTIONS] = { .has_arg = optional_argument, .val = 'c', }, + { + .name = "showcmd", + .has_arg = no_argument, + .val = 's' + }, { .name = NULL, }, @@ -115,6 +121,9 @@ static struct thread_data *get_new_job(int global, struct thread_data *parent) td = &threads[thread_number++]; *td = *parent; + dup_files(td, parent); + options_mem_dupe(td); + td->thread_number = thread_number; return td; } @@ -358,7 +367,6 @@ static int init_random_state(struct thread_data *td) return 0; } - /* * Adds a job to the list of things todo. Sanitizes the various options * to make sure we don't have conflicts, and initializes various @@ -369,7 +377,6 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num) const char *ddir_str[] = { NULL, "read", "write", "rw", NULL, "randread", "randwrite", "randrw" }; unsigned int i; - struct fio_file *f; const char *engine; char fname[PATH_MAX]; int numjobs, file_alloced; @@ -380,6 +387,14 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num) if (td == &def_thread) return 0; + /* + * if we are just dumping the output command line, don't add the job + */ + if (dump_cmdline) { + put_job(td); + return 0; + } + engine = get_engine_name(td->o.ioengine); td->io_ops = load_ioengine(td, engine); if (!td->io_ops) { @@ -412,18 +427,19 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num) if (fixup_options(td)) goto err; - for_each_file(td, f, i) { - if (td->o.directory && f->filetype == FIO_TYPE_FILE) { - sprintf(fname, "%s/%s", td->o.directory, f->file_name); - f->file_name = strdup(fname); - } + if (td->io_ops->flags & FIO_DISKLESSIO) { + struct fio_file *f; + + for_each_file(td, f, i) + f->real_file_size = -1ULL; } - + td->mutex = fio_sem_init(0); td->ts.clat_stat[0].min_val = td->ts.clat_stat[1].min_val = ULONG_MAX; td->ts.slat_stat[0].min_val = td->ts.slat_stat[1].min_val = ULONG_MAX; td->ts.bw_stat[0].min_val = td->ts.bw_stat[1].min_val = ULONG_MAX; + td->ddir_nr = td->o.ddir_nr; if ((td->o.stonewall || td->o.numjobs > 1 || td->o.new_group) && prev_group_jobs) { @@ -486,6 +502,7 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num) td_new->o.numjobs = 1; td_new->o.stonewall = 0; + td_new->o.new_group = 0; if (file_alloced) { td_new->o.filename = NULL; @@ -549,15 +566,27 @@ static int parse_jobs_ini(char *file, int stonewall_flag) p = fgets(string, 4095, f); if (!p) break; + + strip_blank_front(&p); + strip_blank_end(p); + if (is_empty_or_comment(p)) continue; - if (sscanf(p, "[%255s]", name) != 1) + if (sscanf(p, "[%255s]", name) != 1) { + log_err("fio: option <%s> outside of job section\n", p); continue; + } global = !strncmp(name, "global", 6); name[strlen(name) - 1] = '\0'; + if (dump_cmdline) { + log_info("fio "); + if (!global) + log_info("--name=%s ", name); + } + td = get_new_job(global, &def_thread); if (!td) { ret = 1; @@ -592,6 +621,8 @@ static int parse_jobs_ini(char *file, int stonewall_flag) * easier on the user. */ ret |= fio_option_parse(td, p); + if (!ret && dump_cmdline) + log_info("--%s ", p); } if (!ret) { @@ -603,6 +634,9 @@ static int parse_jobs_ini(char *file, int stonewall_flag) } } while (!ret); + if (dump_cmdline) + log_info("\n"); + free(string); free(name); fclose(f); @@ -694,6 +728,7 @@ static void usage(void) printf("\t--version\tPrint version info and exit\n"); printf("\t--help\t\tPrint this page\n"); printf("\t--cmdhelp=cmd\tPrint command help, \"all\" for all of them\n"); + printf("\t--showcmd\tTurn a job file into command line options\n"); } static int parse_cmd_line(int argc, char *argv[]) @@ -728,6 +763,9 @@ static int parse_cmd_line(int argc, char *argv[]) exit(0); case 'c': exit(fio_show_option_help(optarg)); + case 's': + dump_cmdline = 1; + break; case 'v': printf("%s\n", fio_version_string); exit(0); @@ -807,8 +845,12 @@ int parse_options(int argc, char *argv[]) } free(ini_file); + options_mem_free(&def_thread); if (!thread_number) { + if (dump_cmdline) + return 0; + log_err("No jobs defined(s)\n"); return 1; }