vdev_id fails to handle complex device topologies

While expanding positional parameters shell requires non-single
digits to be enclosed in braces. When the SAS topology is
non-trivial the number of positional parameters generated internally
by vdev_id script (using set -- ...) easily crosses single digit limit
and vdev_id fails to generate links.

Signed-off-by: Ned Bass <bass6@llnl.gov>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #1119
This commit is contained in:
Cyril Plisko 2012-11-29 15:40:26 +02:00 committed by Brian Behlendorf
parent a6ef9522ea
commit 38b344d22a

View File

@ -236,7 +236,7 @@ scsi_host_dir="/sys"
# Get path up to /sys/.../hostX # Get path up to /sys/.../hostX
i=1 i=1
while [ $i -le $num_dirs ] ; do while [ $i -le $num_dirs ] ; do
d=$(eval echo \$$i) d=$(eval echo \${$i})
scsi_host_dir="$scsi_host_dir/$d" scsi_host_dir="$scsi_host_dir/$d"
echo $d | grep -q -E '^host[0-9]+$' && break echo $d | grep -q -E '^host[0-9]+$' && break
i=$(($i + 1)) i=$(($i + 1))
@ -246,7 +246,7 @@ if [ $i = $num_dirs ] ; then
exit 0 exit 0
fi fi
PCI_ID=$(eval echo \$$(($i -1)) | awk -F: '{print $2":"$3}') PCI_ID=$(eval echo \${$(($i -1))} | awk -F: '{print $2":"$3}')
# In sas_switch mode, the directory four 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
@ -259,7 +259,7 @@ esac
i=$(($i + 1)) i=$(($i + 1))
while [ $i -le $j ] ; do while [ $i -le $j ] ; do
port_dir="$port_dir/$(eval echo \$$i)" port_dir="$port_dir/$(eval echo \${$i})"
i=$(($i + 1)) i=$(($i + 1))
done done
@ -273,7 +273,7 @@ PORT=$(( $PHY / $PHYS_PER_PORT ))
# attribute. # attribute.
end_device_dir=$port_dir end_device_dir=$port_dir
while [ $i -lt $num_dirs ] ; do while [ $i -lt $num_dirs ] ; do
d=$(eval echo \$$i) d=$(eval echo \${$i})
end_device_dir="$end_device_dir/$d" end_device_dir="$end_device_dir/$d"
if echo $d | grep -q '^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"