---
modules.d/95iscsi/iscsi-netroot.sh   |   13 ---
modules.d/95iscsi/iscsiroot          |  186 ++++++++++++++++++---------------
modules.d/95iscsi/install            |    1 -
modules.d/95iscsi/parse-iscsiroot.sh |   93 ++++++++++++-----
4 files changed, 169 insertions(+), 121 deletions(-)

diff --git a/modules.d/95iscsi/install b/modules.d/95iscsi/install
index cd4a3ca..613c752 100755
--- a/modules.d/95iscsi/install
+++ b/modules.d/95iscsi/install
@@ -4,6 +4,5 @@ inst iscsistart
inst hostname
inst iscsi-iname
inst_hook cmdline 90 "$moddir/parse-iscsiroot.sh"
-inst_hook netroot 90 "$moddir/iscsi-netroot.sh"
inst "$moddir/iscsiroot" "/sbin/iscsiroot"
instmods iscsi_tcp crc32c
diff --git a/modules.d/95iscsi/iscsi-netroot.sh 
b/modules.d/95iscsi/iscsi-netroot.sh
deleted file mode 100755
index 4f02239..0000000
--- a/modules.d/95iscsi/iscsi-netroot.sh
+++ /dev/null
@@ -1,13 +0,0 @@
-if [ "$root" = "dhcp" ]; then
-    if [ -n "$new_root_path" -a -z "${new_root_path%%iscsi:*}" ]; then
-       root="$new_root_path"
-    fi
-fi
-
-if [ -z "${root%iscsi:*}" ]; then
-    handler=/sbin/iscsiroot
-fi
-
-if getarg iscsiroot >/dev/null; then
-    handler=/sbin/iscsiroot
-fi
diff --git a/modules.d/95iscsi/iscsiroot b/modules.d/95iscsi/iscsiroot
index 8e20fda..b042caf 100755
--- a/modules.d/95iscsi/iscsiroot
+++ b/modules.d/95iscsi/iscsiroot
@@ -1,108 +1,124 @@
#!/bin/sh
+#
+# This implementation is incomplete: Discovery mode is not implemented and
+# the argument handling doesn't follow currently agreed formats. This is mainly
+# because rfc4173 does not say anything about iscsi_initiator but open-iscsi's +# iscsistart needs this.
+#

. /lib/dracut-lib

PATH=$PATH:/sbin:/usr/sbin

-# XXX needs error handling like ifup/dhclient-script
-
if getarg rdnetdebug; then
    exec > /tmp/iscsiroot.$1.$$.out
    exec 2>> /tmp/iscsiroot.$1.$$.out
    set -x
fi

-# read static conf settings
-for conf in conf/conf.d/*; do
-       [ -f ${conf} ] && . ${conf}
-done
+# Huh? Empty $1?
+[ -z "$1" ] && exit 1
+
+# Huh? Empty $2?
+[ -z "$2" ] && exit 1

# root is in the form 
root=iscsi:[<servername>]:[<protocol>]:[<port>]:[<LUN>]:<targetname>
+# or root=iscsi:iscsi_firmware
netif="$1"
root="$2"

+# read static conf settings
+# XXX Where are these from?
+for conf in conf/conf.d/*; do
+        [ -f ${conf} ] && . ${conf}
+done
+
+# If it's not iscsi we don't continue
+[ "${root%%:*}" = "iscsi" ] || exit 1
+
+# XXX modprobe crc32c should go in the cmdline parser, but I haven't yet
+# figured out a way how to check whether this is built-in or not
+modprobe crc32c

-if [ $root = ${root#iscsi:} ]; then
-       iroot=$(getarg iscsiroot)
-else
-       iroot=${root#iscsi:}
+if getarg iscsi_firmware ; then
+ echo iscsistart -b + exit 0
fi

-if getarg iscsi_firmware >/dev/null; then
-       modprobe iscsi_tcp
-       modprobe crc32c
-       iscsistart -b
-else
-       # override conf settings by command line options
-       arg=$(getarg iscsi_initiator)
-       [ -n "$arg" ] && iscsi_initiator=$arg
-       arg=$(getarg iscsi_initiator)
-       [ -n "$arg" ] && iscsi_target_name=$arg
-       arg=$(getarg iscsi_target_ip)
-       [ -n "$arg" ] && iscsi_target_ip=$arg
-       arg=$(getarg iscsi_target_port)
-       [ -n "$arg" ] && iscsi_target_port=$arg
-       arg=$(getarg iscsi_target_group)
-       [ -n "$arg" ] && iscsi_target_group=$arg
-       arg=$(getarg iscsi_username)
-       [ -n "$arg" ] && iscsi_username=$arg
-       arg=$(getarg iscsi_password)
-       [ -n "$arg" ] && iscsi_password=$arg
-       arg=$(getarg iscsi_in_username)
-       [ -n "$arg" ] && iscsi_in_username=$arg
-       arg=$(getarg iscsi_in_password)
-       [ -n "$arg" ] && iscsi_in_password=$arg
-
-
-       # override conf/commandline options by dhcp root_path
-       OLDIFS="$IFS"
-       IFS=:
-       set $iroot
-       iscsi_target_ip=$1; shift
-       iscsi_protocol=$1; shift # ignored
-       iscsi_target_port=$1; shift
-       iscsi_lun=$1; shift
-       iscsi_target_name=$*
-       IFS="$OLDIFS"
-
-       getarg ro && iscsirw=ro
-       getarg rw && iscsirw=rw
-       fsopts=${fsopts+$fsopts,}${iscsirw}
-
-       modprobe iscsi_tcp
-       modprobe crc32c
-
-       if [ -z $iscsi_initiator ]; then
-               [ -f /etc/initiatorname.iscsi ] && . /etc/initiatorname.iscsi
-               [ -f /etc/iscsi/initiatorname.iscsi ] && . 
/etc/iscsi/initiatorname.iscsi
-               iscsi_initiator=$InitiatorName
-       fi
-
-       if [ -z $iscsi_target_port ]; then
-               iscsi_target_port=3260
-       fi
-
-       if [ -z $iscsi_target_group ]; then
-               iscsi_target_group=1
-       fi
-
-       if [ -z $iscsi_initiator ]; then
-               iscsi_initiator=$(iscsi-iname)
-       fi
-
-       echo "InitiatorName='$iscsi_initiator'" > /dev/.initiatorname.iscsi
-
-       # FIXME $iscsi_lun?? $iscsi_protocol??
-
-       iscsistart -i $iscsi_initiator -t $iscsi_target_name    \
-                  -g $iscsi_target_group -a $iscsi_target_ip   \
-                  -p $iscsi_target_port \
-                  ${iscsi_username+-u $iscsi_username} \
-                  ${iscsi_password+-w $iscsi_password} \
-                  ${iscsi_in_username+-U $iscsi_in_username} \
-                  ${iscsi_in_password+-W $iscsi_in_password}
-       # now we have a root filesystem somewhere in /dev/sda*
-       # let the normal block handler handle root=
+# override conf settings by command line options
+arg=$(getarg iscsi_initiator)
+[ -n "$arg" ] && iscsi_initiator=$arg
+arg=$(getarg iscsi_target_name)
+[ -n "$arg" ] && iscsi_target_name=$arg
+arg=$(getarg iscsi_target_ip)
+[ -n "$arg" ] && iscsi_target_ip=$arg
+arg=$(getarg iscsi_target_port)
+[ -n "$arg" ] && iscsi_target_port=$arg
+arg=$(getarg iscsi_target_group)
+[ -n "$arg" ] && iscsi_target_group=$arg
+arg=$(getarg iscsi_username)
+[ -n "$arg" ] && iscsi_username=$arg
+arg=$(getarg iscsi_password)
+[ -n "$arg" ] && iscsi_password=$arg
+arg=$(getarg iscsi_in_username)
+[ -n "$arg" ] && iscsi_in_username=$arg
+arg=$(getarg iscsi_in_password)
+[ -n "$arg" ] && iscsi_in_password=$arg
+
+# override conf/commandline options by dhcp root_path
+# FIXME this assumes that all values have been provided
+iroot=$root
+OLDIFS="$IFS"
+IFS=:
+set $iroot
+iscsi_target_ip=$1; shift
+iscsi_protocol=$1; shift # ignored
+iscsi_target_port=$1; shift
+iscsi_lun=$1; shift
+iscsi_target_name=$*
+IFS="$OLDIFS"
+
+# XXX is this needed?
+getarg ro && iscsirw=ro
+getarg rw && iscsirw=rw
+fsopts=${fsopts+$fsopts,}${iscsirw}
+       
+if [ -z $iscsi_initiator ]; then
+    # XXX Where are these from?
+    [ -f /etc/initiatorname.iscsi ] && . /etc/initiatorname.iscsi
+    [ -f /etc/iscsi/initiatorname.iscsi ] && . /etc/iscsi/initiatorname.iscsi
+    iscsi_initiator=$InitiatorName
+
+    # XXX rfc3720 says 'SCSI Initiator Name: The iSCSI Initiator Name specifies
+    # the worldwide unique name of the initiator.' Could we use hostname/ip
+    # if missing?
fi

+if [ -z $iscsi_target_port ]; then
+    iscsi_target_port=3260
+fi
+
+if [ -z $iscsi_target_group ]; then
+    iscsi_target_group=1
+fi
+
+if [ -z $iscsi_initiator ]; then
+    # XXX is this correct?
+    iscsi_initiator=$(iscsi-iname)
+fi
+
+echo "InitiatorName='$iscsi_initiator'" > /dev/.initiatorname.iscsi
+
+# FIXME $iscsi_lun?? $iscsi_protocol??
+
+iscsistart -i $iscsi_initiator -t $iscsi_target_name   \
+    -g $iscsi_target_group -a $iscsi_target_ip \
+    -p $iscsi_target_port \
+    ${iscsi_username+-u $iscsi_username} \
+    ${iscsi_password+-w $iscsi_password} \
+    ${iscsi_in_username+-U $iscsi_in_username} \
+    ${iscsi_in_password+-W $iscsi_in_password}
+
+# now we have a root filesystem somewhere in /dev/sda*
+# let the normal block handlers should mount root
exit 0
diff --git a/modules.d/95iscsi/parse-iscsiroot.sh 
b/modules.d/95iscsi/parse-iscsiroot.sh
index 4115248..1ba4277 100755
--- a/modules.d/95iscsi/parse-iscsiroot.sh
+++ b/modules.d/95iscsi/parse-iscsiroot.sh
@@ -1,32 +1,75 @@
-# XXX actually we could, if we move to root=XXX and netroot=XXX, then
-# you could do root=LABEL=/ iscsiroot=XXX, or netroot=iscsi:XXX
-#
+#!/bin/sh
#
# Preferred format:
-#       root=iscsi:[<servername>]:[<protocol>]:[<port>]:[<LUN>]:<targetname>
+#      root=iscsi:[<servername>]:[<protocol>]:[<port>]:[<LUN>]:<targetname>
+#      [root=*] 
netroot=iscsi:[<servername>]:[<protocol>]:[<port>]:[<LUN>]:<targetname>
#
# Legacy formats:
-#       iscsiroot=[<servername>]:[<protocol>]:[<port>]:[<LUN>]:<targetname>
-#      root=dhcp 
iscsiroot=[<servername>]:[<protocol>]:[<port>]:[<LUN>]:<targetname>
-#      root=iscsi 
iscsiroot=[<servername>]:[<protocol>]:[<port>]:[<LUN>]:<targetname>
-#       root=??? iscsi_initiator= iscsi_target_name= iscsi_target_ip= 
iscsi_target_port= iscsi_target_group= iscsi_username= iscsi_password= 
iscsi_in_username= iscsi_in_password=
-#       root=??? iscsi_firmware
-
-case "$root" in
-    iscsi|dhcp|'')
-       if getarg iscsiroot= > /dev/null; then
-           root=iscsi:$(getarg iscsiroot=)
-       fi
-       ;;
-esac
-
-if [ "${root%%:*}" = "iscsi" ]; then
-    # XXX validate options here?
-    # XXX generate udev rules?
-    rootok=1
-    netroot=iscsi
+#      [net]root=[iscsi] 
iscsiroot=[<servername>]:[<protocol>]:[<port>]:[<LUN>]:<targetname>
+#      [net]root=[iscsi] iscsi_firmware
+#
+# root= takes precedence over netroot= if root=iscsi[...]
+#
+
+# Don't continue if root is ok
+[ -n "$rootok" ] && return
+
+# This script is sourced, so root should be set. But let's be paranoid
+[ -z "$root" ] && root=$(getarg root=)
+[ -z "$netroot" ] && netroot=$(getarg netroot=)
+[ -z "$iscsiroot" ] && iscsiroot=$(getarg iscsiroot=)
+[ -z "$iscsi_firmware" ] && getarg iscsi_firmware && iscsi_firmware="1"
+
+[ -n "$iscsiroot" ] && [ -n "$iscsi_firmware" ] && die "Mixing iscsiroot and 
iscsi_firmware is dangerous"
+
+# Root takes precedence over netroot
+if [ "${root%%:*}" = "iscsi" ] ; then
+    if [ -n "$netroot" ] ; then
+       echo "Warning: root takes precedence over netroot. Ignoring netroot"
+
+    fi
+    netroot=$root
+fi
+
+# If it's not empty or iscsi we don't continue
+[ -z "$netroot" ] || [ "${netroot%%:*}" = "iscsi" ] || return
+
+if [ -n "$iscsiroot" ] ; then
+    [ -z "$netroot" ]  && netroot=$root
+
+    # @deprecated
+    echo "Warning: Argument isciroot is deprecated and might be removed in a 
future"
+    echo "release. See http://apps.sourceforge.net/trac/dracut/wiki/commandline 
for"
+    echo "more information."
+
+    # Accept iscsiroot argument?
+    [ -z "$netroot" ] || [ "$netroot" = "iscsi" ] || \
+       die "Argument iscsiroot only accepted for empty root= or 
[net]root=iscsi"
+
+    # Override root with iscsiroot content?
+    [ -z "$netroot" ] || [ "$netroot" = "iscsi" ] && netroot=iscsi:$iscsiroot
+fi
+
+# iscsi_firmware does not need argument checking
+if [ -n "$iscsi_firmware" ] ; then
+    netroot=${netroot:-iscsi}
fi

-if getarg iscsiroot; then
-       netroot=iscsi
+# If it's not iscsi we don't continue
+[ "${netroot%%:*}" = "iscsi" ] || return
+
+# Check required arguments. there's only one, but it's at the end
+if [ -z "$iscsi_firmware" ] ; then
+    case "${netroot##iscsi:*:*:*:*:}" in
+       $netroot|'') die "Argument targetname for iscsiroot is missing";;
+    esac
fi
+
+# ISCSI actually supported?
+[ -e /sys/devices/virtual/iscsi_transport ] || modprobe iscsi_tcp || die "iscsiroot 
requested but kernel/initrd does not support iscsi"
+
+# Done, all good!
+rootok=1
+
+# Shut up init error check
+[ -z "$root" ] && root="iscsi"
--
To unsubscribe from this list: send the line "unsubscribe initramfs" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to