From 8714d5292b09502b9f19a6f01f7d5fac99e9759c Mon Sep 17 00:00:00 2001 From: Ned Bass Date: Wed, 19 Sep 2012 11:44:12 -0700 Subject: [PATCH] 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. Closes #870 Signed-off-by: Ned Bass --- cmd/vdev_id/vdev_id | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/cmd/vdev_id/vdev_id b/cmd/vdev_id/vdev_id index d278197..55af515 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 @@ -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 + 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 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` -- 1.7.10