#define DEF_UNLINK (0)
#define DEF_WRITE_BW_LOG (0)
#define DEF_WRITE_LAT_LOG (0)
+#define DEF_NO_RAND_MAP (0)
#define td_var_offset(var) ((size_t) &((struct thread_data *)0)->var)
.type = FIO_OPT_STR_SET,
.off1 = td_var_offset(write_lat_log),
},
+ {
+ .name = "norandommap",
+ .type = FIO_OPT_STR_SET,
+ .off1 = td_var_offset(norandommap),
+ },
+ {
+ .name = "bs_unaligned",
+ .type = FIO_OPT_STR_SET,
+ .off1 = td_var_offset(bs_unaligned),
+ },
{
.name = NULL,
},
td->max_bs = td->bs;
if (td_read(td) && !td_rw(td))
td->verify = 0;
+
+ if (td->norandommap && td->verify != VERIFY_NONE) {
+ log_err("fio: norandommap given, verify disabled\n");
+ td->verify = VERIFY_NONE;
+ }
+ if (td->bs_unaligned && (td->odirect || td->io_ops->flags & FIO_RAWIO))
+ log_err("fio: bs_unaligned may not work with raw io\n");
}
/*
}
}
+ if (td->odirect)
+ td->io_ops->flags |= FIO_RAWIO;
+
fixup_options(td);
td->filetype = FIO_TYPE_FILE;
td->filetype = FIO_TYPE_CHAR;
}
- if (td->odirect)
- td->io_ops->flags |= FIO_RAWIO;
-
if (td->filename)
td->nr_uniq_files = 1;
else
if (td->rand_repeatable)
seeds[3] = DEF_RANDSEED;
- for_each_file(td, f, i) {
- blocks = (f->file_size + td->min_bs - 1) / td->min_bs;
- num_maps = blocks / BLOCKS_PER_MAP;
- f->file_map = malloc(num_maps * sizeof(long));
- f->num_maps = num_maps;
- memset(f->file_map, 0, num_maps * sizeof(long));
+ if (!td->norandommap) {
+ for_each_file(td, f, i) {
+ blocks = (f->file_size + td->min_bs - 1) / td->min_bs;
+ num_maps = blocks / BLOCKS_PER_MAP;
+ f->file_map = malloc(num_maps * sizeof(long));
+ f->num_maps = num_maps;
+ memset(f->file_map, 0, num_maps * sizeof(long));
+ }
}
os_random_seed(seeds[3], &td->random_state);
memset(name, 0, 256);
stonewall = stonewall_flag;
- while ((p = fgets(string, 4096, f)) != NULL) {
- if (ret)
+ do {
+ p = fgets(string, 4095, f);
+ if (!p)
break;
if (is_empty_or_comment(p))
continue;
while ((p = fgets(string, 4096, f)) != NULL) {
if (is_empty_or_comment(p))
continue;
- if (strstr(p, "["))
- break;
strip_blank_front(&p);
+
+ if (p[0] == '[')
+ break;
+
strip_blank_end(p);
fgetpos(f, &off);
* dump all the bad ones. Makes trial/error fixups
* easier on the user.
*/
- ret = parse_option(p, options, td);
+ ret |= parse_option(p, options, td);
}
if (!ret) {
fsetpos(f, &off);
ret = add_job(td, name, 0);
+ } else {
+ log_err("fio: job %s dropped\n", name);
+ put_job(td);
}
- if (ret)
- break;
- }
+ } while (!ret);
free(string);
free(name);
def_thread.unlink = DEF_UNLINK;
def_thread.write_bw_log = write_bw_log;
def_thread.write_lat_log = write_lat_log;
+ def_thread.norandommap = DEF_NO_RAND_MAP;
#ifdef FIO_HAVE_DISK_UTIL
def_thread.do_disk_util = 1;
#endif
return 0;
}
- parse_cmd_option(opt, val, options, td);
+ ret = parse_cmd_option(opt, val, options, td);
+ if (ret) {
+ log_err("fio: job dropped\n");
+ put_job(td);
+ td = NULL;
+ }
break;
}
default:
if (!thread_number) {
log_err("No jobs defined(s)\n");
- usage();
return 1;
}