Hello community, here is the log from the commit of package scsi checked in at Fri Jul 13 19:05:03 CEST 2007. -------- --- scsi/scsi.changes 2007-05-15 09:36:39.000000000 +0200 +++ /mounts/work_src_done/STABLE/scsi/scsi.changes 2007-07-13 10:44:52.887196000 +0200 @@ -1,0 +2,5 @@ +Fri Jul 13 10:43:35 CEST 2007 - hare@suse.de + +- rescan-scsi-bus.sh: Add scanning with REPORT LUNS (FATE #302246) + +------------------------------------------------------------------- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ scsi.spec ++++++ --- /var/tmp/diff_new_pack.D14927/_old 2007-07-13 19:02:40.000000000 +0200 +++ /var/tmp/diff_new_pack.D14927/_new 2007-07-13 19:02:40.000000000 +0200 @@ -18,12 +18,12 @@ %define lsscsiver 0.19 %define sdparmver 1.02 %define smputver 0.93 -License: BSD License and BSD-like, GNU General Public License (GPL) +License: BSD 3-Clause, GPL v2 or later Group: Hardware/Other Provides: scsiinfo sg_utils scsidev Autoreqprov: on Version: 1.7_2.36_1.24_0.19_1.02_0.93 -Release: 1 +Release: 14 Summary: SCSI Tools (Text Mode) Source: scsiinfo-%{sinfover}.tar.gz Patch: scsiinfo-%{sinfover}.diff @@ -383,6 +383,8 @@ %{insserv_cleanup} %changelog +* Fri Jul 13 2007 - hare@suse.de +- rescan-scsi-bus.sh: Add scanning with REPORT LUNS (FATE #302246) * Tue May 15 2007 - garloff@suse.de - Update to lsscsi-0.19: * add transport information, '--list' option, fixes for lk 2.6.20 ++++++ rescan-scsi-bus.sh ++++++ --- scsi/rescan-scsi-bus.sh 2007-05-15 00:50:16.000000000 +0200 +++ /mounts/work_src_done/STABLE/scsi/rescan-scsi-bus.sh 2007-07-13 10:43:34.407863000 +0200 @@ -27,12 +27,16 @@ if ! ls /sys/class/scsi_host/host* >/dev/null 2>&1; then echo "No SCSI host adapters found in sysfs" exit 1; - #hosts=" 0" - #return fi for hostdir in /sys/class/scsi_host/host*; do hostno=${hostdir#/sys/class/scsi_host/host} - hostname=`cat $hostdir/proc_name` + if [ -f $hostdir/isp_name ] ; then + hostname="qla2xxx" + elif [ -f $hostdir/lpfc_drvr_version ] ; then + hostname="lpfc" + else + hostname=`cat $hostdir/proc_name` + fi hosts="$hosts $hostno" echo "Host adapter $hostno ($hostname) found." done @@ -169,12 +173,13 @@ # Test if SCSI device is still responding to commands testonline () { + : testonline if test ! -x /usr/bin/sg_turs; then return 0; fi sgdevice if test -z "$SGDEV"; then return 0; fi sg_turs /dev/$SGDEV >/dev/null 2>&1 RC=$? - #echo -e "\e[A\e[A\e[A${yellow}Test existence of $SGDEV = $RC ${norm} \n\n\n" + # echo -e "\e[A\e[A\e[A${yellow}Test existence of $SGDEV = $RC ${norm} \n\n\n" if test $RC = 1; then return $RC; fi # OK, device online, compare INQUIRY string INQ=`sg_inq -36 /dev/$SGDEV` @@ -195,6 +200,7 @@ # Outputs description from /proc/scsi/scsi, returns SCSISTR testexist () { + : testexist SCSISTR= if procscsiscsi; then echo "$SCSISTR" | head -n1 @@ -202,63 +208,191 @@ fi } +# Returns the list of existing channels per host +chanlist () +{ + local hcil + local cil + local chan + local tmpchan + + for dev in /sys/class/scsi_device/${host}:* ; do + hcil=${dev##*/} + cil=${hcil#*:} + chan=${cil%%:*} + for tmpchan in $channelsearch ; do + if test "$chan" -eq $tmpchan ; then + chan= + fi + done + if test -n "$chan" ; then + channelsearch="$channelsearch $chan" + fi + done +} + +# Returns the list of existing targets per host +idlist () +{ + local hcil + local cil + local il + local target + local tmpid + + for dev in /sys/class/scsi_device/${host}:${channel}:* ; do + hcil=${dev##*/} + cil=${hcil#*:} + il=${cil#*:} + target=${il%%:*} + for tmpid in $idsearch ; do + if test "$target" -eq $tmpid ; then + target= + fi + done + if test -n "$target" ; then + idsearch="$idsearch $target" + fi + done +} + +# Returns the list of existing LUNs +getluns () +{ + if test ! -x /usr/bin/sg_luns; then return ""; fi + sgdevice + if test -z "$SGDEV"; then return ""; fi + sg_luns -d /dev/$SGDEV | sed -n 's/.*lun=(.*)/\1/p' +} + +# Perform scan on a single lun +dolunscan() +{ + SCSISTR= + devnr="$host $channel $id $lun" + echo "Scanning for device $devnr ..." + printf "${yellow}OLD: $norm" + testexist + : f $remove s $SCSISTR + if test "$remove" -a "$SCSISTR"; then + # Device exists: Test whether it's still online + # (testonline returns 1 if it's gone or has changed) + testonline + if test $? = 1 -o ! -z "$forceremove"; then + echo -en "\r\e[A\e[A\e[A${red}REM: " + echo "$SCSISTR" | head -n1 + echo -e "${norm}\e[B\e[B" + if test -e /sys/class/scsi_device/${host}:${channel}:${id}:${lun}/device; then + echo 1 > /sys/class/scsi_device/${host}:${channel}:${id}:${lun}/device/delete + # Try readding, should fail if device is gone + echo "$channel $id $lun" > /sys/class/scsi_host/host${host}/scan + else + echo "scsi remove-single-device $devnr" > /proc/scsi/scsi + # Try readding, should fail if device is gone + echo "scsi add-single-device $devnr" > /proc/scsi/scsi + fi + fi + printf "\r\x1b[A\x1b[A\x1b[A${yellow}OLD: $norm" + testexist + if test -z "$SCSISTR"; then + printf "\r${red}DEL: $norm\r\n\n" + let rmvd+=1; + fi + fi + if test -z "$SCSISTR"; then + # Device does not exist, try to add + printf "\r${green}NEW: $norm" + if test -e /sys/class/scsi_host/host${host}/scan; then + echo "$channel $id $lun" > /sys/class/scsi_host/host${host}/scan 2> /dev/null + else + echo "scsi add-single-device $devnr" > /proc/scsi/scsi + fi + testexist + if test -z "$SCSISTR"; then + # Device not present + printf "\r\x1b[A"; + # Optimization: if lun==0, stop here (only if in non-remove mode) + if test $lun = 0 -a -z "$remove" -a $optscan = 1; then + break; + fi + else + let found+=1; + fi + fi +} + +# Perform report lun scan +doreportlun() +{ + lun=0 + SCSISTR= + devnr="$host $channel $id $lun" + echo "Scanning for device $devnr ..." + printf "${yellow}OLD: $norm" + testexist + if test -z "$SCSISTR"; then + # Device does not exist, try to add + printf "\r${green}NEW: $norm" + if test -e /sys/class/scsi_host/host${host}/scan; then + echo "$channel $id $lun" > /sys/class/scsi_host/host${host}/scan 2> /dev/null + else + echo "scsi add-single-device $devnr" > /proc/scsi/scsi + fi + testexist + if test -z "$SCSISTR"; then + # Device not present + printf "\r\x1b[A"; + lunsearch= + return + fi + fi + lunsearch=`getluns` + lunremove= + # Check existing luns + for dev in /sys/class/scsi_device/$host:$channel:$id:*; do + lun=${dev##*:} + newsearch= + oldsearch="$lunsearch" + for tmplun in $lunsearch; do + if test $tmplun -eq $lun ; then + # Optimization: don't scan lun 0 again + if [ $lun -ne 0 ]; then + dolunscan + fi + else + newsearch="$newsearch $tmplun" + fi + done + if [ "${#oldsearch}" = "${#newsearch}" ] ; then + # Stale lun + lunremove="$lunremove $lun" + fi + lunsearch="$newsearch" + done + # Add new ones and check stale ones + for lun in $lunsearch $lunremove; do + dolunscan + done +} + # Perform search (scan $host) dosearch () { + if test -z "$channelsearch" ; then + chanlist + fi for channel in $channelsearch; do + if test -z "$idsearch" ; then + idlist + fi for id in $idsearch; do - for lun in $lunsearch; do - SCSISTR= - devnr="$host $channel $id $lun" - echo "Scanning for device $devnr ..." - printf "${yellow}OLD: $norm" - testexist - if test ! -z "$remove" -a ! -z "$SCSISTR"; then - # Device exists: Test whether it's still online - # (testonline returns 1 if it's gone or has changed) - testonline - if test $? = 1 -o ! -z "$forceremove"; then - echo -en "\r\e[A\e[A\e[A${red}REM: " - echo "$SCSISTR" | head -n1 - echo -e "${norm}\e[B\e[B" - if test -e /sys/class/scsi_device/${host}:${channel}:${id}:${lun}/device; then - echo 1 > /sys/class/scsi_device/${host}:${channel}:${id}:${lun}/device/delete - # Try readding, should fail if device is gone - echo "$channel $id $lun" > /sys/class/scsi_host/host${host}/scan - else - echo "scsi remove-single-device $devnr" > /proc/scsi/scsi - # Try readding, should fail if device is gone - echo "scsi add-single-device $devnr" > /proc/scsi/scsi - fi - fi - printf "\r\x1b[A\x1b[A\x1b[A${yellow}OLD: $norm" - testexist - if test -z "$SCSISTR"; then - printf "\r${red}DEL: $norm\r\n\n\n\n" - let rmvd+=1; - fi - fi - if test -z "$SCSISTR"; then - # Device does not exist, try to add - printf "\r${green}NEW: $norm" - if test -e /sys/class/scsi_host/host${host}/scan; then - echo "$channel $id $lun" > /sys/class/scsi_host/host${host}/scan 2> /dev/null - else - echo "scsi add-single-device $devnr" > /proc/scsi/scsi - fi - testexist - if test -z "$SCSISTR"; then - # Device not present - printf "\r\x1b[A"; - # Optimization: if lun==0, stop here (only if in non-remove mode) - if test $lun = 0 -a -z "$remove" -a $optscan = 1; then - break; - fi - else - let found+=1; - fi - fi - done + if test -z $lunsearch ; then + doreportlun + else + for lun in $lunsearch; do + dolunscan + done + fi done done } @@ -272,7 +406,9 @@ echo " -w scan for target device IDs 0 .. 15 [default: 0-7]" echo " -c enables scanning of channels 0 1 [default: 0]" echo " -r enables removing of devices [default: disabled]" + echo " -i issue a FibreChannel LIP reset [default: disabled]" echo "--remove: same as -r" + echo "--issue-lip: same as -i" echo "--forceremove: Remove and readd every device (DANGEROUS)" echo "--nooptscan: don't stop looking for LUNs is 0 is not found" echo "--color: use coloured prefixes OLD/NEW/DEL" @@ -318,7 +454,7 @@ # defaults unsetcolor -lunsearch="0" +lunsearch="" idsearch=`seq 0 7` channelsearch="0" remove= @@ -340,6 +476,7 @@ w) idsearch=`seq 0 15` ;; c) channelsearch="0 1" ;; r) remove=1 ;; + i) lipreset=1 ;; -remove) remove=1 ;; -forceremove) remove=1; forceremove=1 ;; -hosts=*) arg=${opt#-hosts=}; hosts=`expandlist $arg` ;; @@ -348,6 +485,7 @@ -luns=*) arg=${opt#-luns=}; lunsearch=`expandlist $arg` ;; -color) setcolor ;; -nooptscan) optscan=0 ;; + -issue-lip) lipreset=1 ;; *) echo "Unknown option -$opt !" ;; esac shift @@ -359,15 +497,33 @@ hosts=$*; fi -echo "Scanning hosts $hosts channels $channelsearch for " -echo " SCSI target IDs " $idsearch ", LUNs " $lunsearch +echo "Scanning SCSI subsystem for new devices" test -z "$remove" || echo " and remove devices that have disappeared" declare -i found=0 declare -i rmvd=0 -for host in $hosts; do - # YOU MAY NEED TO UNCOMMENT THESE TO ALLOW FOR A RESCAN - #test -e /sys/class/fc_host/host$host/issue_lip && echo 1 > /sys/class/fc_host/host$host/issue_lip 2> /dev/null; - #echo "- - -" > /sys/class/scsi_host/host$host/scan 2> /dev/null; +for host in $hosts; do + echo -n "Scanning host $host " + if test -e /sys/class/fc_host/host$host ; then + # It's pointless to do a target scan on FC + if test -n "$lipreset" ; then + echo 1 > /sys/class/fc_host/host$host/issue_lip 2> /dev/null; + echo "- - -" > /sys/class/scsi_host/host$host/scan 2> /dev/null; + fi + channelsearch="" + idsearch="" + fi + [ -n "$channelsearch" ] && echo -n "channels $channelsearch " + echo -n "for " + if [ -n "$idsearch" ] ; then + echo -n " SCSI target IDs " $idsearch + else + echo -n " all SCSI target IDs" + fi + if [ -n "$lunsearch" ] ; then + echo ", LUNs " $lunsearch + else + echo ", all LUNs" + fi dosearch; done echo "$found new device(s) found. " ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Remember to have fun... --------------------------------------------------------------------- To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-commit+help@opensuse.org