if (!error[i]) {
log_err("Unknown error %s, please use number value \n",
fname);
+ free(error);
return 1;
}
i++;
{
struct thread_data *td = data;
const char * const policy_types[] =
- { "default", "prefer", "bind", "interleave", "local" };
+ { "default", "prefer", "bind", "interleave", "local", NULL };
int i;
char *nodelist = strchr(input, ':');
{
struct thread_data *td = data;
long off;
- int i = 0, j = 0, len, k, base = 10;
+ int i = 0, j = 0, len, k, base = 10, pattern_length;
char *loc1, *loc2;
loc1 = strstr(input, "0x");
* Fill the pattern all the way to the end. This greatly reduces
* the number of memcpy's we have to do when verifying the IO.
*/
+ pattern_length = i;
while (i > 1 && i * 2 <= MAX_PATTERN_SIZE) {
memcpy(&td->o.verify_pattern[i], &td->o.verify_pattern[0], i);
i *= 2;
}
+
+ /*
+ * Fill remainder, if the pattern multiple ends up not being
+ * MAX_PATTERN_SIZE.
+ */
+ while (i > 1 && i < MAX_PATTERN_SIZE) {
+ unsigned int b = min(pattern_length, MAX_PATTERN_SIZE - i);
+
+ memcpy(&td->o.verify_pattern[i], &td->o.verify_pattern[0], b);
+ i += b;
+ }
+
if (i == 1) {
/*
* The code in verify_io_u_pattern assumes a single byte pattern
{ .ival = "vsync",
.help = "Use readv/writev",
},
+#ifdef CONFIG_PWRITEV
+ { .ival = "pvsync",
+ .help = "Use preadv/pwritev",
+ },
+#endif
#ifdef CONFIG_LIBAIO
{ .ival = "libaio",
.help = "Linux native asynchronous IO",
.category = FIO_OPT_C_IO,
.group = FIO_OPT_G_INVALID,
},
+ {
+ .name = "number_ios",
+ .lname = "Number of IOs to perform",
+ .type = FIO_OPT_STR_VAL,
+ .off1 = td_var_offset(number_ios),
+ .help = "Force job completion of this number of IOs",
+ .def = "0",
+ .category = FIO_OPT_C_IO,
+ .group = FIO_OPT_G_INVALID,
+ },
{
.name = "bs",
.lname = "Block size",
.category = FIO_OPT_C_IO,
.group = FIO_OPT_G_INVALID,
},
+ {
+ .name = "bs_is_seq_rand",
+ .lname = "Block size division is seq/random (not read/write)",
+ .type = FIO_OPT_BOOL,
+ .off1 = td_var_offset(bs_is_seq_rand),
+ .help = "Consider any blocksize setting to be sequential,ramdom",
+ .def = "0",
+ .parent = "blocksize",
+ .category = FIO_OPT_C_IO,
+ .group = FIO_OPT_G_INVALID,
+ },
{
.name = "randrepeat",
.lname = "Random repeatable",
.category = FIO_OPT_C_IO,
.group = FIO_OPT_G_RANDOM,
},
+ {
+ .name = "percentage_random",
+ .lname = "Percentage Random",
+ .type = FIO_OPT_INT,
+ .off1 = td_var_offset(perc_rand[DDIR_READ]),
+ .off2 = td_var_offset(perc_rand[DDIR_WRITE]),
+ .off3 = td_var_offset(perc_rand[DDIR_TRIM]),
+ .maxval = 100,
+ .help = "Percentage of seq/random mix that should be random",
+ .def = "100,100,100",
+ .interval = 5,
+ .inverse = "percentage_sequential",
+ .category = FIO_OPT_C_IO,
+ .group = FIO_OPT_G_RANDOM,
+ },
+ {
+ .name = "percentage_sequential",
+ .lname = "Percentage Sequential",
+ .type = FIO_OPT_DEPRECATED,
+ .category = FIO_OPT_C_IO,
+ .group = FIO_OPT_G_RANDOM,
+ },
{
.name = "nrfiles",
.lname = "Number of files",
{
.name = "write_iops_log",
.lname = "Write IOPS log",
- .type = FIO_OPT_STR,
+ .type = FIO_OPT_STR_STORE,
.off1 = td_var_offset(iops_log_file),
.help = "Write log of IOPS during run",
.category = FIO_OPT_C_LOG,
{
.name = "group_reporting",
.lname = "Group reporting",
- .type = FIO_OPT_BOOL,
+ .type = FIO_OPT_STR_SET,
.off1 = td_var_offset(group_reporting),
.help = "Do reporting on a per-group basis",
- .def = "1",
.category = FIO_OPT_C_STAT,
.group = FIO_OPT_G_INVALID,
},