[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: New ofpath and yabootconfig: Added devfs support, PLEASE TEST



On Thu, May 24, 2001 at 06:44:25PM -0700, Tom Rini wrote:
> On Thu, May 24, 2001 at 04:44:35PM -0800, Ethan Benson wrote:
> > On Thu, May 24, 2001 at 05:10:52PM -0700, Tom Rini wrote:
> > > I would too.  I just couldn't think of any way to do that.
> > 
> > what about grabbing the ids and host numbers out, and sorting the
> > devices out?  im not quite sure how do to that... some substitution
> > and a for loop maybe.  getting the logic right would be tricky.  
> 
> Er, hmm.  It might be possible to do it this way.  It looks like
> most of the logic is there.  I'll play around with this sometime
> soonish.

Okay.  I've attached a patch which cleans up fixdevfs() slightly, and makes
it parse /proc/scsi/scsi for it's info.  It also changes smalltr() to go from 
a number to a letter as well.  It also fixed a slight logic goof so it
should correctly translate devices other then hda/hdc.

-- 
Tom Rini (TR1265)
http://gate.crashing.org/~trini/
--- /usr/sbin/ofpath.orig	Thu May 24 17:37:14 2001
+++ /usr/sbin/ofpath	Sat May 26 16:29:37 2001
@@ -103,6 +103,10 @@
 	a) echo 1 ;; b) echo 2 ;; c) echo 3 ;; d) echo 4 ;; e) echo 5 ;; f) echo 6 ;;
 	g) echo 7 ;; h) echo 8 ;; i) echo 9 ;; j) echo 10 ;; k) echo 11 ;; l) echo 12 ;;
 	m) echo 13 ;; n) echo 14 ;; o) echo 15 ;; p) echo 16 ;;
+	1) echo a ;; 2) echo b ;; 3) echo c ;; 4) echo d ;; 5) echo e ;; 
+	6) echo f ;; 7) echo g ;; 8) echo h ;; 9) echo i ;; 10) echo j ;;
+	11) echo k ;; 12) echo l ;; 13) echo m ;; 14) echo n ;; 15) echo o ;;
+	16) echo p ;;
     esac
     return 0
 }
@@ -540,35 +544,36 @@
     else
         DISC="$1"
     fi
-    ## Find the bus type
-    TYPE="${DISC#/dev/}"
-    TYPE="${TYPE%/host*}"
+    ## Find the bus type.
+    TYPE="$(v=${DISC#/dev/} ; echo ${v%/host*})"
+    ## Find the host number.
+    HOST=$(v=${1#/dev/*/host} ; echo ${v%/bus*})
+    ## Find the bus number.
+    BUS=$(v=${1#/dev/*/bus} ; echo ${v%/tar*})
+    ## Find the target.
+    TARGET=$(v=${1#/dev/*/target} ; echo ${v%/lun*})
 
     ## Partition number
     PARTNUM="${DISC#/dev/*/part}"
     case "$TYPE" in
 	ide)
-	DRIVE="${DISC#/dev/ide/}"
-	DRIVE="${DRIVE%/bus*}"
-	BUS="${DISC#/dev/ide/host*/}"
-	BUS="${BUS%/target*}"
-	case "$DRIVE" in
-	    host0)
-	    case "$BUS" in
-		bus0)
+	case "$HOST" in
+	    0)
+	    case "$TARGET" in
+		0)
 		DEV=hda
 		;;
-		bus1)
+		1)
 		DEV=hdb
 		;;
 	    esac
 	    ;;
-	    host1)
-	    case "$BUS" in
-		bus0)
+	    1)
+	    case "$TARGET" in
+		0)
 	        DEV=hdc
 	        ;;
-		bus1)
+		1)
 		DEV=hdd
 		;;
 	    esac
@@ -580,43 +585,62 @@
 	DEV="${DEV}$PARTNUM"
 	;;
 	scsi)
-	BASEDEV=${DISC#/dev/}
-	SDA=`ls -l /dev/sda$PARTNUM 2>/dev/null`
-	SDA="${SDA#l*> }"
-	SDB=`ls -l /dev/sdb$PARTNUM 2>/dev/null`
-	SDB="${SDB#l*> }"
-	SDC=`ls -l /dev/sdc$PARTNUM 2>/dev/null`
-	SDC="${SDC#l*> }"
-	SDD=`ls -l /dev/sdd$PARTNUM 2>/dev/null`
-	SDD="${SDD#l*> }"
-	SDE=`ls -l /dev/sde$PARTNUM 2>/dev/null`
-	SDE="${SDE#l*> }"
-	SDF=`ls -l /dev/sdf$PARTNUM 2>/dev/null`
-	SDF="${SDF#l*> }"
-	SDG=`ls -l /dev/sdg$PARTNUM 2>/dev/null`
-	SDG="${SDG#l*> }"
-	SDH=`ls -l /dev/sdh$PARTNUM 2>/dev/null`
-	SDH="${SDH#l*> }"
-	if [ "$BASEDEV" == "$SDA" ]; then
-	   DEV="sda${PARTNUM}"
-	elif [ "$BASEDEV" == "$SDB" ]; then
-	   DEV="sdb${PARTNUM}"
-	elif [ "$BASEDEV" == "$SDC" ]; then
-	   DEV="sdc${PARTNUM}"
-	elif [ "$BASEDEV" == "$SDC" ]; then
-	   DEV="sdd${PARTNUM}"
-	elif [ "$BASEDEV" == "$SDE" ]; then
-	   DEV="sde${PARTNUM}"
-	elif [ "$BASEDEV" == "$SDF" ]; then
-	   DEV="sdf${PARTNUM}"
-	elif [ "$BASEDEV" == "$SDG" ]; then
-	   DEV="sdg${PARTNUM}"
-	elif [ "$BASEDEV" == "$SDH" ]; then
-	   DEV="sdh${PARTNUM}"
-	else
-	    echo 1>&2 "$PRG: Can't convert this devfs name, try again without devfs"
-	    return 1
-	fi
+	LUN=$(v=${1#/dev/*/lun} ; echo ${v%/*})
+
+	## In this case, we need to figure out what number our device is
+	DEVCOUNT=0
+
+	## copy scsi file into a variable removing "Attached Devices"
+	## which is the first line. this avoids a lot of
+	## [incmopatible] crap later, and improves readability.
+
+	## find number of lines once and recycle that number, to save
+	## some time (linecount is a bit slow). subtract one line
+	## to scrap Attached Devices:
+
+	SCSILINES=$(($(linecount /proc/scsi/scsi) - 1))
+	PROCSCSI=`cat /proc/scsi/scsi | tail -n $SCSILINES`
+
+	for i in $(smallseq $(($SCSILINES / 3))) ; do
+
+	    ## put every scsi device into one single line
+	    DEVINFO=$(echo "$PROCSCSI" | head -n $(($i * 3)) | tail -n 3)
+	    [ "$DEBUG" = 1 ] && echo 1>&2 "$PRG: DEBUG: DEVINFO=$DEVINFO"
+
+	    ## cut the type field, expect "Direct-Access" later.
+	    DEVTYPE=$(v=$(echo ${DEVINFO##*Type: }) ; echo ${v%% *})
+	    [ "$DEBUG" = 1 ] && echo 1>&2 "$PRG: DEBUG: DEVTYPE=$DEVTYPE"
+
+	    if [ "$DEVTYPE" = "Direct-Access" ] ; then
+		## Lets find out some more information
+		## get the device id.
+		DEVID=$(v=$(echo ${DEVINFO##*Id: }) ; n=$(echo ${v%% *}) ; echo ${n#*0})
+		[ "$DEBUG" = 1 ] && echo 1>&2 "$PRG: DEBUG: DEVID=$DEVID"
+
+		## get the device lun.
+		DEVLUN=$(v=$(echo ${DEVINFO##*Lun: }) ; n=$(echo ${v%% *}) ; echo ${n#*0})
+		[ "$DEBUG" = 1 ] && echo 1>&2 "$PRG: DEBUG: DEVLUN=$DEVLUN"
+
+		## get the device channel.
+		DEVCHAN=$(v=$(echo ${DEVINFO##*Channel: }) ; n=$(echo ${v%% *}) ; echo ${n#*0})
+		[ "$DEBUG" = 1 ] && echo 1>&2 "$PRG: DEBUG: DEVCHAN=$DEVCHAN"
+
+		## get the scsi host id.
+		DEVHOST=$(v=$(echo ${DEVINFO##*Host: scsi}) ; echo ${v%% *})
+		[ "$DEBUG" = 1 ] && echo 1>&2 "$PRG: DEBUG: DEVHOST=$DEVHOST"
+
+		DEVCOUNT=$(($DEVCOUNT + 1))
+		[ "$DEBUG" = 1 ] && echo 1>&2 "$PRG: DEBUG: DEVCOUNT=$DEVCOUNT"
+		if [ "$DEVHOST" = "$HOST" -a "$DEVCHAN" = "$BUS" -a \
+		    "$DEVID" = "$TARGET" -a "$DEVLUN" = "$LUN" ] ; then
+		    FINALDEV=sd$(smalltr $DEVCOUNT)${1#/dev/*part}
+		    echo $FINALDEV
+		    return 0
+		fi
+	    fi
+	done
+	echo "Couldn't translate this device."
+	return 1
 	;;
 	*)
 	echo 1>&2 "$PRG: Unknown bus $TYPE"

Reply to: