blob: 01fa894ba886b067f04654b986c51fef26818c69 [file] [log] [blame]
#!/bin/sh
#
# Wait up to a few seconds for each hotplug-detected SCSI interface to have
# at least one hotplug-detected disk attached. This includes usb-storage
# and SATA.
#
# The assumption that if any device is present, the polling of that SCSI bus
# is finished, is probably not 100% valid, but it should be pretty close,
# especially in the modern world where every disk always seems to get its
# own bus anyway.
#
NUM_PROBES=6
PROBE_DELAY_SECS=.5
# If this is non-empty, only matches scsi hosts that contain the given
# name prefix in their path (example: usb)
TYPE=$1
. /etc/utils.sh
realdir() {
# should not need to set PWD=, but our /bin/pwd implementation seems
# to use it, unlike the normal Linux one.
(cd "$1" && PWD= /bin/pwd)
}
: >>/tmp/wait-scsi.done
# capture the list of hosts once at the start, in case new interfaces arrive
# during our probe; we don't want to give them a partial timeout, so we'll
# ignore them entirely for this run.
for hostpath in /sys/bus/scsi/devices/host*; do
[ -e "$hostpath" ] || continue
hostpath=$(realdir "$hostpath")
if [ -n "$TYPE" ] && ! contains "$hostpath" "/$TYPE"; then
continue
fi
hostpaths="$hostpaths $hostpath"
echo "wait-scsi: $hostpath" >&2
done
for timeout in $(seq "$NUM_PROBES"); do
ok=1
for hostpath in $hostpaths; do
[ -e "$hostpath" ] || continue
hostpath=$(realdir "$hostpath")
if grep -q "$hostpath" /tmp/wait-scsi.done; then
# another running instance might have finished polling this
# interface while we were here; if it timed out this interface
# already, then we don't need to poll it anymore.
continue
fi
found=
for d in /sys/block/sd*; do
[ -e "$d" ] || continue
devpath=$(realdir "$d/device")
if startswith "$devpath" "$hostpath"; then
found=1
break
fi
done
# if any host doesn't have a device attached, we're not done yet.
[ -z "$found" ] && ok=
done
[ "$ok" = 1 ] && break
sleep "$PROBE_DELAY_SECS"
done
# We've waited for these hosts already, no need to wait again later
for d in $hostpaths; do
echo "$d"
done >>/tmp/wait-scsi.done