Merge branch 'master' of ssh://router/data/git/fio
[fio.git] / verify.c
index 5dd9ee339b3858ebe630c67ad4c11e80248b683f..10bad7e2bab5f65c8b9168333a5f2567e40d19e1 100644 (file)
--- a/verify.c
+++ b/verify.c
@@ -478,6 +478,12 @@ int verify_io_u(struct thread_data *td, struct io_u *io_u)
                                                  p + hdr_size,
                                                  hdr_inc - hdr_size,
                                                  hdr_size % 4);
+                       /*
+                        * Also verify the meta data, if applicable
+                        */
+                       if (hdr->verify_type == VERIFY_META)
+                               ret |= verify_io_u_meta(hdr, td, io_u, hdr_num);
+
                        if (ret)
                                log_err("fio: verify failed at %llu/%u\n",
                                        io_u->offset + hdr_num * hdr->len,
@@ -756,6 +762,8 @@ static void *verify_async_thread(void *data)
        }
 
        do {
+               FLIST_HEAD(list);
+
                read_barrier();
                if (td->verify_thread_exit)
                        break;
@@ -764,26 +772,42 @@ static void *verify_async_thread(void *data)
 
                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--;
@@ -818,6 +842,7 @@ int verify_async_init(struct thread_data *td)
        }
 
        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);