Spdk/test/setup/devices.sh
Michal Berger 9af7c30e8f scripts/setup: Skip devices which have any valid data present
This is done to make sure we don't miss more complex setups where
target devices are not mounted but still hold some valid data that
shouldn't be touched in any way.

Also, adjust function names so they clearly indicate what is being
checked.

Signed-off-by: Michal Berger <michallinuxstuff@gmail.com>
Change-Id: Ibb0f1f21de68009a2f8f1faf4595a07ae527da35
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/11111
Reviewed-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Mellanox Build Bot
Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com>
2022-04-06 07:21:17 +00:00

209 lines
4.4 KiB
Bash
Executable File

#!/usr/bin/env bash
testdir=$(readlink -f "$(dirname "$0")")
rootdir=$(readlink -f "$testdir/../../")
source "$testdir/common.sh"
shopt -s nullglob
cleanup() {
cleanup_nvme
cleanup_dm
if [[ -b /dev/$test_disk ]]; then
wipefs --all "/dev/$test_disk"
fi
}
cleanup_nvme() {
if mountpoint -q "$nvme_mount"; then
umount "$nvme_mount"
fi
if [[ -b /dev/$nvme_disk_p ]]; then
wipefs --all "/dev/$nvme_disk_p"
fi
if [[ -b /dev/$nvme_disk ]]; then
wipefs --all "/dev/$nvme_disk"
fi
}
cleanup_dm() {
if mountpoint -q "$dm_mount"; then
umount "$dm_mount"
fi
if [[ -L /dev/mapper/$dm_name ]]; then
dmsetup remove --force "$dm_name"
fi
if [[ -b /dev/$pv0 ]]; then
wipefs --all "/dev/$pv0"
fi
if [[ -b /dev/$pv1 ]]; then
wipefs --all "/dev/$pv1"
fi
}
verify() {
local dev=$1
local mounts=$2
local mount_point=$3
local test_file=$4
local found=0
if [[ -n $test_file ]]; then
: > "$test_file"
fi
local pci status
while read -r pci _ _ status; do
if [[ $pci == "$dev" && \
$status == *"Active devices: "*"$mounts"* ]]; then
found=1
fi
done < <(PCI_ALLOWED="$dev" setup output config)
((found == 1))
[[ -n $mount_point ]] || return 0
# Does the mount still exist?
mountpoint -q "$mount_point"
# Does the test file still exist?
[[ -e $test_file ]]
rm "$test_file"
}
nvme_mount() {
# Agenda 1:
# - Create single partition on the nvme drive
# - Install ext4 fs on the first partition
# - Mount the partition
# - Run tests and check if setup.sh skipped
# nvme controller given block device is
# bound to.
# Agenda 2:
# - Install ext4 on the entire nvme drive
# - Mount the drive
# Run tests and check if setup.sh skipped
# nvme controller given block device is
# bound to.
# Keep scope of all the variables global to make the cleanup process easier.
nvme_disk=$test_disk
nvme_disk_p=${nvme_disk}p1
nvme_mount=$SPDK_TEST_STORAGE/nvme_mount
nvme_dummy_test_file=$nvme_mount/test_nvme
# Agenda 1
partition_drive "$nvme_disk" 1
mkfs "/dev/$nvme_disk_p" "$nvme_mount"
verify \
"${blocks_to_pci["$nvme_disk"]}" \
"$nvme_disk:$nvme_disk_p" \
"$nvme_mount" \
"$nvme_dummy_test_file"
cleanup_nvme
# Agenda 2
mkfs "/dev/$nvme_disk" "$nvme_mount" 1024M
verify \
"${blocks_to_pci["$nvme_disk"]}" \
"$nvme_disk:$nvme_disk" \
"$nvme_mount" \
"$nvme_dummy_test_file"
# umount the nvme device and verify again - device should not be touched
# when a valid fs is still present.
umount "$nvme_mount"
verify "${blocks_to_pci["$nvme_disk"]}" "data@$nvme_disk" "" ""
# All done, final cleanup
cleanup_nvme
}
dm_mount() {
# Agenda:
# - Create two partitions on the nvme drive
# - Create dm device consisting of half of
# the size of each partition.
# - Install ext4 fs on the dm device
# - Mount dm device
# - Run tests and check if setup.sh skipped
# nvme controller given block devices are
# bound to.
# Keep scope of all the variables global to make the cleanup process easier.
pv=$test_disk
pv0=${pv}p1
pv1=${pv}p2
partition_drive "$pv"
dm_name=nvme_dm_test
dm_mount=$SPDK_TEST_STORAGE/dm_mount
dm_dummy_test_file=$dm_mount/test_dm
# Each partition is 1G in size, join their halfs
dmsetup create "$dm_name" <<- DM_TABLE
0 1048576 linear /dev/$pv0 0
1048576 1048576 linear /dev/$pv1 0
DM_TABLE
[[ -e /dev/mapper/$dm_name ]]
dm=$(readlink -f "/dev/mapper/$dm_name")
dm=${dm##*/}
[[ -e /sys/class/block/$pv0/holders/$dm ]]
[[ -e /sys/class/block/$pv1/holders/$dm ]]
mkfs "/dev/mapper/$dm_name" "$dm_mount"
verify \
"${blocks_to_pci["$pv"]}" \
"$pv:$dm_name" \
"$dm_mount" \
"$dm_dummy_test_file"
# umount the dm device and verify again - device should not be
# touched when it's actively being hold, regardless if it's mounted
# or not.
umount "$dm_mount"
verify "${blocks_to_pci["$pv"]}" "holder@$pv0:$dm,holder@$pv1:$dm" "" ""
# All done, start tiding up
cleanup_dm
}
trap "cleanup" EXIT
setup reset
get_zoned_devs
declare -a blocks=()
declare -A blocks_to_pci=()
min_disk_size=$((1024 ** 3 * 2)) # 2GB
for block in "/sys/block/nvme"*; do
pci=$(readlink -f "$block/device/device")
pci=${pci##*/}
[[ ${zoned_devs[*]} == *"$pci"* ]] && continue
if ! block_in_use "${block##*/}" && (($(sec_size_to_bytes "${block##*/}") >= min_disk_size)); then
blocks+=("${block##*/}")
blocks_to_pci["${block##*/}"]=$pci
fi
done
((${#blocks[@]} > 0))
declare -r test_disk=${blocks[0]}
run_test "nvme_mount" nvme_mount
run_test "dm_mount" dm_mount