return head->next == head;
}
+static inline void __flist_splice(const struct flist_head *list,
+ struct flist_head *prev,
+ struct flist_head *next)
+{
+ struct flist_head *first = list->next;
+ struct flist_head *last = list->prev;
+
+ first->prev = prev;
+ prev->next = first;
+
+ last->next = next;
+ next->prev = last;
+}
+
+static inline void flist_splice(const struct flist_head *list,
+ struct flist_head *head)
+{
+ if (!flist_empty(list))
+ __flist_splice(list, head, head->next);
+}
+
+static inline void flist_splice_init(struct flist_head *list,
+ struct flist_head *head)
+{
+ if (!flist_empty(list)) {
+ __flist_splice(list, head, head->next);
+ INIT_FLIST_HEAD(list);
+ }
+}
+
/**
* flist_entry - get the struct for this entry
* @ptr: the &struct flist_head pointer.
}
do {
+ FLIST_HEAD(list);
+
read_barrier();
if (td->verify_thread_exit)
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);
+ }
} while (!ret);
done: