As for non-experimental verify, numberio is compared between the numbers saved in metadata and written data header. As for experimental verify, the metadata is not available. Instead of numberio in metadata, it refers td->io_issues[] as the numberio value for the comparison. However, td->io_issues[] is used not only for verify reads but also for normal I/Os. It results in comparison with wrong numberio value and verification failure. Fix this issue by adding a new field td->verify_read_issues which counts up number of verify reads. Substitute td->verify_read_issues to io_u->numberio to refer it for the comparison in experimental verify path. Also move td->io_issues[] substitution to io_u->numberio out of populate_verify_io_u() to keep same behavior in non-experimental verify path. Signed-off-by: Shin'ichiro Kawasaki <shinichiro.kawasaki@xxxxxxx> --- backend.c | 6 +++++- fio.h | 1 + verify.c | 2 -- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/backend.c b/backend.c index 15c6e0b3..ba954a6b 100644 --- a/backend.c +++ b/backend.c @@ -711,6 +711,8 @@ static void do_verify(struct thread_data *td, uint64_t verify_bytes) break; } else if (io_u->ddir == DDIR_WRITE) { io_u->ddir = DDIR_READ; + io_u->numberio = td->verify_read_issues; + td->verify_read_issues++; populate_verify_io_u(td, io_u); break; } else { @@ -1030,8 +1032,10 @@ static void do_io(struct thread_data *td, uint64_t *bytes_done) break; } - if (io_u->ddir == DDIR_WRITE && td->flags & TD_F_DO_VERIFY) + if (io_u->ddir == DDIR_WRITE && td->flags & TD_F_DO_VERIFY) { + io_u->numberio = td->io_issues[io_u->ddir]; populate_verify_io_u(td, io_u); + } ddir = io_u->ddir; diff --git a/fio.h b/fio.h index 0592a4c3..8da77640 100644 --- a/fio.h +++ b/fio.h @@ -356,6 +356,7 @@ struct thread_data { * Issue side */ uint64_t io_issues[DDIR_RWDIR_CNT]; + uint64_t verify_read_issues; uint64_t io_issue_bytes[DDIR_RWDIR_CNT]; uint64_t loops; diff --git a/verify.c b/verify.c index 0e1e4639..d6a229ca 100644 --- a/verify.c +++ b/verify.c @@ -1287,8 +1287,6 @@ void populate_verify_io_u(struct thread_data *td, struct io_u *io_u) if (td->o.verify == VERIFY_NULL) return; - io_u->numberio = td->io_issues[io_u->ddir]; - fill_pattern_headers(td, io_u, 0, 0); } -- 2.37.1