Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
SUSE:SLE-12:Update
dracut.1458
0180-iscsi_multipath_fixes.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 0180-iscsi_multipath_fixes.patch of Package dracut.1458
diff -Naur a/modules.d/40network/ifup.sh b/modules.d/40network/ifup.sh --- a/modules.d/40network/ifup.sh 2015-07-14 09:33:13.573902381 +0200 +++ b/modules.d/40network/ifup.sh 2015-07-29 07:43:43.652788589 +0200 @@ -298,10 +298,12 @@ # note no ip addr flush for ipv6 ip addr add $ip/$prefix ${srv:+peer $srv} dev $netif wait_for_ipv6_dad $netif + [ "$gw" = "::" ] && gw="" else # Assume /24 prefix for IPv4 [ -z "$prefix" ] && prefix=24 ip addr add $ip/$prefix ${srv:+peer $srv} brd + dev $netif + [ "$gw" = "0.0.0.0" ] && gw="" fi [ -n "$gw" ] && echo ip route add default via $gw dev $netif > /tmp/net.$netif.gw @@ -319,6 +321,9 @@ done [ -n "$hostname" ] && echo "echo $hostname > /proc/sys/kernel/hostname" > /tmp/net.$netif.hostname + + [ $? -ne 0 ] && info "Static network setup returned $?" + return 0 } # loopback is always handled the same way diff -Naur a/modules.d/95iscsi/iscsiroot.sh b/modules.d/95iscsi/iscsiroot.sh --- a/modules.d/95iscsi/iscsiroot.sh 2015-07-14 09:33:13.646902953 +0200 +++ b/modules.d/95iscsi/iscsiroot.sh 2015-08-07 10:59:39.565419377 +0200 @@ -43,18 +43,44 @@ > /tmp/iscsiuio-started fi +#set value for iscsistart login retry +set_login_retries() { + local default retries + default=2 + retries=$(getarg rd.iscsistart.retries) + return ${retries:-$default} +} + + handle_firmware() { if ! [ -e /tmp/iscsistarted-firmware ]; then + local ipparam retries + if ! iscsistart -f; then warn "iscistart: Could not get list of targets from firmware." return 1 fi + + #default to ip setup via ibft + ipparam=$(getarg ip) + if [ "$ipparam" = "ibft" ] || [ -z "$ipparam" ]; then + iscsistart -N + fi for p in $(getargs rd.iscsi.param -d iscsi_param); do iscsi_param="$iscsi_param --param $p" done + #limit iscsistart login retries + if [[ ! "$iscsi_param" =~ "node.session.initial_login_retry_max" ]]; then + set_login_retries + retries=$? + if [ $retries -gt 0 ]; then + iscsi_param="${iscsi_param% } --param node.session.initial_login_retry_max=$retries" + fi + fi + if ! iscsistart -b $iscsi_param; then warn "'iscsistart -b $iscsi_param' failed" fi @@ -81,6 +107,7 @@ local iscsi_iface_name iscsi_netdev_name local iscsi_param local p + local retries tgtopenip tgtopenname nrip tgtwait tgtip failcnt path failpath fakepath intf up # override conf settings by command line options arg=$(getarg rd.iscsi.initiator -d iscsi_initiator=) @@ -107,6 +134,15 @@ parse_iscsi_root "$1" || return 1 + #limit iscsistart login retries + if [[ ! "$iscsi_param" =~ "node.session.initial_login_retry_max" ]]; then + set_login_retries + retries=$? + if [ $retries -gt 0 ]; then + iscsi_param="${iscsi_param% } --param node.session.initial_login_retry_max=$retries" + fi + fi + # XXX is this needed? getarg ro && iscsirw=ro getarg rw && iscsirw=rw @@ -178,8 +214,60 @@ ${iscsi_param} \ || : - netroot_enc=$(str_replace "$1" '/' '\2f') - echo 'started' > "/tmp/iscsistarted-iscsi:${netroot_enc}" + #get open paths (target ip and name) + tgtopenip=$(cat /sys/class/iscsi_connection/connection*/address) + tgtopenname=$(cat /sys/class/iscsi_session/session*/targetname) + #get paths from netroot (only ip is needed for acounting) + nrip=$(getargs netroot | sed 's/ /\n/g' | sed -n "/$iscsi_target_name/s/.*[:@]\([[:digit:]]*\.[[:digit:]]*\.[[:digit:]]*\.[[:digit:]]*\):.*/\1/p") + [[ $nrip ]] || \ + nrip=$(getargs netroot | sed 's/ /\n/g' | sed -n "/$iscsi_target_name/s/^.*:\(\[.*\]\):.*/\1/p") + [[ -f /tmp/netrootips ]] || echo $nrip | sed 's/ /\n/g' > /tmp/netrootips + + #remove the ip if the path is connected or add it when not in netrootips + if [[ "$tgtopenip" =~ $iscsi_target_ip ]]; then + if [[ "$tgtopenname" =~ $iscsi_target_name ]]; then + sed -i "0,/$iscsi_target_ip/{//d;}" /tmp/netrootips + netroot_enc=$(str_replace "$1" '/' '\2f') + echo 'started' > "/tmp/iscsistarted-iscsi:${netroot_enc}.path" + fi + else + tgtip=$(cat /tmp/netrootips) + if [[ ! "$tgtip" =~ $iscsi_target_ip ]]; then + echo $iscsi_target_ip >> /tmp/netrootips + fi + fi + + #check wheter all paths are connected + tgtwait=$(sed -n '/[[:digit:]]\+[.:]/p' /tmp/netrootips) + if [ -z "$tgtwait" ]; then + for path in $(ls /tmp/iscsistarted-iscsi*.path); do + mv $path ${path%%.path} + done + else + #set up all netroot interfaces + for intf in $(cat /tmp/net.ifaces); do + up=$(ip link show up $intf) + [[ $up ]] || ifup $intf + done + #retry if all netroot interfaces are up and some paths are missing + if [ $retry -gt 2 ]; then + for path in $(ls /tmp/iscsistarted-iscsi*$iscsi_target_name.path); do + for failpath in "$tgtwait"; do + fakepath=$(echo $path | sed "s/-iscsi:\([[:digit:]]\+[.:]\)\+/-iscsi:$failpath:/") + [[ $fakepath ]] || \ + fakepath=$(echo $path | sed "s/-iscsi:\(\[.*\]\)/-iscsi:$failpath/") + cp $path ${fakepath%%.path} + done + mv $path ${path%%.path} + done + elif [[ ! "$tgtopenname" =~ $iscsi_target_name ]]; then + # returning 3 triggers a retry + info "Retrying login to $iscsi_target_name via $iscsi_target_ip" + return 3 + fi + fi + + return 0 } ret=0 @@ -190,7 +278,12 @@ [ "${nroot%%:*}" = "iscsi" ] || continue nroot="${nroot##iscsi:}" if [ -n "$nroot" ]; then + retry=0 handle_netroot "$nroot" + while [ $? -eq 3 ]; do + let retry++ + handle_netroot "$nroot" + done ret=$(($ret + $?)) fi done @@ -201,6 +294,10 @@ else if [ -n "$iroot" ]; then handle_netroot "$iroot" + while [ $? -eq 3 ]; do + let retry++ + handle_netroot "$iroot" + done ret=$? else if getargbool 0 rd.iscsi.firmware -d -y iscsi_firmware ; then
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor