X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=fio.c;h=77e5572ba02aa1bf8129f80f3825d8cf962b229b;hp=3a537943b8b428da272e3d94bc9d8ccc22ee7c5d;hb=9b9860651274cfb6e5a367b653e0d465bd89344f;hpb=11e950bd785d9f03b7d35a8ee4b4704256217504 diff --git a/fio.c b/fio.c index 3a537943..77e5572b 100644 --- a/fio.c +++ b/fio.c @@ -452,21 +452,22 @@ static inline void update_tv_cache(struct thread_data *td) __update_tv_cache(td); } -static int break_on_this_error(struct thread_data *td, int *retptr) +static int break_on_this_error(struct thread_data *td, enum fio_ddir ddir, + int *retptr) { int ret = *retptr; if (ret < 0 || td->error) { int err; - if (!td->o.continue_on_error) - return 1; - if (ret < 0) err = -ret; else err = td->error; + if (!(td->o.continue_on_error & td_error_type(ddir, err))) + return 1; + if (td_non_fatal_error(err)) { /* * Continue with the I/Os in case of @@ -612,7 +613,7 @@ sync_done: break; } - if (break_on_this_error(td, &ret)) + if (break_on_this_error(td, io_u->ddir, &ret)) break; /* @@ -678,6 +679,7 @@ static void do_io(struct thread_data *td) int min_evts = 0; struct io_u *io_u; int ret2, full; + enum fio_ddir ddir; if (td->terminate) break; @@ -696,6 +698,8 @@ static void do_io(struct thread_data *td) if (!io_u) break; + ddir = io_u->ddir; + /* * Add verification end_io handler, if asked to verify * a previously written file. @@ -774,7 +778,7 @@ sync_done: break; } - if (break_on_this_error(td, &ret)) + if (break_on_this_error(td, ddir, &ret)) break; /* @@ -833,7 +837,7 @@ sync_done: } if (td->trim_entries) - printf("trim entries %ld\n", td->trim_entries); + log_err("fio: %d trim entries leaked?\n", td->trim_entries); if (td->o.fill_device && td->error == ENOSPC) { td->error = 0; @@ -936,7 +940,7 @@ static int init_io_u(struct thread_data *td) dprint(FD_MEM, "io_u alloc %p, index %u\n", io_u, i); if (!(td->io_ops->flags & FIO_NOIO)) { - io_u->buf = p + max_bs * i; + io_u->buf = p; dprint(FD_MEM, "io_u %p, mem %p\n", io_u, io_u->buf); if (td_write(td)) @@ -953,6 +957,7 @@ static int init_io_u(struct thread_data *td) io_u->index = i; io_u->flags = IO_U_F_FREE; flist_add(&io_u->list, &td->io_u_freelist); + p += max_bs; } return 0; @@ -1243,9 +1248,12 @@ static void *thread_main(void *data) memcpy(&td->iops_sample_time, &td->start, sizeof(td->start)); memcpy(&td->tv_cache, &td->start, sizeof(td->start)); - if (td->o.ratemin[0] || td->o.ratemin[1]) - memcpy(&td->lastrate, &td->bw_sample_time, - sizeof(td->lastrate)); + if (td->o.ratemin[0] || td->o.ratemin[1]) { + memcpy(&td->lastrate[0], &td->bw_sample_time, + sizeof(td->bw_sample_time)); + memcpy(&td->lastrate[1], &td->bw_sample_time, + sizeof(td->bw_sample_time)); + } if (clear_state) clear_io_state(td); @@ -1560,7 +1568,7 @@ static void run_threads(void) nr_thread > 1 ? "s" : ""); if (nr_process) { if (nr_thread) - printf(" and "); + log_info(" and "); log_info("%d process%s", nr_process, nr_process > 1 ? "es" : ""); } @@ -1789,8 +1797,8 @@ int exec_run(void) return 0; if (write_bw_log) { - setup_log(&agg_io_log[DDIR_READ]); - setup_log(&agg_io_log[DDIR_WRITE]); + setup_log(&agg_io_log[DDIR_READ], 0); + setup_log(&agg_io_log[DDIR_WRITE], 0); } startup_mutex = fio_mutex_init(0);