Make vdev_id POSIX sh compatible

Full bash may not be available in all environments where udev helpers
run, such as in an initial ramdisk.  To avoid breakage in this case,
remove use of bash-specific features such as variable arrays and the
`declare' keyword from the vdev_id script.

Signed-off-by: Ned Bass <bass6@llnl.gov>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #870
This commit is contained in:
Ned Bass 2012-09-19 11:44:12 -07:00 committed by Brian Behlendorf
parent f74a147c02
commit a6ef9522ea

View File

@ -1,4 +1,4 @@
#!/bin/bash #!/bin/sh
# #
# vdev_id: udev helper to generate user-friendly names for JBOD disks # vdev_id: udev helper to generate user-friendly names for JBOD disks
# #
@ -80,7 +80,6 @@ SLOT_MAP=
CHANNEL_MAP= CHANNEL_MAP=
MULTIPATH= MULTIPATH=
TOPOLOGY= TOPOLOGY=
declare -i i j
usage() { usage() {
cat << EOF cat << EOF
@ -185,7 +184,7 @@ if [ -z "$PHYS_PER_PORT" ] ; then
PHYS_PER_PORT=`awk "/^phys_per_port /{print \\$2; exit}" $CONFIG` PHYS_PER_PORT=`awk "/^phys_per_port /{print \\$2; exit}" $CONFIG`
fi fi
PHYS_PER_PORT=${PHYS_PER_PORT:-4} PHYS_PER_PORT=${PHYS_PER_PORT:-4}
if ! echo $PHYS_PER_PORT | egrep -q '^[0-9]+$' ; then if ! echo $PHYS_PER_PORT | grep -q -E '^[0-9]+$' ; then
echo "Error: phys_per_port value $PHYS_PER_PORT is non-numeric" echo "Error: phys_per_port value $PHYS_PER_PORT is non-numeric"
exit 1 exit 1
fi fi
@ -229,32 +228,39 @@ else
sys_path=`udevadm info -q path -p /sys/block/$DEV 2>/dev/null` sys_path=`udevadm info -q path -p /sys/block/$DEV 2>/dev/null`
fi fi
dirs=(`echo "$sys_path" | tr / ' '`) # Use positional parameters as an ad-hoc array
set -- $(echo "$sys_path" | tr / ' ')
num_dirs=$#
scsi_host_dir="/sys" scsi_host_dir="/sys"
# Get path up to /sys/.../hostX # Get path up to /sys/.../hostX
for (( i=0; i<${#dirs[*]}; i++ )); do i=1
d=${dirs[$i]} while [ $i -le $num_dirs ] ; do
d=$(eval echo \$$i)
scsi_host_dir="$scsi_host_dir/$d" scsi_host_dir="$scsi_host_dir/$d"
echo $d | egrep -q -e '^host[0-9]+$' && break echo $d | grep -q -E '^host[0-9]+$' && break
i=$(($i + 1))
done done
if [ $i = ${#dirs[*]} ] ; then if [ $i = $num_dirs ] ; then
exit 0 exit 0
fi fi
PCI_ID=`echo ${dirs[$(( $i - 1 ))]} | awk -F: '{print $2":"$3}'` PCI_ID=$(eval echo \$$(($i -1)) | awk -F: '{print $2":"$3}')
# In sas_switch mode, the directory three levels beneath /sys/.../hostX # In sas_switch mode, the directory four levels beneath /sys/.../hostX
# contains symlinks to phy devices that reveal the switch port number. In # contains symlinks to phy devices that reveal the switch port number. In
# sas_direct mode, the phy links one directory down reveal the HBA port. # sas_direct mode, the phy links one directory down reveal the HBA port.
port_dir=$scsi_host_dir port_dir=$scsi_host_dir
case $TOPOLOGY in case $TOPOLOGY in
"sas_switch") j=$(($i+4)) ;; "sas_switch") j=$(($i + 4)) ;;
"sas_direct") j=$(($i + 1)) ;; "sas_direct") j=$(($i + 1)) ;;
esac esac
for (( i++; i<=$j; i++ )); do
port_dir="$port_dir/${dirs[$i]}" i=$(($i + 1))
while [ $i -le $j ] ; do
port_dir="$port_dir/$(eval echo \$$i)"
i=$(($i + 1))
done done
PHY=`ls -d $port_dir/phy* 2>/dev/null | head -1 | awk -F: '{print $NF}'` PHY=`ls -d $port_dir/phy* 2>/dev/null | head -1 | awk -F: '{print $NF}'`
@ -266,13 +272,14 @@ PORT=$(( $PHY / $PHYS_PER_PORT ))
# Look in /sys/.../sas_device/end_device-X for the bay_identifier # Look in /sys/.../sas_device/end_device-X for the bay_identifier
# attribute. # attribute.
end_device_dir=$port_dir end_device_dir=$port_dir
for (( ; i<${#dirs[*]} ; i++ )); do while [ $i -lt $num_dirs ] ; do
d=${dirs[$i]} d=$(eval echo \$$i)
end_device_dir="$end_device_dir/$d" end_device_dir="$end_device_dir/$d"
if echo $d | egrep -q -e '^end_device' ; then if echo $d | grep -q '^end_device' ; then
end_device_dir="$end_device_dir/sas_device/$d" end_device_dir="$end_device_dir/sas_device/$d"
break break
fi fi
i=$(($i + 1))
done done
SLOT=`cat $end_device_dir/bay_identifier 2>/dev/null` SLOT=`cat $end_device_dir/bay_identifier 2>/dev/null`