From 0ed7d55e6610020c4642ddb246f6ce1ab697052d Mon Sep 17 00:00:00 2001 From: Aravind Ramesh Date: Thu, 13 Aug 2020 17:01:48 +0200 Subject: [PATCH] zbd: don't read past the WP on a read only workload with verify 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 Reviewed-by: Shin'ichiro Kawasaki Signed-off-by: Aravind Ramesh Signed-off-by: Niklas Cassel Signed-off-by: Jens Axboe --- zbd.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/zbd.c b/zbd.c index 5af8af4a..584d3640 100644 --- 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; } /* -- 2.25.1