Fix segfault with net io engine and no file/hostname given
[fio.git] / options.c
index 6352f0a8827bc8c8902f376aab677fbec4768d81..f9bd1a44225cd6f4769952392d0b39a0ce8b0e5d 100644 (file)
--- a/options.c
+++ b/options.c
@@ -1950,6 +1950,13 @@ static struct fio_option options[FIO_MAX_OPTS] = {
                .cb     = str_write_iops_log_cb,
                .help   = "Write log of IOPS during run",
        },
+       {
+               .name   = "log_avg_msec",
+               .type   = FIO_OPT_INT,
+               .off1   = td_var_offset(log_avg_msec),
+               .help   = "Average bw/iops/lat logs over this period of time",
+               .def    = "0",
+       },
        {
                .name   = "hugepage-size",
                .type   = FIO_OPT_INT,
@@ -2057,10 +2064,44 @@ static struct fio_option options[FIO_MAX_OPTS] = {
        },
        {
                .name   = "continue_on_error",
-               .type   = FIO_OPT_BOOL,
+               .type   = FIO_OPT_STR,
                .off1   = td_var_offset(continue_on_error),
                .help   = "Continue on non-fatal errors during IO",
-               .def    = "0",
+               .def    = "none",
+               .posval = {
+                         { .ival = "none",
+                           .oval = ERROR_TYPE_NONE,
+                           .help = "Exit when an error is encountered",
+                         },
+                         { .ival = "read",
+                           .oval = ERROR_TYPE_READ,
+                           .help = "Continue on read errors only",
+                         },
+                         { .ival = "write",
+                           .oval = ERROR_TYPE_WRITE,
+                           .help = "Continue on write errors only",
+                         },
+                         { .ival = "io",
+                           .oval = ERROR_TYPE_READ | ERROR_TYPE_WRITE,
+                           .help = "Continue on any IO errors",
+                         },
+                         { .ival = "verify",
+                           .oval = ERROR_TYPE_VERIFY,
+                           .help = "Continue on verify errors only",
+                         },
+                         { .ival = "all",
+                           .oval = ERROR_TYPE_ANY,
+                           .help = "Continue on all io and verify errors",
+                         },
+                         { .ival = "0",
+                           .oval = ERROR_TYPE_NONE,
+                           .help = "Alias for 'none'",
+                         },
+                         { .ival = "1",
+                           .oval = ERROR_TYPE_ANY,
+                           .help = "Alias for 'all'",
+                         },
+               },
        },
        {
                .name   = "profile",
@@ -2484,8 +2525,10 @@ void options_mem_dupe(void *data, struct fio_option *options)
 void fio_options_mem_dupe(struct thread_data *td)
 {
        options_mem_dupe(&td->o, options);
-       if (td->eo) {
+
+       if (td->eo && td->io_ops) {
                void *oldeo = td->eo;
+
                td->eo = malloc(td->io_ops->option_struct_size);
                memcpy(td->eo, oldeo, td->io_ops->option_struct_size);
                options_mem_dupe(td->eo, td->io_ops->options);