smalloc: move to size_t for allocations
[fio.git] / io_u.c
diff --git a/io_u.c b/io_u.c
index db0a6dc50d2d509c5445e5cde26899628ea03e1d..b049b61853fdfbd305ad01d857046be88dc68671 100644 (file)
--- a/io_u.c
+++ b/io_u.c
@@ -1096,7 +1096,7 @@ again:
 
                io_u->error = 0;
                flist_del(&io_u->list);
-               flist_add(&io_u->list, &td->io_u_busylist);
+               flist_add_tail(&io_u->list, &td->io_u_busylist);
                td->cur_depth++;
                io_u->flags |= IO_U_F_IN_CUR_DEPTH;
        } else if (td->o.verify_async) {
@@ -1290,10 +1290,12 @@ err_put:
 
 void io_u_log_error(struct thread_data *td, struct io_u *io_u)
 {
+       enum error_type_bit eb = td_error_type(io_u->ddir, io_u->error);
        const char *msg[] = { "read", "write", "sync", "datasync",
                                "sync_file_range", "wait", "trim" };
 
-
+       if (td_non_fatal_error(td, eb, io_u->error) && !td->o.error_dump)
+               return;
 
        log_err("fio: io_u error");
 
@@ -1323,6 +1325,13 @@ static void account_io_completion(struct thread_data *td, struct io_u *io_u,
 
                tusec = utime_since(&io_u->start_time, &icd->time);
                add_lat_sample(td, idx, tusec, bytes);
+
+               if (td->o.max_latency && tusec > td->o.max_latency) {
+                       if (!td->error)
+                               log_err("fio: latency of %lu usec exceeds specified max (%u usec)\n", tusec, td->o.max_latency);
+                       td_verror(td, ETIME, "max latency exceeded");
+                       icd->error = ETIME;
+               }
        }
 
        if (!td->o.disable_clat) {
@@ -1432,8 +1441,10 @@ static void io_completed(struct thread_data *td, struct io_u *io_u,
                icd->error = io_u->error;
                io_u_log_error(td, io_u);
        }
-       if (icd->error && td_non_fatal_error(icd->error) &&
-           (td->o.continue_on_error & td_error_type(io_u->ddir, icd->error))) {
+       if (icd->error) {
+               enum error_type_bit eb = td_error_type(io_u->ddir, icd->error);
+               if (!td_non_fatal_error(td, eb, icd->error))
+                       return;
                /*
                 * If there is a non_fatal error, then add to the error count
                 * and clear all the errors.