It seems some versions of blkid report improper atari as an installed partition table on devices filled with random data. Ignore that case for now so the tests are able to find usuable nvme device. Signed-off-by: Michal Berger <michalx.berger@intel.com> Change-Id: If6604ddf7099d3a98cfa36caab1e806d5f931886 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/9143 Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com> Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Paul Luse <paul.e.luse@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com> Reviewed-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com>
202 lines
4.4 KiB
Bash
Executable File
202 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
|
|
|
|
: > "$test_file"
|
|
|
|
local pci status
|
|
while read -r pci _ _ status; do
|
|
if [[ $pci == "$dev" && \
|
|
$status == *"Active mountpoints on $mounts"* ]]; then
|
|
found=1
|
|
fi
|
|
done < <(PCI_ALLOWED="$dev" setup output config)
|
|
((found == 1))
|
|
|
|
# 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"
|
|
|
|
# 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"
|
|
|
|
# All done, start tiding up
|
|
cleanup_dm
|
|
}
|
|
|
|
trap "cleanup" EXIT
|
|
|
|
setup reset
|
|
|
|
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##*/}
|
|
# Skip OCSSD drives if somehow some are still bound to the
|
|
# nvme driver.
|
|
for ocssd in $OCSSD_PCI_DEVICES; do
|
|
[[ $pci == "$ocssd" ]] && continue 2
|
|
done
|
|
# Skip devices that are in use - simple blkid it to see if
|
|
# there's any metadata (pt, fs, etc.) present on the drive.
|
|
# If the drive's size is less than 2G, skip it as we need
|
|
# something bigger for the tests.
|
|
# FIXME: Special case to ignore atari as a potential false
|
|
# positive:
|
|
# https://github.com/spdk/spdk/issues/2079
|
|
pt=$(blkid -s PTTYPE -o value "/dev/${block##*/}") || pt=none
|
|
if [[ $pt == none || $pt == atari ]] && (($(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
|