* The main verify engine. Runs over the writes we previously submitted,
* reads the blocks back in, and checks the crc/md5 of the data.
*/
-static void do_verify(struct thread_data *td, uint64_t verify_bytes)
+static void do_verify(struct thread_data *td)
{
struct fio_file *f;
struct io_u *io_u;
int ret, min_events;
- uint64_t io_bytes;
unsigned int i;
dprint(FD_VERIFY, "starting loop\n");
td_set_runstate(td, TD_VERIFYING);
io_u = NULL;
- io_bytes = 0;
while (!td->terminate) {
enum fio_ddir ddir;
int ret2, full;
break;
}
} else {
- io_u = get_io_u(td);
- if (!io_u)
- break;
+ while ((io_u = get_io_u(td)) != NULL) {
+ /*
+ * We are only interested in the places where
+ * we wrote or trimmed IOs. Turn those into
+ * reads for verification purposes.
+ */
+ if (io_u->ddir == DDIR_READ) {
+ /*
+ * Pretend we issued it for rwmix
+ * accounting
+ */
+ td->io_issues[DDIR_READ]++;
+ put_io_u(td, io_u);
+ continue;
+ } else if (io_u->ddir == DDIR_TRIM) {
+ io_u->ddir = DDIR_READ;
+ io_u->flags |= IO_U_F_TRIMMED;
+ break;
+ } else if (io_u->ddir == DDIR_WRITE) {
+ io_u->ddir = DDIR_READ;
+ break;
+ } else {
+ put_io_u(td, io_u);
+ continue;
+ }
+ }
- if (io_u->buflen + io_bytes > verify_bytes)
+ if (!io_u)
break;
}
io_u->xfer_buflen = io_u->resid;
io_u->xfer_buf += bytes;
io_u->offset += bytes;
- io_bytes += bytes;
if (ddir_rw(io_u->ddir))
td->ts.short_io_u[io_u->ddir]++;
if (ret < 0)
break;
}
- io_bytes += io_u->xfer_buflen;
continue;
case FIO_Q_QUEUED:
break;
min_events = 1;
do {
- unsigned long bytes = 0;
-
/*
* Reap required number of io units, if any,
* and do the verification on them through
* the callback handler
*/
- if (io_u_queued_complete(td, min_events, &bytes) < 0) {
+ if (io_u_queued_complete(td, min_events, NULL) < 0) {
ret = -1;
break;
}
- io_bytes += bytes;
} while (full && (td->cur_depth > td->o.iodepth_low));
}
if (ret < 0)
clear_state = 0;
while (keep_running(td)) {
- uint64_t write_bytes;
-
fio_gettime(&td->start, NULL);
memcpy(&td->bw_sample_time, &td->start, sizeof(td->start));
memcpy(&td->iops_sample_time, &td->start, sizeof(td->start));
prune_io_piece_log(td);
- write_bytes = td->io_bytes[DDIR_WRITE];
do_io(td);
- write_bytes = td->io_bytes[DDIR_WRITE] - write_bytes;
clear_state = 1;
fio_gettime(&td->start, NULL);
- do_verify(td, write_bytes);
+ do_verify(td);
td->ts.runtime[DDIR_READ] += utime_since_now(&td->start);