X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=fio.c;h=9594f80582266ce8a8a5794ea9c52fb02a6adb1d;hp=e4fec4f6e0202a041dfd4524f45570a0bdd074de;hb=069c29183fb55f467ba841959ba6731f3e4f2132;hpb=079ad09b1ef22fa0d47c2cd2673908c5619aa41a diff --git a/fio.c b/fio.c index e4fec4f6..9594f805 100644 --- 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 */ - io_u_queued_complete(td, 0, NULL); + r = io_u_queued_complete(td, 0, NULL); + if (r < 0) + return; /* * now cancel remaining active events @@ -165,7 +167,7 @@ static void cleanup_pending_aio(struct thread_data *td) } 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) { - 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) { @@ -203,7 +205,8 @@ requeue: 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; @@ -228,10 +231,15 @@ static void do_verify(struct thread_data *td) * 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; @@ -240,15 +248,20 @@ static void do_verify(struct thread_data *td) 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; + } - if (get_next_verify(td, io_u)) + if (get_next_verify(td, io_u)) { + put_io_u(td, io_u); break; + } - if (td_io_prep(td, io_u)) + if (td_io_prep(td, io_u)) { + put_io_u(td, io_u); break; - + } 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); - if (ret) + if (ret < 0) break; continue; case FIO_Q_QUEUED: @@ -287,20 +300,21 @@ requeue: * 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; + 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 */ - if (io_u_queued_complete(td, min_events, verify_io_u)) + if (io_u_queued_complete(td, min_events, verify_io_u) < 0) break; } - if (io_u) - put_io_u(td, io_u); - 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 (queue_full(td) || ret == FIO_Q_BUSY) + if (queue_full(td) || ret == FIO_Q_BUSY) { 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) @@ -753,7 +771,7 @@ err: 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); - return (int) ret; + return (int) (unsigned long) ret; } /*