Blob Blame History Raw
From 38842b5eafcd85bc91d96e2b2d0b99ea8864d907 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Dan=20Hor=C3=A1k?= <dan@danny.cz>
Date: Thu, 14 Jan 2010 12:50:05 +0100
Subject: [PATCH 1/4] netapp - fixes in doreportlun

---
 rescan-scsi-bus.sh |   64 ++++++++++++++++++++++++++++++++++------------------
 1 files changed, 42 insertions(+), 22 deletions(-)

diff --git a/rescan-scsi-bus.sh b/rescan-scsi-bus.sh
index af1f843..8d52e39 100644
--- a/rescan-scsi-bus.sh
+++ b/rescan-scsi-bus.sh
@@ -371,38 +371,58 @@ dolunscan()
 # Perform report lun scan
 doreportlun()
 {
-  lun=0
+  lun=
   SCSISTR=
-  devnr="$host $channel $id $lun"
-  echo "Scanning for device $devnr ..."
-  #printf "${yellow}OLD: $norm"
-  testexist -q
-  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
+  for dev in /sys/class/scsi_device/${host}:${channel}:${id}:*; do
+        if [ -d "$dev" ]; then
+                lun=${dev##*:}
+                break
+        else
+                continue
+        fi
+  done
+  #If not a single LUN is present then assign lun=0
+  if [ -z $lun ]; then
+    lun=0
+    devnr="$host $channel $id $lun"
+    echo "Scanning for device $devnr ..."
+    printf "${yellow}OLD: $norm"
     testexist -1
     if test -z "$SCSISTR"; then
-      # Device not present
-      printf "\r\x1b[A";
-      lunsearch=
-      return
+      # 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
     #testonline
   fi
-  lunsearch=`getluns`
+  flag=0
+  lun_search="`getluns`"
+  # Set flag=1 if all the LUNs are removed
+  if [ "${#lun_search}" = "1" ]; then
+    flag=1
+  fi
   lunremove=
   # Check existing luns
   for dev in /sys/class/scsi_device/${host}:${channel}:${id}:*; do
     [ -d "$dev" ] || continue
     lun=${dev##*:}
+    if [ "$flag" = "1" ]; then
+      lunremove="$lunremove $lun"
+    fi
     newsearch=
-    oldsearch="$lunsearch"
-    for tmplun in $lunsearch; do
+    oldsearch="$lun_search"
+    for tmplun in $lun_search; do
       if test $tmplun -eq $lun ; then
 	dolunscan
       else
@@ -413,10 +433,10 @@ doreportlun()
 	# Stale lun
 	lunremove="$lunremove $lun"
     fi
-    lunsearch="$newsearch"
+    lun_search="$newsearch"
   done
   # Add new ones and check stale ones
-  for lun in $lunsearch $lunremove; do
+  for lun in $lun_search $lunremove; do
     dolunscan
   done
 }
-- 
1.6.5.2

From 0e94e0c27d575f18a57938b9d98dfe02d8c11eb9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Dan=20Hor=C3=A1k?= <dan@danny.cz>
Date: Thu, 14 Jan 2010 12:50:59 +0100
Subject: [PATCH 2/4] netapp - LIP is not required to do a scan on FC

---
 rescan-scsi-bus.sh |    3 +--
 1 files changed, 1 insertions(+), 2 deletions(-)

diff --git a/rescan-scsi-bus.sh b/rescan-scsi-bus.sh
index 8d52e39..13e9283 100644
--- a/rescan-scsi-bus.sh
+++ b/rescan-scsi-bus.sh
@@ -587,11 +587,10 @@ declare -i rmvd=0
 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
+    echo "- - -" > /sys/class/scsi_host/host$host/scan 2> /dev/null;
     channelsearch=""
     idsearch=""
   fi
-- 
1.6.5.2

From c3b67a28289bb010d141e172a184982c40e2fff2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Dan=20Hor=C3=A1k?= <dan@danny.cz>
Date: Thu, 14 Jan 2010 12:51:31 +0100
Subject: [PATCH 3/4] space before getluns call is required

---
 rescan-scsi-bus.sh |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/rescan-scsi-bus.sh b/rescan-scsi-bus.sh
index 13e9283..26a9853 100644
--- a/rescan-scsi-bus.sh
+++ b/rescan-scsi-bus.sh
@@ -407,7 +407,7 @@ doreportlun()
     #testonline
   fi
   flag=0
-  lun_search="`getluns`"
+  lun_search=" `getluns`"
   # Set flag=1 if all the LUNs are removed
   if [ "${#lun_search}" = "1" ]; then
     flag=1
-- 
1.6.5.2

From 5c10b085e2e83f371eddee16937157b0e7f63d5b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Dan=20Hor=C3=A1k?= <dan@danny.cz>
Date: Thu, 14 Jan 2010 15:15:34 +0100
Subject: [PATCH 4/4] wait for device

When a device reports "unit attention" state after calling sg_turs, then wait until the device comes online or a timeout is reached.
---
 rescan-scsi-bus.sh |    8 ++++++--
 1 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/rescan-scsi-bus.sh b/rescan-scsi-bus.sh
index 26a9853..23fba7d 100644
--- a/rescan-scsi-bus.sh
+++ b/rescan-scsi-bus.sh
@@ -195,8 +195,12 @@ 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=$?
+  for t in 1 2 3 4 5; do
+    sg_turs /dev/$SGDEV >/dev/null 2>&1
+    RC=$?
+    [ $RC -ne 6 ] && break
+    sleep $t
+  done
   # 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
-- 
1.6.5.2