if (o->norandommap && o->verify != VERIFY_NONE
&& !fixed_block_size(o)) {
log_err("fio: norandommap given for variable block sizes, "
- "verify disabled\n");
- o->verify = VERIFY_NONE;
+ "verify limited\n");
ret = warnings_fatal;
}
if (o->bs_unaligned && (o->odirect || td->io_ops->flags & FIO_RAWIO))
ret = 1;
}
+ if (fio_option_is_set(o, gtod_cpu)) {
+ fio_gtod_init();
+ fio_gtod_set_cpu(o->gtod_cpu);
+ fio_gtod_offload = 1;
+ }
+
+ td->loops = o->loops;
+ if (!td->loops)
+ td->loops = 1;
+
+ if (td->o.block_error_hist && td->o.nr_files != 1) {
+ log_err("fio: block error histogram only available with "
+ "with a single file per job, but %d files "
+ "provided\n", td->o.nr_files);
+ ret = 1;
+ }
+
return ret;
}
if (o->refill_buffers)
td->flags |= TD_F_REFILL_BUFFERS;
/*
- * Scramble by default, but not if zero_buffer is true and has been
- * set. But if scramble_buffers has been set, always scramble.
+ * Always scramble buffers if asked to
*/
- if (o->scramble_buffers && ((!o->zero_buffers &&
- fio_option_is_set(o, zero_buffers)) ||
- fio_option_is_set(o, scramble_buffers)))
+ if (o->scramble_buffers && fio_option_is_set(o, scramble_buffers))
+ td->flags |= TD_F_SCRAMBLE_BUFFERS;
+ /*
+ * But also scramble buffers, unless we were explicitly asked
+ * to zero them.
+ */
+ if (o->scramble_buffers && !(o->zero_buffers &&
+ fio_option_is_set(o, zero_buffers)))
td->flags |= TD_F_SCRAMBLE_BUFFERS;
if (o->verify != VERIFY_NONE)
td->flags |= TD_F_VER_NONE;
+
+ if (o->verify_async || o->io_submit_mode == IO_MODE_OFFLOAD)
+ td->flags |= TD_F_NEED_LOCK;
}
static int setup_random_seeds(struct thread_data *td)
ret = snprintf(dst, dst_left, "%s", jobname);
if (ret < 0)
break;
- dst += ret;
- dst_left -= ret;
+ else if (ret > dst_left) {
+ log_err("fio: truncated filename\n");
+ dst += dst_left;
+ dst_left = 0;
+ } else {
+ dst += ret;
+ dst_left -= ret;
+ }
break;
}
case FPRE_JOBNUM: {
ret = snprintf(dst, dst_left, "%d", jobnum);
if (ret < 0)
break;
- dst += ret;
- dst_left -= ret;
+ else if (ret > dst_left) {
+ log_err("fio: truncated filename\n");
+ dst += dst_left;
+ dst_left = 0;
+ } else {
+ dst += ret;
+ dst_left -= ret;
+ }
break;
}
case FPRE_FILENUM: {
ret = snprintf(dst, dst_left, "%d", filenum);
if (ret < 0)
break;
- dst += ret;
- dst_left -= ret;
+ else if (ret > dst_left) {
+ log_err("fio: truncated filename\n");
+ dst += dst_left;
+ dst_left = 0;
+ } else {
+ dst += ret;
+ dst_left -= ret;
+ }
break;
}
default:
td = NULL;
}
do_exit++;
+ exit_val = 1;
break;
}
fio_options_set_ioengine_opts(l_opts, td);
td = NULL;
}
do_exit++;
+ exit_val = 1;
}
if (!ret && !strcmp(opt, "ioengine")) {
put_job(td);
td = NULL;
do_exit++;
+ exit_val = 1;
break;
}
fio_options_set_ioengine_opts(l_opts, td);
exit_val = 1;
break;
}
+ /* if --client parameter contains a pathname */
+ if (0 == access(optarg, R_OK)) {
+ /* file contains a list of host addrs or names */
+ char hostaddr[_POSIX_HOST_NAME_MAX] = {0};
+ char formatstr[8];
+ FILE * hostf = fopen(optarg, "r");
+ if (!hostf) {
+ log_err("fio: could not open client list file %s for read\n", optarg);
+ do_exit++;
+ exit_val = 1;
+ break;
+ }
+ sprintf(formatstr, "%%%ds", _POSIX_HOST_NAME_MAX-1);
+ /* read at most _POSIX_HOST_NAME_MAX-1 chars from each record in this file */
+ while (fscanf(hostf, formatstr, hostaddr) == 1) {
+ /* expect EVERY host in file to be valid */
+ if (fio_client_add(&fio_client_ops, hostaddr, &cur_client)) {
+ log_err("fio: failed adding client %s from file %s\n", hostaddr, optarg);
+ do_exit++;
+ exit_val = 1;
+ break;
+ }
+ }
+ fclose(hostf);
+ break; /* no possibility of job file for "this client only" */
+ }
if (fio_client_add(&fio_client_ops, optarg, &cur_client)) {
log_err("fio: failed adding client %s\n", optarg);
do_exit++;
case 'T':
did_arg = 1;
do_exit++;
- exit_val = fio_monotonic_clocktest();
+ exit_val = fio_monotonic_clocktest(1);
break;
case 'G':
did_arg = 1;
break;
}
case 'W':
+ if (trigger_file)
+ free(trigger_file);
trigger_file = strdup(optarg);
break;
case 'H':
+ if (trigger_cmd)
+ free(trigger_cmd);
trigger_cmd = strdup(optarg);
break;
case 'J':
+ if (trigger_remote_cmd)
+ free(trigger_remote_cmd);
trigger_remote_cmd = strdup(optarg);
break;
case 'B':
return 0;
}
- if (def_thread.o.gtod_offload) {
- fio_gtod_init();
- fio_gtod_offload = 1;
- fio_gtod_cpu = def_thread.o.gtod_cpu;
- }
-
if (output_format == FIO_OUTPUT_NORMAL)
log_info("%s\n", fio_version_string);