verify: fix numberio accounting of experimental verify
authorShin'ichiro Kawasaki <shinichiro.kawasaki@wdc.com>
Thu, 20 Oct 2022 06:38:52 +0000 (15:38 +0900)
committerVincent Fu <vincent.fu@samsung.com>
Mon, 24 Oct 2022 14:34:57 +0000 (10:34 -0400)
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@wdc.com>
Signed-off-by: Vincent Fu <vincent.fu@samsung.com>
backend.c
fio.h
verify.c

index 15c6e0b3c061897c3d86e1e91c49a7f946c3bc2d..ba954a6b64d4db8acb704d18a6cb1d58c7585447 100644 (file)
--- 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 0592a4c3dc38a26db237f1cd99278719e99eecbb..8da776403e1d1abb1f5482d69a9c61918dbfa635 100644 (file)
--- 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;
 
index 0e1e4639348547b86319c67a05349e161f17b7e0..d6a229cac3f1c9b9aa05cad38e9b623ccafabd2f 100644 (file)
--- 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);
 }