Re: re-detect SCSi bus? Skript

Kurt Garloff (garloff@kg1.ping.de)
Thu, 19 Mar 1998 10:47:22 +0100


--GvXjxJ+pjyke8COw
Content-Type: text/plain; charset=us-ascii

On Wed, Mar 18, 1998 at 05:14:17PM -0600, shalon@interlock.dfw.ibm.com wrote:
> Hmm. I'm not *that* familiar with SCSI, but I would assume that that
> add-single-device would fail if there was no device attached, yes? How
> hard would it be to write a script that simply checked to see how many
> hosts you had, how many channels you had, and what devices were
> already know. Then it would simply run down the list of "Host Channel
> Id" skipping any which were already known. You also could give the
> script an Id to check all LUNs on.
>
> This is of course assuming that there are no bad side effects to
> trying to add a nonexistant SCSI device; I'll take a look when I get
> home tonight and have source.

I wrote a little skript. Have a look at it ...
It takes some options.

> On a similar note, is there a 'remove-single-device command'? How hard
> would it be to add?

There is. Exactly with the name you guessed. Linux is that easy sometimes.

-- 
Kurt Garloff, Dortmund 
<K.Garloff@ping.de>
PGP key on http://student.physik.uni-dortmund.de/homepages/garloff

--GvXjxJ+pjyke8COw Content-Type: application/x-sh Content-Disposition: attachment; filename="rescan-scsi-bus.sh"

#!/bin/bash # Skript to rescan SCSI bus, using the # scsi add-single-device mechanism # (w) 98/03/19 Kurt Garloff <K.Garloff@ping.de> (c) GNU GPL

# Return hosts. /proc/scsi/HOSTADAPTER/? must exist findhosts () { hosts= for name in /proc/scsi/*/?; do name=${name#/proc/scsi/} if test ! $name = scsi then hosts="$hosts ${name#*/}" echo "Host adapter ${name#*/} (${name%/*}) found." fi done }

# Test if SCSI device $host $channen $id $lun exists # Outputs description from /proc/scsi/scsi, returns new testexist () { grepstr="scsi$host Channel: 0$channel Id: 0*$id Lun: 0$lun" new=`cat /proc/scsi/scsi|grep -e"$grepstr"` if test ! -z "$new" then cat /proc/scsi/scsi|grep -e"$grepstr" cat /proc/scsi/scsi|grep -A2 -e"$grepstr"|tail -2|pr -o4 -l1 fi }

# Perform search (scan $host) dosearch () { for channel in $channelsearch; do for id in $idsearch; do for lun in $lunsearch; do new= devnr="$host $channel $id $lun" echo "Scanning for device $devnr ..." printf "OLD: " testexist if test -z "$new" then printf "\rNEW: " echo "scsi add-single-device $devnr" >/proc/scsi/scsi testexist if test -z "$new"; then printf "\r\x1b[A"; else let found+=1; fi fi done done done } # main if test @$1 = @--help -o @$1 = @-h then echo "Usage: rescan-scsi-bus.sh [-l] [-w] [-c] [host [host ...]]" echo " -l activates scanning for LUNs 0 .. 7 [default: 0]" echo " -w enables scanning for device IDs 0 .. 15 [def.: 0 .. 7]" echo " -c enables scanning of channels 0 1 [default: 0]" echo " If hosts are given, only these are scanned [def.: all]" exit 0 fi

# defaults lunsearch="0" idsearch="0 1 2 3 4 5 6 7" channelsearch="0"

# Scan options opt="$1" while test ! -z "$opt" -a -z "${opt##-*}"; do opt=${opt#-} case "$opt" in l) lunsearch="0 1 2 3 4 5 6 7" ;; w) idsearch="0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15" ;; c) channelsearch="0 1" ;; *) echo "Unknown option -$opt !" ;; esac shift opt="$1" done

# Hosts given ? if test @$1 = @; then findhosts; else hosts=$*; fi

declare -i found=0 for host in $hosts; do dosearch; done echo "$found new device(s) found. "

--GvXjxJ+pjyke8COw--

- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.rutgers.edu