Still need to put io_u on early exit
[fio.git] / fio.c
diff --git a/fio.c b/fio.c
index e4fec4f6e0202a041dfd4524f45570a0bdd074de..9594f80582266ce8a8a5794ea9c52fb02a6adb1d 100644 (file)
--- a/fio.c
+++ b/fio.c
@@ -149,7 +149,9 @@ static void cleanup_pending_aio(struct thread_data *td)
        /*
         * get immediately available events, if any
         */
        /*
         * get immediately available events, if any
         */
-       io_u_queued_complete(td, 0, NULL);
+       r = io_u_queued_complete(td, 0, NULL);
+       if (r < 0)
+               return;
 
        /*
         * now cancel remaining active events
 
        /*
         * now cancel remaining active events
@@ -165,7 +167,7 @@ static void cleanup_pending_aio(struct thread_data *td)
        }
 
        if (td->cur_depth)
        }
 
        if (td->cur_depth)
-               io_u_queued_complete(td, td->cur_depth, NULL);
+               r = io_u_queued_complete(td, td->cur_depth, NULL);
 }
 
 /*
 }
 
 /*
@@ -195,7 +197,7 @@ requeue:
                put_io_u(td, io_u);
                return 1;
        } else if (ret == FIO_Q_QUEUED) {
                put_io_u(td, io_u);
                return 1;
        } else if (ret == FIO_Q_QUEUED) {
-               if (io_u_queued_complete(td, 1, NULL))
+               if (io_u_queued_complete(td, 1, NULL) < 0)
                        return 1;
        } else if (ret == FIO_Q_COMPLETED) {
                if (io_u->error) {
                        return 1;
        } else if (ret == FIO_Q_COMPLETED) {
                if (io_u->error) {
@@ -203,7 +205,8 @@ requeue:
                        return 1;
                }
 
                        return 1;
                }
 
-               io_u_sync_complete(td, io_u, NULL);
+               if (io_u_sync_complete(td, io_u, NULL) < 0)
+                       return 1;
        } else if (ret == FIO_Q_BUSY) {
                if (td_io_commit(td))
                        return 1;
        } else if (ret == FIO_Q_BUSY) {
                if (td_io_commit(td))
                        return 1;
@@ -228,10 +231,15 @@ static void do_verify(struct thread_data *td)
         * read from disk.
         */
        for_each_file(td, f, i) {
         * read from disk.
         */
        for_each_file(td, f, i) {
-               fio_io_sync(td, f);
-               file_invalidate_cache(td, f);
+               if (fio_io_sync(td, f))
+                       break;
+               if (file_invalidate_cache(td, f))
+                       break;
        }
 
        }
 
+       if (td->error)
+               return;
+
        td_set_runstate(td, TD_VERIFYING);
 
        io_u = NULL;
        td_set_runstate(td, TD_VERIFYING);
 
        io_u = NULL;
@@ -240,15 +248,20 @@ static void do_verify(struct thread_data *td)
                if (!io_u)
                        break;
 
                if (!io_u)
                        break;
 
-               if (runtime_exceeded(td, &io_u->start_time))
+               if (runtime_exceeded(td, &io_u->start_time)) {
+                       put_io_u(td, io_u);
                        break;
                        break;
+               }
 
 
-               if (get_next_verify(td, io_u))
+               if (get_next_verify(td, io_u)) {
+                       put_io_u(td, io_u);
                        break;
                        break;
+               }
 
 
-               if (td_io_prep(td, io_u))
+               if (td_io_prep(td, io_u)) {
+                       put_io_u(td, io_u);
                        break;
                        break;
-
+               }
 requeue:
                ret = td_io_queue(td, io_u);
 
 requeue:
                ret = td_io_queue(td, io_u);
 
@@ -264,7 +277,7 @@ requeue:
                                goto requeue;
                        }
                        ret = io_u_sync_complete(td, io_u, verify_io_u);
                                goto requeue;
                        }
                        ret = io_u_sync_complete(td, io_u, verify_io_u);
-                       if (ret)
+                       if (ret < 0)
                                break;
                        continue;
                case FIO_Q_QUEUED:
                                break;
                        continue;
                case FIO_Q_QUEUED:
@@ -287,20 +300,21 @@ requeue:
                 * completed io_u's first.
                 */
                min_events = 0;
                 * completed io_u's first.
                 */
                min_events = 0;
-               if (queue_full(td) || ret == FIO_Q_BUSY)
+               if (queue_full(td) || ret == FIO_Q_BUSY) {
                        min_events = 1;
 
                        min_events = 1;
 
+                       if (td->cur_depth > td->iodepth_low)
+                               min_events = td->cur_depth - td->iodepth_low;
+               }
+
                /*
                 * Reap required number of io units, if any, and do the
                 * verification on them through the callback handler
                 */
                /*
                 * Reap required number of io units, if any, and do the
                 * verification on them through the callback handler
                 */
-               if (io_u_queued_complete(td, min_events, verify_io_u))
+               if (io_u_queued_complete(td, min_events, verify_io_u) < 0)
                        break;
        }
 
                        break;
        }
 
-       if (io_u)
-               put_io_u(td, io_u);
-
        if (td->cur_depth)
                cleanup_pending_aio(td);
 
        if (td->cur_depth)
                cleanup_pending_aio(td);
 
@@ -411,9 +425,13 @@ requeue:
                 */
                if (ret == FIO_Q_QUEUED || ret == FIO_Q_BUSY) {
                        min_evts = 0;
                 */
                if (ret == FIO_Q_QUEUED || ret == FIO_Q_BUSY) {
                        min_evts = 0;
-                       if (queue_full(td) || ret == FIO_Q_BUSY)
+                       if (queue_full(td) || ret == FIO_Q_BUSY) {
                                min_evts = 1;
 
                                min_evts = 1;
 
+                               if (td->cur_depth > td->iodepth_low)
+                                       min_evts = td->cur_depth - td->iodepth_low;
+                       }
+
                        fio_gettime(&comp_time, NULL);
                        bytes_done = io_u_queued_complete(td, min_evts, NULL);
                        if (bytes_done < 0)
                        fio_gettime(&comp_time, NULL);
                        bytes_done = io_u_queued_complete(td, min_evts, NULL);
                        if (bytes_done < 0)
@@ -753,7 +771,7 @@ err:
        close_ioengine(td);
        cleanup_io_u(td);
        td_set_runstate(td, TD_EXITED);
        close_ioengine(td);
        cleanup_io_u(td);
        td_set_runstate(td, TD_EXITED);
-       return (void *) td->error;
+       return (void *) (unsigned long) td->error;
 }
 
 /*
 }
 
 /*
@@ -776,7 +794,7 @@ static int fork_main(int shmid, int offset)
        td = data + offset * sizeof(struct thread_data);
        ret = thread_main(td);
        shmdt(data);
        td = data + offset * sizeof(struct thread_data);
        ret = thread_main(td);
        shmdt(data);
-       return (int) ret;
+       return (int) (unsigned long) ret;
 }
 
 /*
 }
 
 /*