#include <unistd.h>
#include <fcntl.h>
#include <string.h>
+#include <assert.h>
#include "fio.h"
-#include "os.h"
static void fill_random_bytes(struct thread_data *td,
unsigned char *p, unsigned int len)
int get_next_verify(struct thread_data *td, struct io_u *io_u)
{
- struct io_piece *ipo;
- struct rb_node *n;
+ struct io_piece *ipo = NULL;
/*
* this io_u is from a requeue, we already filled the offsets
if (io_u->file)
return 0;
- n = rb_first(&td->io_hist_tree);
- if (n) {
- ipo = rb_entry(n, struct io_piece, rb_node);
+ if (!RB_EMPTY_ROOT(&td->io_hist_tree)) {
+ struct rb_node *n = rb_first(&td->io_hist_tree);
+ ipo = rb_entry(n, struct io_piece, rb_node);
rb_erase(n, &td->io_hist_tree);
+ } else if (!list_empty(&td->io_hist_list)) {
+ ipo = list_entry(td->io_hist_list.next, struct io_piece, list);
+ list_del(&ipo->list);
+ }
+ if (ipo) {
io_u->offset = ipo->offset;
io_u->buflen = ipo->len;
io_u->file = ipo->file;
+
+ if ((io_u->file->flags & FIO_FILE_OPEN) == 0) {
+ int r = td_io_open_file(td, io_u->file);
+
+ if (r)
+ return 1;
+ }
+
+ get_file(ipo->file);
+ assert(io_u->file->flags & FIO_FILE_OPEN);
io_u->ddir = DDIR_READ;
io_u->xfer_buf = io_u->buf;
io_u->xfer_buflen = io_u->buflen;