t/zbd: add test case to check zones in closed condition
authorShin'ichiro Kawasaki <shinichiro.kawasaki@wdc.com>
Wed, 19 Jul 2023 10:57:50 +0000 (19:57 +0900)
committerVincent Fu <vincent.fu@samsung.com>
Thu, 20 Jul 2023 13:52:37 +0000 (09:52 -0400)
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@wdc.com>
Link: https://lore.kernel.org/r/20230719105756.553146-8-shinichiro.kawasaki@wdc.com
Signed-off-by: Vincent Fu <vincent.fu@samsung.com>
t/zbd/test-zbd-support

index eed3d00d73cd305187f1b3a578fc38fd31e6e62f..6d44faf1ac1deb7859ff31b1c9afb34b2144aefb 100755 (executable)
@@ -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=()