summaryrefslogtreecommitdiff
blob: 7a365910049525fb87601413c260d28ff8c261c4 (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
104
105
--- usr/sbin/ofpath	2008-08-03 04:00:35.000000000 -0400
+++ usr/sbin/ofpath	2009-01-09 13:46:12.000000000 -0500
@@ -337,15 +337,18 @@
 
 ide_ofpath()
 {
-    if [ ! -L "/proc/ide/$DEVNODE" ] ; then
+    if [ ! -L "/proc/ide/$DEVNODE" ] && [ ! -e "/sys/block/$DEVNODE" ] ; then
 	echo 1>&2 "$PRG: /dev/$DEVNODE: Device not configured"
 	return 1
     fi
 
-    local IDEBUS="$(v=`readlink /proc/ide/$DEVNODE` ; echo ${v%%/*} )"
-    if [ -z "$IDEBUS" ] ; then
-	echo 1>&2 "$PRG: BUG: IDEBUS == NULL"
-	return 1
+    if [ -L "/proc/ide/$DEVNODE" ] ; then
+    	    local USE_OLD_PROC=1
+	    local IDEBUS="$(v=`readlink /proc/ide/$DEVNODE` ; echo ${v%%/*} )"
+	    if [ -z "$IDEBUS" ] ; then
+		echo 1>&2 "$PRG: BUG: IDEBUS == NULL"
+		return 1
+   	 fi
     fi
 
     case "$(uname -r)" in
@@ -363,7 +366,8 @@
 		echo 1>&2 "$PRG: Unable to determine sysfs mountpoint"
 		return 1
 	    fi
-	    local OF1275IDE="${SYS}/block/${DEVNODE}/device/../../devspec"
+	    local OF1275IDE=$(cd -P "${SYS}/block/${DEVNODE}/device" && pwd)
+	    OF1275IDE="${OF1275IDE}/../../devspec"
 	    ;;
 	*)
 	    local OF1275IDE="/proc/ide/$IDEBUS/devspec"
@@ -402,34 +406,41 @@
 	    return 1
 	fi
 
-	if [ ! -f "/proc/ide/${IDEBUS}/channel" ] ; then
-	    echo 1>&2 "$PRG: KERNEL BUG: /proc/ide/${IDEBUS}/channel does not exist"
-	    return 1
-	fi
-
-	case "$(cat /proc/device-tree${DEVSPEC}/device_type 2> /dev/null)" in
-	    ide|ata)
-		local MASTER="/disk@0"
-		local SLAVE="/disk@1"
-		;;
-	    pci-ide|pci-ata)
-		local MASTER="/@$(cat /proc/ide/${IDEBUS}/channel)/disk@0"
-		local SLAVE="/@$(cat /proc/ide/${IDEBUS}/channel)/disk@1"
-		;;
-	    scsi) ## some lame controllers pretend they are scsi, hopefully all kludges are created equal.
-		local MASTER="/@$(($(cat /proc/ide/${IDEBUS}/channel) * 2 + 0))"
-		local SLAVE="/@$(($(cat /proc/ide/${IDEBUS}/channel) * 2 + 1))"
-		;;
-	    spi)
-		local MASTER="/disk@$(cat /proc/ide/${IDEBUS}/channel),0"
-		local SLAVE="/disk@$(cat /proc/ide/${IDEBUS}/channel),1"
-		;;
-	    *)
-		echo 1>&2 "$PRG: Unsupported IDE device type: \"$(cat /proc/device-tree${DEVSPEC}/device_type 2> /dev/null)\""
-		return 1
-		;;
-	esac
+	
+	if [ "${USE_OLD_PROC}" = "1" ] ; then
+		if [ ! -f "/proc/ide/${IDEBUS}/channel" ] ; then
+		    echo 1>&2 "$PRG: KERNEL BUG: /proc/ide/${IDEBUS}/channel does not exist"
+		    return 1
+		fi
 
+		case "$(cat /proc/device-tree${DEVSPEC}/device_type 2> /dev/null)" in
+		    ide|ata)
+			local MASTER="/disk@0"
+			local SLAVE="/disk@1"
+			;;
+		    pci-ide|pci-ata)
+			local MASTER="/@$(cat /proc/ide/${IDEBUS}/channel)/disk@0"
+			local SLAVE="/@$(cat /proc/ide/${IDEBUS}/channel)/disk@1"
+			;;
+		    scsi) ## some lame controllers pretend they are scsi, hopefully all kludges are created equal.
+			local MASTER="/@$(($(cat /proc/ide/${IDEBUS}/channel) * 2 + 0))"
+			local SLAVE="/@$(($(cat /proc/ide/${IDEBUS}/channel) * 2 + 1))"
+			;;
+		    spi)
+			local MASTER="/disk@$(cat /proc/ide/${IDEBUS}/channel),0"
+			local SLAVE="/disk@$(cat /proc/ide/${IDEBUS}/channel),1"
+			;;
+		    *)
+			echo 1>&2 "$PRG: Unsupported IDE device type: \"$(cat /proc/device-tree${DEVSPEC}/device_type 2> /dev/null)\""
+			return 1
+			;;
+		esac
+	else
+	    ### I don't know what other disks would look like... FIXME
+	    local MASTER="/disk@0"
+	    local SLAVE="/disk@1"
+	fi
+	
 	case "$DEVNODE" in
 	    hda|hdc|hde|hdg|hdi|hdk|hdm|hdo)
 		echo "${DEVSPEC}${MASTER}:$PARTITION"