summaryrefslogtreecommitdiffstats
path: root/cmd
diff options
context:
space:
mode:
authorNed Bass <[email protected]>2012-09-19 11:44:12 -0700
committerBrian Behlendorf <[email protected]>2012-11-27 14:23:22 -0800
commita6ef9522eae9be2c2cb40731a8afb0a90f05d7ae (patch)
tree7be5f038a61fbda1087a85eccd2007ffc9bbdcdf /cmd
parentf74a147c022f79916e8525c2c16b1603f91202aa (diff)
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 <[email protected]> Signed-off-by: Brian Behlendorf <[email protected]> Closes #870
Diffstat (limited to 'cmd')
-rwxr-xr-xcmd/vdev_id/vdev_id39
1 files changed, 23 insertions, 16 deletions
diff --git a/cmd/vdev_id/vdev_id b/cmd/vdev_id/vdev_id
index d2781972f..fd8e42289 100755
--- a/cmd/vdev_id/vdev_id
+++ b/cmd/vdev_id/vdev_id
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/bin/sh
#
# vdev_id: udev helper to generate user-friendly names for JBOD disks
#
@@ -80,7 +80,6 @@ SLOT_MAP=
CHANNEL_MAP=
MULTIPATH=
TOPOLOGY=
-declare -i i j
usage() {
cat << EOF
@@ -185,7 +184,7 @@ if [ -z "$PHYS_PER_PORT" ] ; then
PHYS_PER_PORT=`awk "/^phys_per_port /{print \\$2; exit}" $CONFIG`
fi
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"
exit 1
fi
@@ -229,32 +228,39 @@ else
sys_path=`udevadm info -q path -p /sys/block/$DEV 2>/dev/null`
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"
# Get path up to /sys/.../hostX
-for (( i=0; i<${#dirs[*]}; i++ )); do
- d=${dirs[$i]}
+i=1
+while [ $i -le $num_dirs ] ; do
+ d=$(eval echo \$$i)
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
-if [ $i = ${#dirs[*]} ] ; then
+if [ $i = $num_dirs ] ; then
exit 0
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
# sas_direct mode, the phy links one directory down reveal the HBA port.
port_dir=$scsi_host_dir
case $TOPOLOGY in
- "sas_switch") j=$(($i+4)) ;;
+ "sas_switch") j=$(($i + 4)) ;;
"sas_direct") j=$(($i + 1)) ;;
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
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
# attribute.
end_device_dir=$port_dir
-for (( ; i<${#dirs[*]} ; i++ )); do
- d=${dirs[$i]}
+while [ $i -lt $num_dirs ] ; do
+ d=$(eval echo \$$i)
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"
break
fi
+ i=$(($i + 1))
done
SLOT=`cat $end_device_dir/bay_identifier 2>/dev/null`