Add zero_buffers option
[fio.git] / options.c
index e13b2b241342092b0d60b5c7b499fed4e85a0582..754eb81fccfe1a14f6949f30d07475ea09acc834 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,
@@ -511,8 +531,20 @@ static struct fio_option options[] = {
                            .oval = VERIFY_MD5,
                            .help = "Use md5 checksums for verification",
                          },
+                         {
+                           .ival = "null",
+                           .oval = VERIFY_NULL,
+                           .help = "Pretend to verify",
+                         },
                },
        },
+       {
+               .name   = "verifysort",
+               .type   = FIO_OPT_BOOL,
+               .off1   = td_var_offset(verifysort),
+               .help   = "Sort written verify blocks for read back",
+               .def    = "1",
+       },
        {
                .name   = "write_iolog",
                .type   = FIO_OPT_STR_STORE,
@@ -794,6 +826,12 @@ static struct fio_option options[] = {
                .off1   = td_var_offset(group_reporting),
                .help   = "Do reporting on a per-group basis",
        },
+       {
+               .name   = "zero_buffers",
+               .type   = FIO_OPT_STR_SET,
+               .off1   = td_var_offset(zero_buffers),
+               .help   = "Init IO buffers to all zeroes",
+       },
        {
                .name = NULL,
        },
@@ -844,3 +882,41 @@ 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 fio_unused *td)
+{
+#if 0
+       __options_mem(td, 0);
+#endif
+}