break;
}
- td->io_u_map[index]++;
- td->total_io_u++;
+ td->ts->io_u_map[index]++;
+ td->ts->total_io_u++;
}
static void io_u_mark_latency(struct thread_data *td, unsigned long msec)
break;
}
- td->io_u_lat[index]++;
+ td->ts->io_u_lat[index]++;
}
/*
*/
static struct fio_file *get_next_file_rand(struct thread_data *td)
{
- long r = os_random_long(&td->next_file_state);
unsigned int fileno;
struct fio_file *f;
do {
+ long r = os_random_long(&td->next_file_state);
+
fileno = (unsigned int) ((double) (td->nr_files - 1) * r / (RAND_MAX + 1.0));
f = &td->files[fileno];
if (f->fd != -1)
return io_u;
}
+void io_u_log_error(struct thread_data *td, struct io_u *io_u)
+{
+ const char *msg[] = { "read", "write", "sync" };
+
+ log_err("fio: io_u error");
+
+ if (io_u->file)
+ log_err(" on file %s", io_u->file->file_name);
+
+ log_err(": %s\n", strerror(io_u->error));
+
+ log_err(" %s offset=%llu, buflen=%lu\n", msg[io_u->ddir], io_u->offset, io_u->xfer_buflen);
+
+ if (!td->error)
+ td_verror(td, io_u->error, "io_u error");
+}
+
static void io_completed(struct thread_data *td, struct io_u *io_u,
struct io_completion_data *icd)
{
if (ret && !icd->error)
icd->error = ret;
}
- } else
+ } else {
icd->error = io_u->error;
+ io_u_log_error(td, io_u);
+ }
}
static void init_icd(struct io_completion_data *icd, int nr)
if (!icd.error)
return icd.bytes_done[0] + icd.bytes_done[1];
+ td_verror(td, icd.error, "io_u_sync_complete");
return -1;
}
if (!icd.error)
return icd.bytes_done[0] + icd.bytes_done[1];
+ td_verror(td, icd.error, "io_u_queued_complete");
return -1;
}