When the zoned block device has max_active_zones limit, the zones in open or closed condition consume resource on the device. If the number of zones in open or closed condition gets larger than the max_active_zones limit, the device reports an error. Until the recent fix ("zbd: write to closed zones on the devices with max_active_zones limit"), fio handled only zones in open condition as write target then fio was not able to avoid the error. Add a test which confirms that the fix avoids the error by handling zones in closed condition as write target. This test case requires the device has max_active_zones limit. Prepare zones in closed condition as many as the max_active_zones limit. Do random write and check no error. Signed-off-by: Shin'ichiro Kawasaki <shinichiro.kawasaki@xxxxxxx> --- t/zbd/test-zbd-support | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/t/zbd/test-zbd-support b/t/zbd/test-zbd-support index eed3d00d..6d44faf1 100755 --- a/t/zbd/test-zbd-support +++ b/t/zbd/test-zbd-support @@ -1427,6 +1427,43 @@ test65() { check_written $((zone_size + capacity)) } +# Test closed zones are handled as open zones. This test case requires zoned +# block devices which has same max_open_zones and max_active_zones. +test66() { + local i off + + require_zbd || return $SKIP_TESTCASE + require_max_active_zones 2 || return $SKIP_TESTCASE + require_max_open_zones "${max_active_zones}" || return $SKIP_TESTCASE + require_seq_zones $((max_active_zones * 16)) || return $SKIP_TESTCASE + + reset_zone "$dev" -1 + + # Prepare max_active_zones in closed condition. + off=$((first_sequential_zone_sector * 512)) + run_fio --name=w --filename="$dev" --zonemod=zbd --direct=1 \ + --offset=$((off)) --zonesize="${zone_size}" --rw=randwrite \ + --bs=4096 --size="$((zone_size * max_active_zones))" \ + --io_size="${zone_size}" "$(ioengine "psync")" \ + >> "${logfile}.${test_number}" 2>&1 || return $? + for ((i = 0; i < max_active_zones; i++)); do + close_zone "$dev" $((off / 512)) || return $? + off=$((off + zone_size)) + done + + # Run random write to the closed zones and empty zones. This confirms + # that fio handles closed zones as write target open zones. Otherwise, + # fio writes to the empty zones and hit the max_active_zones limit. + off=$((first_sequential_zone_sector * 512)) + run_one_fio_job --zonemod=zbd --direct=1 \ + "$(ioengine "psync")" --rw=randwrite --bs=4096 \ + --max_open_zones="$max_active_zones" --offset=$((off)) \ + --size=$((max_active_zones * 16 * zone_size)) \ + --io_size=$((zone_size)) --zonesize="${zone_size}" \ + --time_based --runtime=5s \ + >> "${logfile}.${test_number}" 2>&1 +} + SECONDS=0 tests=() dynamic_analyzer=() -- 2.40.1