aboutsummaryrefslogtreecommitdiffstats
path: root/testing/zfs-git-grsec/vdev_id_posix.patch
diff options
context:
space:
mode:
Diffstat (limited to 'testing/zfs-git-grsec/vdev_id_posix.patch')
-rw-r--r--testing/zfs-git-grsec/vdev_id_posix.patch103
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 0000000000..8f44d039c8
--- /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
+