summaryrefslogtreecommitdiffstats
path: root/testing/zfs-git-grsec/vdev_id_posix.patch
blob: 8f44d039c8e1f8c2e205fd6b76c59fb79f5358ec (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
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