Use sizeof(char*) instead of sizeof(void*)
[fio.git] / options.c
index 07589c47509787719362f0b6b2d0fefe2b3eb4f2..4c56dbe1f11767484190efa3148e48954771c901 100644 (file)
--- a/options.c
+++ b/options.c
@@ -258,7 +258,7 @@ static int str2error(char *str)
                            "EINVAL", "ENFILE", "EMFILE", "ENOTTY",
                            "ETXTBSY","EFBIG", "ENOSPC", "ESPIPE",
                            "EROFS","EMLINK", "EPIPE", "EDOM", "ERANGE" };
-       int i = 0, num = sizeof(err) / sizeof(void *);
+       int i = 0, num = sizeof(err) / sizeof(char *);
 
        while (i < num) {
                if (!strcmp(err[i], str))
@@ -1124,7 +1124,8 @@ static int get_max_name_idx(char *input)
  * Returns the directory at the index, indexes > entires will be
  * assigned via modulo division of the index
  */
-int set_name_idx(char *target, size_t tlen, char *input, int index)
+int set_name_idx(char *target, size_t tlen, char *input, int index,
+                bool unique_filename)
 {
        unsigned int cur_idx;
        int len;
@@ -1136,7 +1137,7 @@ int set_name_idx(char *target, size_t tlen, char *input, int index)
        for (cur_idx = 0; cur_idx <= index; cur_idx++)
                fname = get_next_name(&str);
 
-       if (client_sockaddr_str[0]) {
+       if (client_sockaddr_str[0] && unique_filename) {
                len = snprintf(target, tlen, "%s/%s.", fname,
                                client_sockaddr_str);
        } else
@@ -1390,6 +1391,7 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
        },
        {
                .name   = "filename_format",
+               .lname  = "Filename Format",
                .type   = FIO_OPT_STR_STORE,
                .off1   = td_var_offset(filename_format),
                .prio   = -1, /* must come after "directory" */
@@ -1398,6 +1400,16 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
                .category = FIO_OPT_C_FILE,
                .group  = FIO_OPT_G_FILENAME,
        },
+       {
+               .name   = "unique_filename",
+               .lname  = "Unique Filename",
+               .type   = FIO_OPT_BOOL,
+               .off1   = td_var_offset(unique_filename),
+               .help   = "For network clients, prefix file with source IP",
+               .def    = "1",
+               .category = FIO_OPT_C_FILE,
+               .group  = FIO_OPT_G_FILENAME,
+       },
        {
                .name   = "lockfile",
                .lname  = "Lockfile",
@@ -1536,7 +1548,7 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
                            .help = "Use preadv/pwritev",
                          },
 #endif
-#ifdef CONFIG_PWRITEV2
+#ifdef FIO_HAVE_PWRITEV2
                          { .ival = "pvsync2",
                            .help = "Use preadv2/pwritev2",
                          },
@@ -1666,7 +1678,6 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
                .help   = "Number of IO buffers to submit in one go",
                .parent = "iodepth",
                .hide   = 1,
-               .minval = 1,
                .interval = 1,
                .def    = "1",
                .category = FIO_OPT_C_IO,
@@ -1965,6 +1976,7 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
        },
        {
                .name   = "random_generator",
+               .lname  = "Random Generator",
                .type   = FIO_OPT_STR,
                .off1   = td_var_offset(random_generator),
                .help   = "Type of random number generator to use",
@@ -1989,6 +2001,7 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
        },
        {
                .name   = "random_distribution",
+               .lname  = "Random Distribution",
                .type   = FIO_OPT_STR,
                .off1   = td_var_offset(random_distribution),
                .cb     = str_random_distribution_cb,
@@ -2009,7 +2022,7 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
                          },
                          { .ival = "normal",
                            .oval = FIO_RAND_DIST_GAUSS,
-                           .help = "Normal (gaussian) distribution",
+                           .help = "Normal (Gaussian) distribution",
                          },
                          { .ival = "zoned",
                            .oval = FIO_RAND_DIST_ZONED,
@@ -2044,6 +2057,7 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
        },
        {
                .name   = "allrandrepeat",
+               .lname  = "All Random Repeat",
                .type   = FIO_OPT_BOOL,
                .off1   = td_var_offset(allrand_repeatable),
                .help   = "Use repeatable random numbers for everything",
@@ -2147,7 +2161,14 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
                          },
                },
        },
-#endif /* CONFIG_POSIX_FALLOCATE */
+#else  /* CONFIG_POSIX_FALLOCATE */
+       {
+               .name   = "fallocate",
+               .lname  = "Fallocate",
+               .type   = FIO_OPT_UNSUPPORTED,
+               .help   = "Your platform does not support fallocate",
+       },
+#endif /* CONFIG_POSIX_FALLOCATE */
        {
                .name   = "fadvise_hint",
                .lname  = "Fadvise hint",
@@ -2168,6 +2189,13 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
                .category = FIO_OPT_C_FILE,
                .group  = FIO_OPT_G_INVALID,
        },
+#else
+       {
+               .name   = "fadvise_stream",
+               .lname  = "Fadvise stream",
+               .type   = FIO_OPT_UNSUPPORTED,
+               .help   = "Your platform does not support fadvise stream ID",
+       },
 #endif
        {
                .name   = "fsync",
@@ -2231,6 +2259,13 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
                .category = FIO_OPT_C_FILE,
                .group  = FIO_OPT_G_INVALID,
        },
+#else
+       {
+               .name   = "sync_file_range",
+               .lname  = "Sync file range",
+               .type   = FIO_OPT_UNSUPPORTED,
+               .help   = "Your platform does not support sync_file_range",
+       },
 #endif
        {
                .name   = "direct",
@@ -2543,6 +2578,7 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
        },
        {
                .name   = "verifysort_nr",
+               .lname  = "Verify Sort Nr",
                .type   = FIO_OPT_INT,
                .off1   = td_var_offset(verifysort_nr),
                .help   = "Pre-load and sort verify blocks for a read workload",
@@ -2661,9 +2697,17 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
                .category = FIO_OPT_C_IO,
                .group  = FIO_OPT_G_VERIFY,
        },
+#else
+       {
+               .name   = "verify_async_cpus",
+               .lname  = "Async verify CPUs",
+               .type   = FIO_OPT_UNSUPPORTED,
+               .help   = "Your platform does not support CPU affinities",
+       },
 #endif
        {
                .name   = "experimental_verify",
+               .lname  = "Experimental Verify",
                .off1   = td_var_offset(experimental_verify),
                .type   = FIO_OPT_BOOL,
                .help   = "Enable experimental verification",
@@ -2744,6 +2788,31 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
                .category = FIO_OPT_C_IO,
                .group  = FIO_OPT_G_TRIM,
        },
+#else
+       {
+               .name   = "trim_percentage",
+               .lname  = "Trim percentage",
+               .type   = FIO_OPT_UNSUPPORTED,
+               .help   = "Fio does not support TRIM on your platform",
+       },
+       {
+               .name   = "trim_verify_zero",
+               .lname  = "Verify trim zero",
+               .type   = FIO_OPT_UNSUPPORTED,
+               .help   = "Fio does not support TRIM on your platform",
+       },
+       {
+               .name   = "trim_backlog",
+               .lname  = "Trim backlog",
+               .type   = FIO_OPT_UNSUPPORTED,
+               .help   = "Fio does not support TRIM on your platform",
+       },
+       {
+               .name   = "trim_backlog_batch",
+               .lname  = "Trim backlog batch",
+               .type   = FIO_OPT_UNSUPPORTED,
+               .help   = "Fio does not support TRIM on your platform",
+       },
 #endif
        {
                .name   = "write_iolog",
@@ -2836,6 +2905,13 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
                .category = FIO_OPT_C_FILE,
                .group  = FIO_OPT_G_INVALID,
        },
+#else
+       {
+               .name   = "ioscheduler",
+               .lname  = "I/O scheduler",
+               .type   = FIO_OPT_UNSUPPORTED,
+               .help   = "Your platform does not support IO scheduler switching",
+       },
 #endif
        {
                .name   = "zonesize",
@@ -2936,24 +3012,43 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
                .type   = FIO_OPT_INT,
                .off1   = td_var_offset(ioprio),
                .help   = "Set job IO priority value",
-               .minval = 0,
-               .maxval = 7,
+               .minval = IOPRIO_MIN_PRIO,
+               .maxval = IOPRIO_MAX_PRIO,
                .interval = 1,
                .category = FIO_OPT_C_GENERAL,
                .group  = FIO_OPT_G_CRED,
        },
+#else
+       {
+               .name   = "prio",
+               .lname  = "I/O nice priority",
+               .type   = FIO_OPT_UNSUPPORTED,
+               .help   = "Your platform does not support IO priorities",
+       },
+#endif
+#ifdef FIO_HAVE_IOPRIO_CLASS
+#ifndef FIO_HAVE_IOPRIO
+#error "FIO_HAVE_IOPRIO_CLASS requires FIO_HAVE_IOPRIO"
+#endif
        {
                .name   = "prioclass",
                .lname  = "I/O nice priority class",
                .type   = FIO_OPT_INT,
                .off1   = td_var_offset(ioprio_class),
                .help   = "Set job IO priority class",
-               .minval = 0,
-               .maxval = 3,
+               .minval = IOPRIO_MIN_PRIO_CLASS,
+               .maxval = IOPRIO_MAX_PRIO_CLASS,
                .interval = 1,
                .category = FIO_OPT_C_GENERAL,
                .group  = FIO_OPT_G_CRED,
        },
+#else
+       {
+               .name   = "prioclass",
+               .lname  = "I/O nice priority class",
+               .type   = FIO_OPT_UNSUPPORTED,
+               .help   = "Your platform does not support IO priority classes",
+       },
 #endif
        {
                .name   = "thinktime",
@@ -3078,6 +3173,7 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
        },
        {
                .name   = "max_latency",
+               .lname  = "Max Latency",
                .type   = FIO_OPT_INT,
                .off1   = td_var_offset(max_latency),
                .help   = "Maximum tolerated IO latency (usec)",
@@ -3172,6 +3268,7 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
        },
        {
                .name   = "create_only",
+               .lname  = "Create Only",
                .type   = FIO_OPT_BOOL,
                .off1   = td_var_offset(create_only),
                .help   = "Only perform file creation phase",
@@ -3250,10 +3347,30 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
                .category = FIO_OPT_C_GENERAL,
                .group  = FIO_OPT_G_CRED,
        },
+#else
+       {
+               .name   = "cpumask",
+               .lname  = "CPU mask",
+               .type   = FIO_OPT_UNSUPPORTED,
+               .help   = "Your platform does not support CPU affinities",
+       },
+       {
+               .name   = "cpus_allowed",
+               .lname  = "CPUs allowed",
+               .type   = FIO_OPT_UNSUPPORTED,
+               .help   = "Your platform does not support CPU affinities",
+       },
+       {
+               .name   = "cpus_allowed_policy",
+               .lname  = "CPUs allowed distribution policy",
+               .type   = FIO_OPT_UNSUPPORTED,
+               .help   = "Your platform does not support CPU affinities",
+       },
 #endif
 #ifdef CONFIG_LIBNUMA
        {
                .name   = "numa_cpu_nodes",
+               .lname  = "NUMA CPU Nodes",
                .type   = FIO_OPT_STR,
                .cb     = str_numa_cpunodes_cb,
                .off1   = td_var_offset(numa_cpunodes),
@@ -3263,6 +3380,7 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
        },
        {
                .name   = "numa_mem_policy",
+               .lname  = "NUMA Memory Policy",
                .type   = FIO_OPT_STR,
                .cb     = str_numa_mpol_cb,
                .off1   = td_var_offset(numa_memnodes),
@@ -3270,6 +3388,19 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
                .category = FIO_OPT_C_GENERAL,
                .group  = FIO_OPT_G_INVALID,
        },
+#else
+       {
+               .name   = "numa_cpu_nodes",
+               .lname  = "NUMA CPU Nodes",
+               .type   = FIO_OPT_UNSUPPORTED,
+               .help   = "Build fio with libnuma-dev(el) to enable this option",
+       },
+       {
+               .name   = "numa_mem_policy",
+               .lname  = "NUMA Memory Policy",
+               .type   = FIO_OPT_UNSUPPORTED,
+               .help   = "Build fio with libnuma-dev(el) to enable this option",
+       },
 #endif
        {
                .name   = "end_fsync",
@@ -3313,8 +3444,8 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
        {
                .name   = "exitall_on_error",
                .lname  = "Exit-all on terminate in error",
-               .type   = FIO_OPT_BOOL,
-               .off1   = td_var_offset(unlink),
+               .type   = FIO_OPT_STR_SET,
+               .off1   = td_var_offset(exitall_error),
                .help   = "Terminate all jobs when one exits in error",
                .category = FIO_OPT_C_GENERAL,
                .group  = FIO_OPT_G_PROCESS,
@@ -3353,6 +3484,7 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
        },
        {
                .name   = "per_job_logs",
+               .lname  = "Per Job Logs",
                .type   = FIO_OPT_BOOL,
                .off1   = td_var_offset(per_job_logs),
                .help   = "Include job number in generated log files or not",
@@ -3441,6 +3573,13 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
                .category = FIO_OPT_C_LOG,
                .group  = FIO_OPT_G_INVALID,
        },
+#else
+       {
+               .name   = "log_compression_cpus",
+               .lname  = "Log Compression CPUs",
+               .type   = FIO_OPT_UNSUPPORTED,
+               .help   = "Your platform does not support CPU affinities",
+       },
 #endif
        {
                .name   = "log_store_compressed",
@@ -3451,6 +3590,19 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
                .category = FIO_OPT_C_LOG,
                .group  = FIO_OPT_G_INVALID,
        },
+#else
+       {
+               .name   = "log_compression",
+               .lname  = "Log compression",
+               .type   = FIO_OPT_UNSUPPORTED,
+               .help   = "Install libz-dev(el) to get compression support",
+       },
+       {
+               .name   = "log_store_compressed",
+               .lname  = "Log store compressed",
+               .type   = FIO_OPT_UNSUPPORTED,
+               .help   = "Install libz-dev(el) to get compression support",
+       },
 #endif
        {
                .name   = "block_error_percentiles",
@@ -3611,6 +3763,13 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
                .category = FIO_OPT_C_STAT,
                .group  = FIO_OPT_G_INVALID,
        },
+#else
+       {
+               .name   = "disk_util",
+               .lname  = "Disk utilization",
+               .type   = FIO_OPT_UNSUPPORTED,
+               .help   = "Your platform does not support disk utilization",
+       },
 #endif
        {
                .name   = "gtod_reduce",
@@ -3683,6 +3842,7 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
        },
        {
                .name   = "unified_rw_reporting",
+               .lname  = "Unified RW Reporting",
                .type   = FIO_OPT_BOOL,
                .off1   = td_var_offset(unified_rw_rep),
                .help   = "Unify reporting across data direction",
@@ -3736,6 +3896,7 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
        },
        {
                .name   = "ignore_error",
+               .lname  = "Ignore Error",
                .type   = FIO_OPT_STR,
                .cb     = str_ignore_error_cb,
                .off1   = td_var_offset(ignore_error_nr),
@@ -3746,6 +3907,7 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
        },
        {
                .name   = "error_dump",
+               .lname  = "Error Dump",
                .type   = FIO_OPT_BOOL,
                .off1   = td_var_offset(error_dump),
                .def    = "0",
@@ -4253,7 +4415,8 @@ static void show_closest_option(const char *opt)
                i++;
        }
 
-       if (best_option != -1 && string_distance_ok(name, best_distance))
+       if (best_option != -1 && string_distance_ok(name, best_distance) &&
+           fio_options[best_option].type != FIO_OPT_UNSUPPORTED)
                log_err("Did you mean %s?\n", fio_options[best_option].name);
 
        free(name);