Currently, fio checks the block offset number in a block's header during
the verify phase.
We add a check for the io number (numberio) to detect stale blocks. This
check is performed only on workloads that write data, as those workloads
know what numberio was written to each block.
td->io_issues[ddir] = 0; was removed so that numberio does not get reset
at each iteration; we want numberio to keep incrementing to reflect
how many times the same data was written.
Signed-off-by: Juan Casse <jcasse@chromium.org>
Reviewed-by: Grant Grundler <grundler@chromium.org>
Fixed typo.
Signed-off-by: Jens Axboe <axboe@kernel.dk>
*/
unsigned long buflen;
unsigned long long offset;
*/
unsigned long buflen;
unsigned long long offset;
+ unsigned short numberio;
ipo->file = io_u->file;
ipo->offset = io_u->offset;
ipo->len = io_u->buflen;
ipo->file = io_u->file;
ipo->offset = io_u->offset;
ipo->len = io_u->buflen;
+ ipo->numberio = io_u->numberio;
if (io_u_should_trim(td, io_u)) {
flist_add_tail(&ipo->trim_list, &td->trim_list);
if (io_u_should_trim(td, io_u)) {
flist_add_tail(&ipo->trim_list, &td->trim_list);
struct fio_file *file;
};
unsigned long long offset;
struct fio_file *file;
};
unsigned long long offset;
+ unsigned short numberio;
unsigned long len;
unsigned int flags;
enum fio_ddir ddir;
unsigned long len;
unsigned int flags;
enum fio_ddir ddir;
td->this_io_blocks[ddir] = 0;
td->rate_bytes[ddir] = 0;
td->rate_blocks[ddir] = 0;
td->this_io_blocks[ddir] = 0;
td->rate_bytes[ddir] = 0;
td->rate_blocks[ddir] = 0;
- td->io_issues[ddir] = 0;
if (td->o.verify_pattern_bytes)
ret |= verify_io_u_pattern(hdr, vc);
if (td->o.verify_pattern_bytes)
ret |= verify_io_u_pattern(hdr, vc);
+ /*
+ * For read-only workloads, the program cannot be certain of the
+ * last numberio written to a block. Checking of numberio will be done
+ * only for workloads that write data.
+ */
+ if (td_write(td) || td_rw(td))
+ if (vh->numberio != io_u->numberio)
+ ret = EILSEQ;
+
vh->time_sec = io_u->start_time.tv_sec;
vh->time_usec = io_u->start_time.tv_usec;
vh->time_sec = io_u->start_time.tv_sec;
vh->time_usec = io_u->start_time.tv_usec;
- vh->numberio = td->io_issues[DDIR_WRITE];
+ vh->numberio = io_u->numberio;
vh->offset = io_u->offset + header_num * td->o.verify_interval;
}
vh->offset = io_u->offset + header_num * td->o.verify_interval;
}
if (td->o.verify == VERIFY_NULL)
return;
if (td->o.verify == VERIFY_NULL)
return;
+ io_u->numberio = td->io_issues[io_u->ddir];
+
fill_pattern_headers(td, io_u, 0, 0);
}
fill_pattern_headers(td, io_u, 0, 0);
}
io_u->offset = ipo->offset;
io_u->buflen = ipo->len;
io_u->offset = ipo->offset;
io_u->buflen = ipo->len;
+ io_u->numberio = ipo->numberio;
io_u->file = ipo->file;
io_u->flags |= IO_U_F_VER_LIST;
io_u->file = ipo->file;
io_u->flags |= IO_U_F_VER_LIST;