zbd: don't read past the WP on a read only workload with verify
authorAravind Ramesh <aravind.ramesh@wdc.com>
Thu, 13 Aug 2020 15:01:48 +0000 (17:01 +0200)
committerJens Axboe <axboe@kernel.dk>
Thu, 27 Aug 2020 18:27:36 +0000 (12:27 -0600)
When running a read only workload with verify option enabled,
fio continues to read beyond the write pointer, and thus
reads a deallocated block, which contains data of a predefined
pattern, thus causing the verify to fail.

Thus, we cannot simply jump to accept for a read only workload
with verify option enabled, we must let the regular flow of
execution to continue, so that the check if offset > wp is
performed, so that we will return the address to a new zone,
rather than an address that is past the wp.

Reading past the wp is not a recent bug, it is possible to
reproduce this bug even before zone capacity was introduced.

However, with the introduction of zone capacity, filling a
zone now only writes up to zone capacity of a zone, making
it much easier to reproduce this bug.

Reviewed-by: Dmitry Fomichev <dmitry.fomichev@wdc.com>
Reviewed-by: Shin'ichiro Kawasaki <shinichiro.kawasaki@wdc.com>
Signed-off-by: Aravind Ramesh <aravind.ramesh@wdc.com>
Signed-off-by: Niklas Cassel <niklas.cassel@wdc.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
zbd.c

diff --git a/zbd.c b/zbd.c
index 5af8af4aafb7832b37a6ebc56f0f92f3cb371720..584d364023dd127ef8dfe9799da78fb355c8c620 100644 (file)
--- a/zbd.c
+++ b/zbd.c
@@ -1467,9 +1467,8 @@ enum io_u_action zbd_adjust_block(struct thread_data *td, struct io_u *io_u)
 
        switch (io_u->ddir) {
        case DDIR_READ:
-               if (td->runstate == TD_VERIFYING) {
-                       if (td_write(td))
-                               zb = zbd_replay_write_order(td, io_u, zb);
+               if (td->runstate == TD_VERIFYING && td_write(td)) {
+                       zb = zbd_replay_write_order(td, io_u, zb);
                        goto accept;
                }
                /*