When the experimental_verify option is specified, fio does not record normal I/O metadata to create verify read unit. Instead, fio resets file status after normal I/O and before verify start, then replay I/Os to regenerate write unit and adjust it to verify read. This I/O replay does not work for zonemode=zbd since zone status needs to be restored at verify start to the status before the normal I/O. However, such status restore moves write pointers and erases data pattern for verify. Check that the options experimental_verify and zonemode=zbd are not specified together and error out in case they are both specified. Also remove the helper function zbd_replay_write_order() which is called from zbd_adjust_block(). This function adjusts verify read unit to meet zone write restrictions for experimental verify, but such adjustment does not work because zone status is not restored before verify start. Signed-off-by: Shin'ichiro Kawasaki <shinichiro.kawasaki@xxxxxxx> Tested-by: Dmitry Fomichev <dmitry.fomichev@xxxxxxx> Reviewed-by: Dmitry Fomichev <dmitry.fomichev@xxxxxxx> --- zbd.c | 46 ++++++---------------------------------------- zbd.h | 2 -- 2 files changed, 6 insertions(+), 42 deletions(-) diff --git a/zbd.c b/zbd.c index 6faacdac..547c727f 100644 --- a/zbd.c +++ b/zbd.c @@ -291,7 +291,6 @@ static int zbd_reset_zone(struct thread_data *td, struct fio_file *f, pthread_mutex_unlock(&f->zbd_info->mutex); z->wp = z->start; - z->verify_block = 0; td->ts.nr_zone_resets++; @@ -1085,6 +1084,11 @@ int zbd_setup_files(struct thread_data *td) if (!zbd_verify_bs()) return 1; + if (td->o.experimental_verify) { + log_err("zonemode=zbd does not support experimental verify\n"); + return 1; + } + for_each_file(td, f, i) { struct zoned_block_device_info *zbd = f->zbd_info; struct fio_zone_info *z; @@ -1521,42 +1525,6 @@ out: return z; } -/* The caller must hold z->mutex. */ -static struct fio_zone_info *zbd_replay_write_order(struct thread_data *td, - struct io_u *io_u, - struct fio_zone_info *z) -{ - const struct fio_file *f = io_u->file; - const uint64_t min_bs = td->o.min_bs[DDIR_WRITE]; - - if (!zbd_open_zone(td, f, z)) { - zone_unlock(z); - z = zbd_convert_to_open_zone(td, io_u); - assert(z); - } - - if (z->verify_block * min_bs >= z->capacity) { - log_err("%s: %d * %"PRIu64" >= %"PRIu64"\n", - f->file_name, z->verify_block, min_bs, z->capacity); - /* - * If the assertion below fails during a test run, adding - * "--experimental_verify=1" to the command line may help. - */ - assert(false); - } - - io_u->offset = z->start + z->verify_block * min_bs; - if (io_u->offset + io_u->buflen >= zbd_zone_capacity_end(z)) { - log_err("%s: %llu + %llu >= %"PRIu64"\n", - f->file_name, io_u->offset, io_u->buflen, - zbd_zone_capacity_end(z)); - assert(false); - } - z->verify_block += io_u->buflen / min_bs; - - return z; -} - /* * Find another zone which has @min_bytes of readable data. Search in zones * @zb + 1 .. @zl. For random workload, also search in zones @zb - 1 .. @zf. @@ -1907,10 +1875,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 && td_write(td)) { - zb = zbd_replay_write_order(td, io_u, zb); + if (td->runstate == TD_VERIFYING && td_write(td)) goto accept; - } /* * Check that there is enough written data in the zone to do an diff --git a/zbd.h b/zbd.h index 0a73b41d..d425707e 100644 --- a/zbd.h +++ b/zbd.h @@ -25,7 +25,6 @@ enum io_u_action { * @start: zone start location (bytes) * @wp: zone write pointer location (bytes) * @capacity: maximum size usable from the start of a zone (bytes) - * @verify_block: number of blocks that have been verified for this zone * @mutex: protects the modifiable members in this structure * @type: zone type (BLK_ZONE_TYPE_*) * @cond: zone state (BLK_ZONE_COND_*) @@ -39,7 +38,6 @@ struct fio_zone_info { uint64_t start; uint64_t wp; uint64_t capacity; - uint32_t verify_block; enum zbd_zone_type type:2; enum zbd_zone_cond cond:4; unsigned int has_wp:1; -- 2.37.1