fio: allow milliseconds on all time specifiers
[fio.git] / options.c
index 57e9af5b4676296f22a1aee8a97fd379826afb53..4a68c01bc9e4a0a11368b10ca9586e179c5ab0be 100644 (file)
--- a/options.c
+++ b/options.c
@@ -821,6 +821,18 @@ static int str_directory_cb(void *data, const char fio_unused *str)
        return 0;
 }
 
+static int str_lockfile_cb(void *data, const char fio_unused *str)
+{
+       struct thread_data *td = data;
+
+       if (td->files_index) {
+               log_err("fio: lockfile= option must precede filename=\n");
+               return 1;
+       }
+
+       return 0;
+}
+
 static int str_opendir_cb(void *data, const char fio_unused *str)
 {
        struct thread_data *td = data;
@@ -1231,6 +1243,7 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
                .parent = "filename",
                .hide   = 0,
                .def    = "none",
+               .cb     = str_lockfile_cb,
                .category = FIO_OPT_C_FILE,
                .group  = FIO_OPT_G_FILENAME,
                .posval = {
@@ -1374,6 +1387,11 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
                          { .ival = "windowsaio",
                            .help = "Windows native asynchronous IO"
                          },
+#endif
+#ifdef CONFIG_RBD
+                         { .ival = "rbd",
+                           .help = "Rados Block Device asynchronous IO"
+                         },
 #endif
                          { .ival = "mmap",
                            .help = "Memory mapped IO"
@@ -1765,6 +1783,13 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
                .category = FIO_OPT_C_IO,
                .group  = FIO_OPT_G_RANDOM,
        },
+       {
+               .name   = "allrandrepeat",
+               .type   = FIO_OPT_BOOL,
+               .off1   = td_var_offset(allrand_repeatable),
+               .help   = "Use repeatable random numbers for everything",
+               .def    = "0",
+       },
        {
                .name   = "nrfiles",
                .lname  = "Number of files",
@@ -1901,18 +1926,18 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
                          { .ival = "wait_before",
                            .oval = SYNC_FILE_RANGE_WAIT_BEFORE,
                            .help = "SYNC_FILE_RANGE_WAIT_BEFORE",
-                           .or   = 1,
+                           .orval  = 1,
                          },
                          { .ival = "write",
                            .oval = SYNC_FILE_RANGE_WRITE,
                            .help = "SYNC_FILE_RANGE_WRITE",
-                           .or   = 1,
+                           .orval  = 1,
                          },
                          {
                            .ival = "wait_after",
                            .oval = SYNC_FILE_RANGE_WAIT_AFTER,
                            .help = "SYNC_FILE_RANGE_WAIT_AFTER",
-                           .or   = 1,
+                           .orval  = 1,
                          },
                },
                .type   = FIO_OPT_STR_MULTI,
@@ -3727,7 +3752,7 @@ void options_mem_dupe(void *data, struct fio_option *options)
                if (o->type != FIO_OPT_STR_STORE)
                        continue;
 
-               ptr = td_var(data, o->off1);
+               ptr = td_var(data, o, o->off1);
                if (*ptr)
                        *ptr = strdup(*ptr);
        }
@@ -3773,7 +3798,13 @@ int add_option(struct fio_option *o)
                __o++;
        }
 
+       if (opt_index + 1 == FIO_MAX_OPTS) {
+               log_err("fio: FIO_MAX_OPTS is too small\n");
+               return 1;
+       }
+
        memcpy(&fio_options[opt_index], o, sizeof(*o));
+       fio_options[opt_index + 1].name = NULL;
        return 0;
 }