Linux kernel 5.9 introduced new sysfs attributes max_active_zones and
max_open_zones for zoned block devices. Max_open_zones is the limit of
number of zones in open status. Max_active_zones is the limit of number
of zones in open or closed status. Currently, the helper function
_test_dev_max_active_zones() checks only max_active_zones, but it is not
enough. When the device has max_open_zones, check for max_active_zones
can not avoid the errors for write operations.
To avoid the error, improve the function _test_dev_max_active_zones() to
check the limits both. Rename it to _test_dev_max_open_active_zones().
When one of the limits is available for the test target device, return
it. If both limits are available, return smaller limit.
Also modify block/004 and zbd/003 to call the renamed helper function
and update comment description.
Fixes: e6981bb2d9ce ("common/rc: Add _test_dev_max_active_zones() helper function")
Signed-off-by: Shin'ichiro Kawasaki <shinichiro.kawasaki@wdc.com>
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Reviewed-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
[[ -n ${TEST_DEV_PART_SYSFS} ]]
}
-_test_dev_max_active_zones() {
+# Return max open zones or max active zones of the test target device.
+# If the device has both, return smaller value.
+_test_dev_max_open_active_zones() {
+ local -i moz=0
+ local -i maz=0
+
+ if [[ -r "${TEST_DEV_SYSFS}/queue/max_open_zones" ]]; then
+ moz=$(_test_dev_queue_get max_open_zones)
+ fi
+
if [[ -r "${TEST_DEV_SYSFS}/queue/max_active_zones" ]]; then
- _test_dev_queue_get max_active_zones
+ maz=$(_test_dev_queue_get max_active_zones)
+ fi
+
+ if ((!moz)) || ((maz && maz < moz)); then
+ echo "${maz}"
else
- echo 0
+ echo "${moz}"
fi
}
if _test_dev_is_zoned; then
_test_dev_queue_set scheduler deadline
opts+=("--direct=1" "--zonemode=zbd")
- opts+=("--max_open_zones=$(_test_dev_max_active_zones)")
+ opts+=("--max_open_zones=$(_test_dev_max_open_active_zones)")
fi
FIO_PERF_FIELDS=("write iops")
echo "Running ${TEST_NAME}"
- # When the test device has max_active_zone limit, reset all zones. This
- # ensures the write operations in this test case do not open zones
+ # When the test device has max_open/active_zones limit, reset all zones.
+ # This ensures the write operations in this test case do not open zones
# beyond the limit.
- (($(_test_dev_max_active_zones))) && blkzone reset "${TEST_DEV}"
+ (($(_test_dev_max_open_active_zones))) && blkzone reset "${TEST_DEV}"
# Get physical block size as dd block size to meet zoned block device
# requirement