X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=fio.c;h=ce29c26b653ab8b5766231a35f33007f8a48cf04;hb=8a3220572e1016ea011bd9dcf61a5bfb731c1a43;hp=3f6a586b79143adcac8726c4a33697e9c6a63837;hpb=cc60438162ca9936f48ee1c59198ac1f8323a59d;p=fio.git diff --git a/fio.c b/fio.c index 3f6a586b..ce29c26b 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);