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: