Add 'null' verify option
[fio.git] / options.c
index e5ee4cf4d8dff1267367d447b0a3d12638645600..5401f90339bf7da688b8e645656cec3a24ee7228 100644 (file)
--- a/options.c
+++ b/options.c
@@ -27,6 +27,18 @@ static char *get_opt_postfix(const char *str)
        return strdup(p);
 }
 
+static int str_rw_cb(void *data, const char *str)
+{
+       struct thread_data *td = data;
+       char *nr = get_opt_postfix(str);
+
+       td->o.ddir_nr = 1;
+       if (nr)
+               td->o.ddir_nr = atoi(nr);
+
+       return 0;
+}
+
 static int str_mem_cb(void *data, const char *mem)
 {
        struct thread_data *td = data;
@@ -203,6 +215,7 @@ static struct fio_option options[] = {
                .name   = "rw",
                .alias  = "readwrite",
                .type   = FIO_OPT_STR,
+               .cb     = str_rw_cb,
                .off1   = td_var_offset(td_ddir),
                .help   = "IO direction",
                .def    = "read",
@@ -233,6 +246,13 @@ static struct fio_option options[] = {
                          },
                },
        },
+       {
+               .name   = "fadvise_hint",
+               .type   = FIO_OPT_BOOL,
+               .off1   = td_var_offset(fadvise_hint),
+               .help   = "Use fadvise() to advise the kernel on IO pattern",
+               .def    = "1",
+       },
        {
                .name   = "ioengine",
                .type   = FIO_OPT_STR_STORE,
@@ -280,6 +300,11 @@ static struct fio_option options[] = {
                          { .ival = "cpuio",
                            .help = "CPU cycler burner engine",
                          },
+#ifdef FIO_HAVE_GUASI
+                         { .ival = "guasi",
+                           .help = "GUASI IO engine",
+                         },
+#endif
                          { .ival = "external",
                            .help = "Load external engine (append name)",
                          },
@@ -465,26 +490,26 @@ static struct fio_option options[] = {
                            .oval = MEM_MALLOC,
                            .help = "Use malloc(3) for IO buffers",
                          },
+                         { .ival = "shm",
+                           .oval = MEM_SHM,
+                           .help = "Use shared memory segments for IO buffers",
+                         },
 #ifdef FIO_HAVE_HUGETLB
                          { .ival = "shmhuge",
                            .oval = MEM_SHMHUGE,
                            .help = "Like shm, but use huge pages",
                          },
-                         { .ival = "shm",
-                           .oval = MEM_SHM,
-                           .help = "Use shared memory segments for IO buffers",
-                         },
 #endif
+                         { .ival = "mmap",
+                           .oval = MEM_MMAP,
+                           .help = "Use mmap(2) (file or anon) for IO buffers",
+                         },
 #ifdef FIO_HAVE_HUGETLB
                          { .ival = "mmaphuge",
                            .oval = MEM_MMAPHUGE,
                            .help = "Like mmap, but use huge pages",
                          },
 #endif
-                         { .ival = "mmap",
-                           .oval = MEM_MMAP,
-                           .help = "Use mmap(2) (file or anon) for IO buffers",
-                         },
                  },
        },
        {
@@ -506,6 +531,11 @@ static struct fio_option options[] = {
                            .oval = VERIFY_MD5,
                            .help = "Use md5 checksums for verification",
                          },
+                         {
+                           .ival = "null",
+                           .oval = VERIFY_NULL,
+                           .help = "Pretend to verify",
+                         },
                },
        },
        {
@@ -571,7 +601,7 @@ static struct fio_option options[] = {
        {
                .name   = "rwmixread",
                .type   = FIO_OPT_INT,
-               .off1   = td_var_offset(rwmixread),
+               .off1   = td_var_offset(rwmix[DDIR_READ]),
                .maxval = 100,
                .help   = "Percentage of mixed workload that is reads",
                .def    = "50",
@@ -579,7 +609,7 @@ static struct fio_option options[] = {
        {
                .name   = "rwmixwrite",
                .type   = FIO_OPT_INT,
-               .off1   = td_var_offset(rwmixwrite),
+               .off1   = td_var_offset(rwmix[DDIR_WRITE]),
                .maxval = 100,
                .help   = "Percentage of mixed workload that is writes",
                .def    = "50",
@@ -752,6 +782,12 @@ static struct fio_option options[] = {
                .off1   = td_var_offset(stonewall),
                .help   = "Insert a hard barrier between this job and previous",
        },
+       {
+               .name   = "new_group",
+               .type   = FIO_OPT_STR_SET,
+               .off1   = td_var_offset(new_group),
+               .help   = "Mark the start of a new group (for reporting)",
+       },
        {
                .name   = "thread",
                .type   = FIO_OPT_STR_SET,
@@ -833,3 +869,39 @@ int fio_show_option_help(const char *opt)
 {
        return show_cmd_help(options, opt);
 }
+
+static void __options_mem(struct thread_data *td, int alloc)
+{
+       struct thread_options *o = &td->o;
+       struct fio_option *opt;
+       char **ptr;
+       int i;
+
+       for (i = 0, opt = &options[0]; opt->name; i++, opt = &options[i]) {
+               if (opt->type != FIO_OPT_STR_STORE)
+                       continue;
+
+               ptr = (void *) o + opt->off1;
+               if (*ptr) {
+                       if (alloc)
+                               *ptr = strdup(*ptr);
+                       else {
+                               free(*ptr);
+                               *ptr = NULL;
+                       }
+               }
+       }
+}
+
+/*
+ * dupe FIO_OPT_STR_STORE options
+ */
+void options_mem_dupe(struct thread_data *td)
+{
+       __options_mem(td, 1);
+}
+
+void options_mem_free(struct thread_data *td)
+{
+       __options_mem(td, 0);
+}