diff options
Diffstat (limited to 'testing/zfs-git-grsec/vdev_id_posix.patch')
-rw-r--r-- | testing/zfs-git-grsec/vdev_id_posix.patch | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/testing/zfs-git-grsec/vdev_id_posix.patch b/testing/zfs-git-grsec/vdev_id_posix.patch new file mode 100644 index 000000000..8f44d039c --- /dev/null +++ b/testing/zfs-git-grsec/vdev_id_posix.patch @@ -0,0 +1,103 @@ +From 8714d5292b09502b9f19a6f01f7d5fac99e9759c Mon Sep 17 00:00:00 2001 +From: Ned Bass <bass6@llnl.gov> +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 <bass6@llnl.gov> +--- + 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 + |