From d285e2787a7f9bc938bf1628aa483e62c07b3459 Mon Sep 17 00:00:00 2001
From: Hannes Reinecke <hare@suse.de>
Date: Thu, 25 Mar 2010 15:38:52 +0100
Subject: [PATCH] Load transport modules on startup

iSCSI Offload Engines require a separate module which is
not autoloaded normally. And we don't want to load the
modules per default as normally iSCSI Offloading is
not used; it has to be configured explicitely.
So we need to check if an interface has been configured
on these iOE NICs before loading the module.

References: bnc#590531

Signed-off-by: Hannes Reinecke <hare@suse.de>

diff --git a/etc/initd/initd.suse b/etc/initd/initd.suse
index 01370b4..8bc8a5b 100644
--- a/etc/initd/initd.suse
+++ b/etc/initd/initd.suse
@@ -39,6 +39,37 @@ iscsi_login_all_nodes()
 }
 
 #
+# Try to load all required modules prior to startup
+#
+iscsi_load_transport_modules()
+{
+    loaded=$(sed -n "/^iscsi_tcp/p" /proc/modules)
+    if [ -z "$loaded" ] ; then
+	modprobe iscsi_tcp
+	if [ $? = 0 ] ; then
+	    echo -n " tcp"
+	fi
+    fi
+
+    for iface in /etc/iscsi/ifaces/*; do
+	[ -f "$iface" ] || continue
+	[ "$iface" = "iface.example" ] && continue
+	# Check if the iface has been configured
+	result=$(sed '/#.*/D;/iface.iscsi_ifacename/D;/iface.hwaddress/D;/iface.transport_name/D' $iface)
+	if [ "$result" ] ; then
+	    mod=$(sed -n 's/iface.transport_name *= *\(.*\)/\1/p' $iface)
+	    loaded=$(sed -n "/^$mod/p" /proc/modules)
+	    if [ -z "$loaded" ] ; then
+		modprobe $mod
+		if [ $? = 0 ] ; then
+		    echo -n " $mod"
+		fi
+	    fi
+	fi
+    done
+}
+
+#
 # Set a temporary startmode for ifdown
 #
 iscsi_modify_if_startmode()
@@ -284,10 +315,8 @@ case "$1" in
 	    RETVAL=0
 	else
 	    echo -n "Starting iSCSI initiator service: "
-	    modprobe iscsi_tcp
-	    modprobe -q ib_iser
-	    if grep -q bnx2 /proc/modules ; then
-		modprobe -q bnx2i
+	    iscsi_load_transport_modules
+	    if grep -q bnx2i /proc/modules ; then
 		startproc $BRCM_ISCSIUIO
 	    fi
 	    startproc $DAEMON $ARGS
@@ -299,8 +328,8 @@ case "$1" in
 	fi
 	;;
     stop)
-	echo -n "Stopping iSCSI initiator service: "
 	iscsi_stop_sessions
+	echo -n "Stopping iSCSI initiator service: "
 	m=$(iscsiadm -m session 2> /dev/null)
 	if [ -z "$m" ] ; then
 	    killproc -KILL $DAEMON
@@ -312,31 +341,7 @@ case "$1" in
 	else
 	    RETVAL=1
 	fi
-	if [ "$RETVAL" == "0" ]; then
-	    status=0
-	    if grep -q bnx2i /proc/modules ; then
-		modprobe -r bnx2i
-		if [ "$?" -ne "0" -a "$?" -ne "1" ]; then
-	    	    status=1
-		fi
-	    fi
-
-	    if [ "$status" -eq 0 ] ; then
-		modprobe -r iscsi_tcp
-		if [ "$?" -ne "0" -a "$?" -ne "1" ]; then
-	    	    status=1
-		fi
-	    fi
-	    if [ "$status" -eq 0 ] ; then
-		modprobe -q -r ib_iser
-		if [ "$?" -ne "0" -a "$?" -ne "1" ]; then
-	            status=1 
-		fi
-	    fi
-	    rc_failed $status
-	else
-	    rc_failed $RETVAL
-	fi
+	rc_failed $RETVAL
 	rc_status -v
 	;;
     status)
