}
do {
+ FLIST_HEAD(list);
+
read_barrier();
if (td->verify_thread_exit)
break;
while (flist_empty(&td->verify_list) &&
!td->verify_thread_exit) {
- ret = pthread_cond_wait(&td->verify_cond, &td->io_u_lock);
+ ret = pthread_cond_wait(&td->verify_cond,
+ &td->io_u_lock);
if (ret) {
pthread_mutex_unlock(&td->io_u_lock);
break;
}
}
- if (flist_empty(&td->verify_list)) {
- pthread_mutex_unlock(&td->io_u_lock);
+ flist_splice_init(&td->verify_list, &list);
+ pthread_mutex_unlock(&td->io_u_lock);
+
+ if (flist_empty(&list))
continue;
- }
- io_u = flist_entry(td->verify_list.next, struct io_u, list);
- flist_del_init(&io_u->list);
- pthread_mutex_unlock(&td->io_u_lock);
+ while (!flist_empty(&list)) {
+ io_u = flist_entry(list.next, struct io_u, list);
+ flist_del_init(&io_u->list);
- ret = verify_io_u(td, io_u);
- put_io_u(td, io_u);
+ ret = verify_io_u(td, io_u);
+ put_io_u(td, io_u);
+ if (!ret)
+ continue;
+ if (td->o.continue_on_error &&
+ td_non_fatal_error(ret)) {
+ update_error_count(td, ret);
+ td_clear_error(td);
+ ret = 0;
+ }
+ }
} while (!ret);
+ if (ret) {
+ td_verror(td, ret, "async_verify");
+ td->terminate = 1;
+ }
+
done:
pthread_mutex_lock(&td->io_u_lock);
td->nr_verify_threads--;
}
if (i != td->o.verify_async) {
+ log_err("fio: only %d verify threads started, exiting\n", i);
td->verify_thread_exit = 1;
write_barrier();
pthread_cond_broadcast(&td->verify_cond);