From 01f06b63ba67d3bc7fa11766d9f13d229c4cec5c Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Mon, 18 Feb 2008 20:53:47 +0100 Subject: [PATCH] Add --section command line option It enables the user to ship bigger and more complex job files, while still allowing fio to only run a part of it. Signed-off-by: Jens Axboe --- README | 8 ++++++++ fio.h | 1 + init.c | 43 +++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 50 insertions(+), 2 deletions(-) diff --git a/README b/README index e933bd55..0b0cb7ef 100644 --- a/README +++ b/README @@ -75,6 +75,7 @@ $ fio --readonly Turn on safety read-only checks, preventing writes --eta=when When ETA estimate should be printed May be "always", "never" or "auto" + --section=name Only run specified section in job file Any parameters following the options will be assumed to be job files, @@ -103,6 +104,13 @@ options in fio. Currently the options are: You can specify as many as you want, eg --debug=file,mem will enable file and memory debugging. +The section switch is meant to make it easier to ship a bigger job file +instead of several smaller ones. Say you define a job file with light, +moderate, and heavy parts. Then you can ask fio to run the given part +only by giving it a --section=heavy command line option. The section +option only applies to job sections, the reserved 'global' section is +always parsed and taken into account. + Job file -------- diff --git a/fio.h b/fio.h index 67f0badf..6dbc4cd5 100644 --- a/fio.h +++ b/fio.h @@ -667,6 +667,7 @@ extern unsigned long long mlock_size; extern unsigned long page_mask, page_size; extern int read_only; extern int eta_print; +extern char *job_section; extern struct thread_data *threads; diff --git a/init.c b/init.c index e96b4102..1a0f7385 100644 --- a/init.c +++ b/init.c @@ -34,6 +34,7 @@ int eta_print; unsigned long long mlock_size = 0; FILE *f_out = NULL; FILE *f_err = NULL; +char *job_section = NULL; int write_bw_log = 0; int read_only = 0; @@ -110,6 +111,11 @@ static struct option long_options[FIO_NR_OPTIONS] = { .has_arg = required_argument, .val = 'd', }, + { + .name = "section", + .has_arg = required_argument, + .val = 'x', + }, { .name = NULL, }, @@ -548,6 +554,16 @@ err: return -1; } +static int skip_this_section(const char *name) +{ + if (!job_section) + return 0; + if (!strncmp(name, "global", 6)) + return 0; + + return strncmp(job_section, name, strlen(job_section)); +} + static int is_empty_or_comment(char *line) { unsigned int i; @@ -577,6 +593,7 @@ static int parse_jobs_ini(char *file, int stonewall_flag) int ret = 0, stonewall; int first_sect = 1; int skip_fgets = 0; + int inside_skip = 0; if (!strcmp(file, "-")) f = stdin; @@ -615,10 +632,18 @@ static int parse_jobs_ini(char *file, int stonewall_flag) if (is_empty_or_comment(p)) continue; if (sscanf(p, "[%255s]", name) != 1) { + if (inside_skip) + continue; log_err("fio: option <%s> outside of [] job section\n", p); break; } + if (skip_this_section(name)) { + inside_skip = 1; + continue; + } else + inside_skip = 0; + global = !strncmp(name, "global", 6); name[strlen(name) - 1] = '\0'; @@ -775,6 +800,7 @@ static void usage(const char *name) printf("\t--eta=when\tWhen ETA estimate should be printed\n"); printf("\t \tMay be \"always\", \"never\" or \"auto\"\n"); printf("\t--readonly\tTurn on safety read-only checks, preventing writes\n"); + printf("\t--section=name\tOnly run specified section in job file\n"); } #ifdef FIO_INC_DEBUG @@ -884,6 +910,16 @@ static int parse_cmd_line(int argc, char *argv[]) case 'd': set_debug(optarg); break; + case 'x': + if (!strcmp(optarg, "global")) { + log_err("fio: can't use global as only section\n"); + bad_options++; + break; + } + if (job_section) + free(job_section); + job_section = strdup(optarg); + break; case FIO_GETOPT_JOB: { const char *opt = long_options[lidx].name; char *val = optarg; @@ -897,12 +933,15 @@ static int parse_cmd_line(int argc, char *argv[]) td = NULL; } if (!td) { + int is_section = !strncmp(opt, "name", 4); int global = 0; - if (strncmp(opt, "name", 4) || - !strncmp(val, "global", 6)) + if (!is_section || !strncmp(val, "global", 6)) global = 1; + if (is_section && skip_this_section(val)) + continue; + td = get_new_job(global, &def_thread); if (!td) return 0; -- 2.25.1