diff --git a/SOURCES/0138-tests-backport-new-ts_scsi_debug_init.patch b/SOURCES/0138-tests-backport-new-ts_scsi_debug_init.patch new file mode 100644 index 00000000..051f28e8 --- /dev/null +++ b/SOURCES/0138-tests-backport-new-ts_scsi_debug_init.patch @@ -0,0 +1,104 @@ +From 84995ef8ff7b76cff1cce438fc448f0afa560e23 Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Tue, 17 Oct 2017 12:16:27 +0200 +Subject: [PATCH 138/141] tests: backport new ts_scsi_debug_init + +Signed-off-by: Karel Zak +--- + tests/functions.sh | 76 +++++++++++++++++++++++++++++++++++++++++++++++------- + 1 file changed, 66 insertions(+), 10 deletions(-) + +diff --git a/tests/functions.sh b/tests/functions.sh +index 0d1c9c88a..b930dfe7e 100644 +--- a/tests/functions.sh ++++ b/tests/functions.sh +@@ -502,21 +502,77 @@ function ts_fdisk_clean { + } + + function ts_scsi_debug_init { ++ local devname ++ local t ++ TS_DEVICE="none" + +- modprobe --dry-run --quiet scsi_debug +- [ "$?" == 0 ] || ts_skip "missing scsi_debug module" ++ # dry run is not really reliable, real modprobe may still fail ++ modprobe --dry-run --quiet scsi_debug &>/dev/null \ ++ || ts_skip "missing scsi_debug module (dry-run)" + +- rmmod scsi_debug &> /dev/null +- modprobe scsi_debug $* +- [ "$?" == 0 ] || ts_die "Cannot init device" ++ # skip if still in use or removal of modules not supported at all ++ # We don't want a slow timeout here so we don't use ts_scsi_debug_rmmod! ++ modprobe -r scsi_debug &>/dev/null \ ++ || ts_skip "cannot remove scsi_debug module (rmmod)" + +- DEVNAME=$(grep --with-filename scsi_debug /sys/block/*/device/model | awk -F '/' '{print $4}') +- [ "x${DEVNAME}" == "x" ] && ts_die "Cannot find device" ++ modprobe -b scsi_debug "$@" &>/dev/null \ ++ || ts_skip "cannot load scsi_debug module (modprobe)" + +- DEVICE="/dev/${DEVNAME}" ++ # it might be still not loaded, modprobe.conf or whatever ++ lsmod 2>/dev/null | grep -q "^scsi_debug " \ ++ || ts_skip "scsi_debug module not loaded (lsmod)" + +- sleep 1 + udevadm settle + +- echo $DEVICE ++ # wait for device if udevadm settle does not work ++ for t in 0 0.02 0.05 0.1 1; do ++ sleep $t ++ devname=$(grep --with-filename scsi_debug /sys/block/*/device/model) && break ++ done ++ [ -n "${devname}" ] || ts_die "timeout waiting for scsi_debug device" ++ ++ devname=$(echo $devname | awk -F '/' '{print $4}') ++ TS_DEVICE="/dev/${devname}" ++ ++ # TODO validate that device is really up, for now just a warning on stderr ++ test -b $TS_DEVICE || echo "warning: scsi_debug device is still down" >&2 ++} ++ ++# automatically called once in ts_cleanup_on_exit() ++function ts_scsi_debug_rmmod { ++ local err=1 ++ local t ++ local lastmsg ++ ++ # Return early most importantly in case we are not root or the module does ++ # not exist at all. ++ [ $UID -eq 0 ] || return 0 ++ [ -n "$TS_DEVICE" ] || return 0 ++ lsmod 2>/dev/null | grep -q "^scsi_debug " || return 0 ++ ++ udevadm settle ++ ++ # wait for successful rmmod if udevadm settle does not work ++ for t in 0 0.02 0.05 0.1 1; do ++ sleep $t ++ lastmsg="$(modprobe -r scsi_debug 2>&1)" && err=0 && break ++ done ++ ++ if [ "$err" = "1" ]; then ++ ts_log "rmmod failed: '$lastmsg'" ++ ts_log "timeout removing scsi_debug module (rmmod)" ++ return 1 ++ fi ++ if lsmod | grep -q "^scsi_debug "; then ++ ts_log "BUG! scsi_debug still loaded" ++ return 1 ++ fi ++ ++ # TODO Do we need to validate that all devices are gone? ++ udevadm settle ++ test -b "$TS_DEVICE" && echo "warning: scsi_debug device is still up" >&2 ++ ++ # TODO unset TS_DEVICE, check that nobody uses it later, e.g. ts_fdisk_clean ++ ++ return 0 + } +-- +2.13.6