Looks good to me. Reviewed-by: Chaitanya Kulkarni <chaitanya.kulkarni@xxxxxxx> On 5/30/19 6:59 PM, Shin'ichiro Kawasaki wrote: > Add the test case to check zones sector mapping of logical devices. This > test case requires that such a logical device be specified in TEST_DEVS > in config. The test is skipped for devices that are identified as not > logically created. > > To test that the zone mapping is correct, select a few sequential write > required zones of the logical device and move the write pointers of > these zones through the container device of the logical device, using > the physical sector mapping of the zones. The write pointers position of > the selected zones is then checked through a zone report of the logical > device using the logical sector mapping of the zones. The test reports a > success if the position of the zone write pointers relative to the zone > start sector must be identical for both the logical and physical > locations of the zones. > > Signed-off-by: Shin'ichiro Kawasaki <shinichiro.kawasaki@xxxxxxx> > --- > tests/zbd/007 | 110 ++++++++++++++++++++++++++++++++++++++++++++++ > tests/zbd/007.out | 2 + > 2 files changed, 112 insertions(+) > create mode 100755 tests/zbd/007 > create mode 100644 tests/zbd/007.out > > diff --git a/tests/zbd/007 b/tests/zbd/007 > new file mode 100755 > index 0000000..b4dcbd8 > --- /dev/null > +++ b/tests/zbd/007 > @@ -0,0 +1,110 @@ > +#!/bin/bash > +# SPDX-License-Identifier: GPL-3.0+ > +# Copyright (C) 2019 Western Digital Corporation or its affiliates. > +# > +# Test zones are mapped correctly between a logical device and its container > +# device. Move write pointers of sequential write required zones on the > +# container devices, and confirm same write pointer positions of zones on the > +# logical devices. > + > +. tests/zbd/rc > + > +DESCRIPTION="zone mapping between logical and container devices" > +CAN_BE_ZONED=1 > +QUICK=1 > + > +requires() { > + _have_program dmsetup > +} > + > +device_requires() { > + _test_dev_is_logical > +} > + > +# Select test target zones. Pick up the first sequential required zones. If > +# available, add one or two more sequential required zones. One is at the last > +# end of TEST_DEV. The other is in middle between the first and the last zones. > +select_zones() { > + local -i zone_idx > + local -a zones > + > + zone_idx=$(_find_first_sequential_zone) || return $? > + zones=( "${zone_idx}" ) > + if zone_idx=$(_find_last_sequential_zone); then > + zones+=( "${zone_idx}" ) > + if zone_idx=$(_find_sequential_zone_in_middle \ > + "${zones[0]}" "${zones[1]}"); then > + zones+=( "${zone_idx}" ) > + fi > + fi > + echo "${zones[@]}" > +} > + > +test_device() { > + local -i bs > + local -a test_z # test target zones > + local -a test_z_start > + > + echo "Running ${TEST_NAME}" > + > + # Get physical block size to meet zoned block device I/O requirement > + _get_sysfs_variable "${TEST_DEV}" || return $? > + bs=${SYSFS_VARS[SV_PHYS_BLK_SIZE]} > + _put_sysfs_variable > + > + # Get test target zones > + _get_blkzone_report "${TEST_DEV}" || return $? > + read -r -a test_z < <(select_zones) > + for ((i = 0; i < ${#test_z[@]}; i++)); do > + test_z_start+=("${ZONE_STARTS[test_z[i]]}") > + done > + echo "${test_z[*]}" >> "$FULL" > + echo "${test_z_start[*]}" >> "$FULL" > + _put_blkzone_report > + if ((!${#test_z[@]})); then > + echo "Test target zones not available on ${TEST_DEV}" > + return 1 > + fi > + > + # Reset and move write pointers of the container device > + for ((i=0; i < ${#test_z[@]}; i++)); do > + local -a arr > + > + read -r -a arr < <(_get_dev_container_and_sector \ > + "${test_z_start[i]}") > + container_dev="${arr[0]}" > + container_start="${arr[1]}" > + > + echo "${container_dev}" "${container_start}" >> "$FULL" > + > + if ! blkzone reset -o "${container_start}" -c 1 \ > + "${container_dev}"; then > + echo "Reset zone failed" > + return 1 > + fi > + > + if ! dd if=/dev/zero of="${container_dev}" bs="${bs}" \ > + count=$((4096 * (i + 1) / bs)) oflag=direct \ > + seek=$((container_start * 512 / bs)) \ > + >> "$FULL" 2>&1 ; then > + echo "dd failed" > + fi > + > + # Wait for partition table re-read event settles > + udevadm settle > + done > + > + # Check write pointer positions on the logical device > + _get_blkzone_report "${TEST_DEV}" || return $? > + for ((i=0; i < ${#test_z[@]}; i++)); do > + if ((ZONE_WPTRS[test_z[i]] != 8 * (i + 1))); then > + echo "Unexpected write pointer position" > + echo -n "zone=${i}, wp=${ZONE_WPTRS[i]}, " > + echo "dev=${TEST_DEV}" > + fi > + echo "${ZONE_WPTRS[${test_z[i]}]}" >> "$FULL" > + done > + _put_blkzone_report > + > + echo "Test complete" > +} > diff --git a/tests/zbd/007.out b/tests/zbd/007.out > new file mode 100644 > index 0000000..28a1395 > --- /dev/null > +++ b/tests/zbd/007.out > @@ -0,0 +1,2 @@ > +Running zbd/007 > +Test complete