You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
147 lines
4.3 KiB
147 lines
4.3 KiB
From 6c7c8d8a071694efd0c7e450fa78e71224a8ced4 Mon Sep 17 00:00:00 2001 |
|
From: Harald Hoyer <harald@redhat.com> |
|
Date: Wed, 22 Jan 2014 17:05:22 +0100 |
|
Subject: [PATCH] iscsi: more iscsiroot fixes |
|
|
|
handle iscsiroot with firmware more gracefully |
|
--- |
|
modules.d/95iscsi/iscsiroot.sh | 68 +++++++++++++++++++--------- |
|
modules.d/95iscsi/parse-iscsiroot.sh | 6 +-- |
|
2 files changed, 50 insertions(+), 24 deletions(-) |
|
|
|
diff --git a/modules.d/95iscsi/iscsiroot.sh b/modules.d/95iscsi/iscsiroot.sh |
|
index 156003c0..68687102 100755 |
|
--- a/modules.d/95iscsi/iscsiroot.sh |
|
+++ b/modules.d/95iscsi/iscsiroot.sh |
|
@@ -31,36 +31,45 @@ iroot="$2" |
|
# If it's not iscsi we don't continue |
|
[ "${iroot%%:*}" = "iscsi" ] || exit 1 |
|
|
|
-iroot=${iroot#iscsi:} |
|
+iroot=${iroot#iscsi} |
|
+iroot=${iroot#:} |
|
|
|
# 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 2>/dev/null |
|
|
|
-[ -e /sys/module/bnx2i ] && iscsiuio |
|
- |
|
-if getargbool 0 rd.iscsi.firmware -d -y iscsi_firmware ; then |
|
- for p in $(getargs rd.iscsi.param -d iscsi_param); do |
|
- iscsi_param="$iscsi_param --param $p" |
|
- done |
|
+if [ -e /sys/module/bnx2i ] && ! [ -e /tmp/iscsiuio-started ]; then |
|
+ iscsiuio |
|
+ > /tmp/iscsiuio-started |
|
+fi |
|
|
|
+handle_firmware() |
|
+{ |
|
if ! [ -e /tmp/iscsistarted-firmware ]; then |
|
- if ! iscsistart -f | vinfo; then |
|
+ if ! iscsistart -f; then |
|
warn "iscistart: Could not get list of targets from firmware." |
|
- exit 1 |
|
+ return 1 |
|
fi |
|
|
|
- if ! iscsistart -b $iscsi_param 2>&1 | vinfo; then |
|
+ for p in $(getargs rd.iscsi.param -d iscsi_param); do |
|
+ iscsi_param="$iscsi_param --param $p" |
|
+ done |
|
+ |
|
+ if ! iscsistart -b $iscsi_param; then |
|
warn "\`iscsistart -b $iscsi_param\´ failed" |
|
- exit 1 |
|
fi |
|
- echo 'started' > "/tmp/iscsistarted-iscsi" |
|
- echo 'started' > "/tmp/iscsistarted-firmware" |
|
+ |
|
+ if [ -d /sys/class/iscsi_session ]; then |
|
+ echo 'started' > "/tmp/iscsistarted-iscsi" |
|
+ echo 'started' > "/tmp/iscsistarted-firmware" |
|
+ else |
|
+ return 1 |
|
+ fi |
|
+ |
|
need_shutdown |
|
fi |
|
- |
|
- [ "$netif" = dummy ] && exit 0 |
|
-fi |
|
+ return 0 |
|
+} |
|
|
|
|
|
handle_netroot() |
|
@@ -171,21 +180,38 @@ handle_netroot() |
|
|
|
netroot_enc=$(str_replace "$1" '/' '\2f') |
|
echo 'started' > "/tmp/iscsistarted-iscsi:${netroot_enc}" |
|
- |
|
} |
|
|
|
+ret=0 |
|
+ |
|
# loop over all netroot parameter |
|
if getarg netroot; then |
|
for nroot in $(getargs netroot); do |
|
- [ "${netroot%%:*}" = "iscsi" ] || continue |
|
- handle_netroot ${nroot##iscsi:} |
|
+ [ "${nroot%%:*}" = "iscsi" ] || continue |
|
+ nroot="${nroot##iscsi:}" |
|
+ if [ -n "$nroot" ]; then |
|
+ handle_netroot "$nroot" |
|
+ ret=$(($ret + $?)) |
|
+ fi |
|
done |
|
+ if getargbool 0 rd.iscsi.firmware -d -y iscsi_firmware ; then |
|
+ handle_firmware |
|
+ ret=$(($ret + $?)) |
|
+ fi |
|
else |
|
- handle_netroot $iroot |
|
+ if [ -n "$iroot" ]; then |
|
+ handle_netroot "$iroot" |
|
+ ret=$? |
|
+ else |
|
+ if getargbool 0 rd.iscsi.firmware -d -y iscsi_firmware ; then |
|
+ handle_firmware |
|
+ ret=$? |
|
+ fi |
|
+ fi |
|
fi |
|
|
|
need_shutdown |
|
|
|
# now we have a root filesystem somewhere in /dev/sda* |
|
# let the normal block handler handle root= |
|
-exit 0 |
|
+exit $ret |
|
diff --git a/modules.d/95iscsi/parse-iscsiroot.sh b/modules.d/95iscsi/parse-iscsiroot.sh |
|
index e463addb..4be9d561 100755 |
|
--- a/modules.d/95iscsi/parse-iscsiroot.sh |
|
+++ b/modules.d/95iscsi/parse-iscsiroot.sh |
|
@@ -61,10 +61,10 @@ fi |
|
|
|
# iscsi_firmware does not need argument checking |
|
if [ -n "$iscsi_firmware" ] ; then |
|
- netroot=${netroot:-iscsi} |
|
+ netroot=${netroot:-iscsi:} |
|
modprobe -q iscsi_boot_sysfs 2>/dev/null |
|
modprobe -q iscsi_ibft |
|
- initqueue --settled /sbin/iscsiroot dummy "$netroot" "$NEWROOT" |
|
+ initqueue --onetime --timeout "/sbin/iscsiroot dummy '$netroot' '$NEWROOT'" |
|
fi |
|
|
|
# If it's not iscsi we don't continue |
|
@@ -88,7 +88,7 @@ fi |
|
|
|
if [ -n "$netroot" ] && [ "$root" != "/dev/root" ] && [ "$root" != "dhcp" ]; then |
|
if ! getargbool 1 rd.neednet >/dev/null || ! getarg "ip="; then |
|
- initqueue --onetime --settled /sbin/iscsiroot dummy "$netroot" "$NEWROOT" |
|
+ initqueue --onetime --settled "/sbin/iscsiroot dummy '$netroot' '$NEWROOT'" |
|
fi |
|
fi |
|
|
|
|