return 0;
}
-static void clear_io_state(struct thread_data *td)
+static int clear_io_state(struct thread_data *td)
{
struct fio_file *f;
- int i;
+ int i, ret;
- td->ts->stat_io_bytes[0] = td->ts->stat_io_bytes[1] = 0;
+ td->ts.stat_io_bytes[0] = td->ts.stat_io_bytes[1] = 0;
td->this_io_bytes[0] = td->this_io_bytes[1] = 0;
td->zone_bytes = 0;
td->last_was_sync = 0;
- for_each_file(td, f, i) {
- f->last_completed_pos = 0;
-
- f->last_pos = 0;
- if (td->io_ops->flags & FIO_SYNCIO)
- lseek(f->fd, SEEK_SET, 0);
+ for_each_file(td, f, i)
+ td_io_close_file(td, f);
- if (f->file_map)
- memset(f->file_map, 0, f->num_maps * sizeof(long));
+ ret = 0;
+ for_each_file(td, f, i) {
+ ret = td_io_open_file(td, f);
+ if (ret)
+ break;
}
+
+ return ret;
}
/*
{
unsigned long long runtime[2];
struct thread_data *td = data;
+ int clear_state;
if (!td->use_thread)
setsid();
if (!td->create_serialize && setup_files(td))
goto err;
- if (open_files(td))
- goto err;
- /*
- * Do this late, as some IO engines would like to have the
- * files setup prior to initializing structures.
- */
if (td_io_init(td))
goto err;
+ if (open_files(td))
+ goto err;
+
if (td->exec_prerun) {
if (system(td->exec_prerun) < 0)
goto err;
fio_gettime(&td->epoch, NULL);
memcpy(&td->timeout_end, &td->epoch, sizeof(td->epoch));
- getrusage(RUSAGE_SELF, &td->ts->ru_start);
+ getrusage(RUSAGE_SELF, &td->ts.ru_start);
runtime[0] = runtime[1] = 0;
+ clear_state = 0;
while (td->loops--) {
fio_gettime(&td->start, NULL);
- memcpy(&td->ts->stat_sample_time, &td->start, sizeof(td->start));
+ memcpy(&td->ts.stat_sample_time, &td->start, sizeof(td->start));
if (td->ratemin)
- memcpy(&td->lastrate, &td->ts->stat_sample_time, sizeof(td->lastrate));
+ memcpy(&td->lastrate, &td->ts.stat_sample_time, sizeof(td->lastrate));
+
+ if (clear_state && clear_io_state(td))
+ break;
- clear_io_state(td);
prune_io_piece_log(td);
if (td->io_ops->flags & FIO_CPUIO)
else
do_io(td);
+ clear_state = 1;
+
if (td_read(td) && td->io_bytes[DDIR_READ])
runtime[DDIR_READ] += utime_since_now(&td->start);
if (td_write(td) && td->io_bytes[DDIR_WRITE])
if (td->verify == VERIFY_NONE)
continue;
- clear_io_state(td);
+ if (clear_io_state(td))
+ break;
+
fio_gettime(&td->start, NULL);
do_verify(td);
}
update_rusage_stat(td);
- fio_gettime(&td->end_time, NULL);
- td->runtime[0] = runtime[0] / 1000;
- td->runtime[1] = runtime[1] / 1000;
-
- if (td->ts->bw_log)
- finish_log(td, td->ts->bw_log, "bw");
- if (td->ts->slat_log)
- finish_log(td, td->ts->slat_log, "slat");
- if (td->ts->clat_log)
- finish_log(td, td->ts->clat_log, "clat");
+ td->ts.runtime[0] = runtime[0] / 1000;
+ td->ts.runtime[1] = runtime[1] / 1000;
+ td->ts.total_run_time = mtime_since_now(&td->epoch);
+ td->ts.io_bytes[0] = td->io_bytes[0];
+ td->ts.io_bytes[1] = td->io_bytes[1];
+
+ if (td->ts.bw_log)
+ finish_log(td, td->ts.bw_log, "bw");
+ if (td->ts.slat_log)
+ finish_log(td, td->ts.slat_log, "slat");
+ if (td->ts.clat_log)
+ finish_log(td, td->ts.clat_log, "clat");
if (td->write_iolog_file)
write_iolog_close(td);
if (td->exec_postrun) {