--- /dev/null
+diff -urN dracut-037/dracut-functions.sh dracut.dev/dracut-functions.sh
+--- dracut-037/dracut-functions.sh 2014-03-19 16:16:08.000000000 +0000
++++ dracut.dev/dracut-functions.sh 2014-05-17 10:31:22.000000000 +0000
+@@ -33,7 +33,11 @@
+ fi
+
+ # Generic substring function. If $2 is in $1, return 0.
+-strstr() { [[ $1 = *$2* ]]; }
++strstr() { [[ $1 = *"$2"* ]]; }
++# Generic glob matching function. If glob pattern $2 matches anywhere in $1, OK
++strglobin() { [[ $1 = *$2* ]]; }
++# Generic glob matching function. If glob pattern $2 matches all of $1, OK
++strglob() { [[ $1 = $2 ]]; }
+
+ # helper function for check() in module-setup.sh
+ # to check for required installed binaries
+diff -urN dracut-037/dracut-initramfs-restore.sh dracut.dev/dracut-initramfs-restore.sh
+--- dracut-037/dracut-initramfs-restore.sh 2014-03-19 16:16:08.000000000 +0000
++++ dracut.dev/dracut-initramfs-restore.sh 2014-05-17 10:31:22.000000000 +0000
+@@ -6,6 +6,10 @@
+
+ KERNEL_VERSION="$(uname -r)"
+
++[[ $dracutbasedir ]] || dracutbasedir=/usr/lib/dracut
++SKIP="$dracutbasedir/skipcpio"
++[[ -x $SKIP ]] || SKIP=cat
++
+ [[ -f /etc/machine-id ]] && read MACHINE_ID < /etc/machine-id
+
+ if [[ $MACHINE_ID ]] && [[ -d /boot/${MACHINE_ID} || -L /boot/${MACHINE_ID} ]] ; then
+@@ -16,11 +20,11 @@
+ cd /run/initramfs
+
+ [ -f .need_shutdown -a -f "$IMG" ] || exit 1
+-if zcat "$IMG" | cpio -id --quiet >/dev/null; then
++if $SKIP "$IMG" | zcat | cpio -id --no-absolute-filenames --quiet >/dev/null; then
+ rm -f -- .need_shutdown
+-elif xzcat "$IMG" | cpio -id --quiet >/dev/null; then
++elif $SKIP "$IMG" | xzcat | cpio -id --no-absolute-filenames --quiet >/dev/null; then
+ rm -f -- .need_shutdown
+-elif lz4 -d -c "$IMG" | cpio -id --quiet >/dev/null; then
++elif $SKIP "$IMG" | lz4 -d -c | cpio -id --no-absolute-filenames --quiet >/dev/null; then
+ rm -f -- .need_shutdown
+ else
+ # something failed, so we clean up
+diff -urN dracut-037/dracut.sh dracut.dev/dracut.sh
+--- dracut-037/dracut.sh 2014-03-19 16:16:08.000000000 +0000
++++ dracut.dev/dracut.sh 2014-05-17 10:31:22.000000000 +0000
+@@ -834,6 +834,13 @@
+ export DRACUT_KERNEL_LAZY="1"
+ export DRACUT_RESOLVE_LAZY="1"
+
++if [[ $print_cmdline ]]; then
++ stdloglvl=0
++ sysloglvl=0
++ fileloglvl=0
++ kmsgloglvl=0
++fi
++
+ if [[ -f $dracutbasedir/dracut-functions.sh ]]; then
+ . $dracutbasedir/dracut-functions.sh
+ else
+@@ -907,6 +914,7 @@
+ dracut_args[$i]="\"${dracut_args[$i]}\""
+ #" keep vim happy
+ done
++
+ dinfo "Executing: $0 ${dracut_args[@]}"
+
+ [[ $do_list = yes ]] && {
+diff -urN dracut-037/dracut-version.sh dracut.dev/dracut-version.sh
+--- dracut-037/dracut-version.sh 2014-03-19 16:17:06.000000000 +0000
++++ dracut.dev/dracut-version.sh 1970-01-01 00:00:00.000000000 +0000
+@@ -1 +0,0 @@
+-DRACUT_VERSION=037
+diff -urN dracut-037/lsinitrd.sh dracut.dev/lsinitrd.sh
+--- dracut-037/lsinitrd.sh 2014-03-19 16:16:08.000000000 +0000
++++ dracut.dev/lsinitrd.sh 2014-05-17 10:31:22.000000000 +0000
+@@ -160,27 +160,35 @@
+ ;;
+ esac
+
+-if [[ $SKIP ]]; then
+- read -N 6 bin < <($SKIP "$image")
+-fi
+-
+-case $bin in
+- $'\x1f\x8b'*)
+- CAT="zcat --";;
+- BZh*)
+- CAT="bzcat --";;
+- $'\x71\xc7'*|070701)
+- CAT="cat --"
+- ;;
+- $'\x02\x21'*)
+- CAT="lz4 -d -c";;
+- *)
+- CAT="xzcat --";
+- if echo "test"|xz|xzcat --single-stream >/dev/null 2>&1; then
+- CAT="xzcat --single-stream --"
+- fi
+- ;;
+-esac
++CAT=$({
++ if [[ $SKIP ]]; then
++ $SKIP "$image"
++ else
++ cat "$image"
++ fi } | {
++ read -N 6 bin
++ case $bin in
++ $'\x1f\x8b'*)
++ echo "zcat --"
++ ;;
++ BZh*)
++ echo "bzcat --"
++ ;;
++ $'\x71\xc7'*|070701)
++ echo "cat --"
++ ;;
++ $'\x02\x21'*)
++ echo "lz4 -d -c"
++ ;;
++ *)
++ if echo "test"|xz|xzcat --single-stream >/dev/null 2>&1; then
++ echo "xzcat --single-stream --"
++ else
++ echo "xzcat --"
++ fi
++ ;;
++ esac
++ })
+
+ skipcpio()
+ {
+diff -urN dracut-037/modules.d/10i18n/parse-i18n.sh dracut.dev/modules.d/10i18n/parse-i18n.sh
+--- dracut-037/modules.d/10i18n/parse-i18n.sh 2014-03-19 16:16:08.000000000 +0000
++++ dracut.dev/modules.d/10i18n/parse-i18n.sh 2014-05-17 10:31:22.000000000 +0000
+@@ -12,7 +12,7 @@
+ _value="$(getarg $@)"
+ [ -z "${_value}" ] && _value=$_default
+ if [ -n "${_value}" ]; then
+- printf '%s="%s"\n' $key ${_value} >> $_file
++ printf '%s="%s"\n' ${_key} ${_value} >> $_file
+ fi
+ unset _file
+ unset _value
+diff -urN dracut-037/modules.d/40network/dhclient-script.sh dracut.dev/modules.d/40network/dhclient-script.sh
+--- dracut-037/modules.d/40network/dhclient-script.sh 2014-03-19 16:16:08.000000000 +0000
++++ dracut.dev/modules.d/40network/dhclient-script.sh 2014-05-17 10:31:22.000000000 +0000
+@@ -64,13 +64,17 @@
+ search=$(printf -- "$new_domain_search")
+ namesrv=$new_domain_name_servers
+ hostname=$new_host_name
+- lease_time=$new_dhcp_lease_time
++ [ -n "$new_dhcp_lease_time" ] && lease_time=$new_dhcp_lease_time
++ [ -n "$new_max_life" ] && lease_time=$new_max_life
++ preferred_lft=$lease_time
++ [ -n "$new_preferred_life" ] && preferred_lft=$new_preferred_life
+
+ [ -f /tmp/net.$netif.override ] && . /tmp/net.$netif.override
+
+ ip -6 addr add ${new_ip6_address}/${new_ip6_prefixlen} \
+- dev ${netif} scope global valid_lft ${lease_time} \
+- preferred_lft ${lease_time}
++ dev ${netif} scope global \
++ ${lease_time:+valid_lft $lease_time} \
++ ${preferred_lft:+preferred_lft ${preferred_lft}}
+
+ [ -n "${search}${domain}" ] && echo "search $search $domain" > /tmp/net.$netif.resolv.conf
+ if [ -n "$namesrv" ] ; then
+diff -urN dracut-037/modules.d/40network/ifup.sh dracut.dev/modules.d/40network/ifup.sh
+--- dracut-037/modules.d/40network/ifup.sh 2014-03-19 16:16:08.000000000 +0000
++++ dracut.dev/modules.d/40network/ifup.sh 2014-05-17 10:31:22.000000000 +0000
+@@ -130,12 +130,12 @@
+
+ # Handle static ip configuration
+ do_static() {
+- strstr $ip '*:*:*' && load_ipv6
++ strglobin $ip '*:*:*' && load_ipv6
+
+ linkup $netif
+ [ -n "$macaddr" ] && ip link set address $macaddr dev $netif
+ [ -n "$mtu" ] && ip link set mtu $mtu dev $netif
+- if strstr $ip '*:*:*'; then
++ if strglobin $ip '*:*:*'; then
+ # note no ip addr flush for ipv6
+ ip addr add $ip/$mask ${srv:+peer $srv} dev $netif
+ wait_for_ipv6_dad $netif
+@@ -364,7 +364,12 @@
+
+ # no ip option directed at our interface?
+ if [ ! -e /tmp/net.${netif}.up ]; then
+- do_dhcp -4
++ if getargs 'ip=dhcp6'; then
++ load_ipv6
++ do_dhcp -6
++ else
++ do_dhcp -4
++ fi
+ fi
+
+ exit 0
+diff -urN dracut-037/modules.d/40network/net-lib.sh dracut.dev/modules.d/40network/net-lib.sh
+--- dracut-037/modules.d/40network/net-lib.sh 2014-03-19 16:16:08.000000000 +0000
++++ dracut.dev/modules.d/40network/net-lib.sh 2014-05-17 10:31:22.000000000 +0000
+@@ -377,7 +377,7 @@
+ # ip=<ipv4-address> means anaconda-style static config argument cluster:
+ # ip=<ip> gateway=<gw> netmask=<nm> hostname=<host> mtu=<mtu>
+ # ksdevice={link|bootif|ibft|<MAC>|<ifname>}
+- if strstr "$autoconf" "*.*.*.*"; then
++ if strglob "$autoconf" "*.*.*.*"; then
+ ip="$autoconf"
+ gw=$(getarg gateway=)
+ mask=$(getarg netmask=)
+@@ -516,3 +516,27 @@
+ done
+ return 1
+ }
++
++is_persistent_ethernet_name() {
++ case "$1" in
++ # udev persistent interface names
++ eth[0-9]|eth[0-9][0-9]|eth[0-9][0-9][0-9]*)
++ ;;
++ eno[0-9]|eno[0-9][0-9]|eno[0-9][0-9][0-9]*)
++ ;;
++ ens[0-9]|ens[0-9][0-9]|ens[0-9][0-9][0-9]*)
++ ;;
++ enp[0-9]s[0-9]*|enp[0-9][0-9]s[0-9]*|enp[0-9][0-9][0-9]*s[0-9]*)
++ ;;
++ enP*p[0-9]s[0-9]*|enP*p[0-9][0-9]s[0-9]*|enP*p[0-9][0-9][0-9]*s[0-9]*)
++ ;;
++ # biosdevname
++ em[0-9]|em[0-9][0-9]|em[0-9][0-9][0-9]*)
++ ;;
++ p[0-9]p[0-9]*|p[0-9][0-9]p[0-9]*|p[0-9][0-9][0-9]*p[0-9]*)
++ ;;
++ *)
++ return 1
++ esac
++ return 0
++}
+diff -urN dracut-037/modules.d/45ifcfg/write-ifcfg.sh dracut.dev/modules.d/45ifcfg/write-ifcfg.sh
+--- dracut-037/modules.d/45ifcfg/write-ifcfg.sh 2014-03-19 16:16:08.000000000 +0000
++++ dracut.dev/modules.d/45ifcfg/write-ifcfg.sh 2014-05-17 10:31:22.000000000 +0000
+@@ -3,6 +3,8 @@
+ # ex: ts=8 sw=4 sts=4 et filetype=sh
+
+ # NFS root might have reached here before /tmp/net.ifaces was written
++type is_persistent_ethernet_name >/dev/null 2>&1 || . /lib/net-lib.sh
++
+ udevadm settle --timeout=30
+
+ if [ -e /tmp/bridge.info ]; then
+@@ -85,7 +87,7 @@
+
+ netif=${netup%%.did-setup}
+ netif=${netif##*/net.}
+- strstr "$netif" ":*:*:*:*:" && continue
++ strglobin "$netif" ":*:*:*:*:" && continue
+ [ -e /tmp/ifcfg/ifcfg-$netif ] && continue
+ unset bridge
+ unset bond
+@@ -120,9 +122,9 @@
+ echo "ONBOOT=yes"
+ echo "NETBOOT=yes"
+ echo "UUID=\"$uuid\""
++ strstr "$(ip -6 addr show dev $netif)" 'inet6' && echo "IPV6INIT=yes"
+ if [ -f /tmp/dhclient.$netif.lease ]; then
+ [ -f /tmp/dhclient.$netif.dhcpopts ] && . /tmp/dhclient.$netif.dhcpopts
+- strstr "$ip" '*:*:*' && echo "IPV6INIT=yes"
+ if [ -f /tmp/net.$netif.has_ibft_config ]; then
+ echo "BOOTPROTO=ibft"
+ else
+@@ -132,7 +134,7 @@
+ else
+ # If we've booted with static ip= lines, the override file is there
+ [ -e /tmp/net.$netif.override ] && . /tmp/net.$netif.override
+- if strstr "$ip" '*:*:*'; then
++ if strglobin "$ip" '*:*:*'; then
+ echo "IPV6INIT=yes"
+ echo "IPV6_AUTOCONF=no"
+ echo "IPV6ADDR=\"$ip/$mask\""
+@@ -149,7 +151,7 @@
+ fi
+ fi
+ fi
+- if strstr "$gw" '*:*:*'; then
++ if strglobin "$gw" '*:*:*'; then
+ echo "IPV6_DEFAULTGW=\"$gw\""
+ elif [ -n "$gw" ]; then
+ echo "GATEWAY=\"$gw\""
+@@ -164,7 +166,13 @@
+ {
+ [ -n "$macaddr" ] && echo "MACADDR=\"$macaddr\""
+ if ! print_s390 $netif; then
+- [ -n "$macaddr" ] || echo "HWADDR=\"$(cat /sys/class/net/$netif/address)\""
++ if [ -z "$macaddr" ] && \
++ ! is_persistent_ethernet_name "$netif" && \
++ [ -f /sys/class/net/$netif/addr_assign_type ] && \
++ [ "$(cat /sys/class/net/$netif/addr_assign_type)" = "0" ] && \
++ [ -f /sys/class/net/$netif/address ]; then
++ echo "HWADDR=\"$(cat /sys/class/net/$netif/address)\""
++ fi
+ fi
+ echo "TYPE=Ethernet"
+ echo "NAME=\"$netif\""
+diff -urN dracut-037/modules.d/80cms/cmsifup.sh dracut.dev/modules.d/80cms/cmsifup.sh
+--- dracut-037/modules.d/80cms/cmsifup.sh 2014-03-19 16:16:08.000000000 +0000
++++ dracut.dev/modules.d/80cms/cmsifup.sh 2014-05-17 10:31:22.000000000 +0000
+@@ -8,7 +8,7 @@
+
+ . /tmp/cms.conf
+
+-strstr "$IPADDR" '*:*:*' && ipv6=1
++strglobin "$IPADDR" '*:*:*' && ipv6=1
+
+ if [ "$ipv6" ] && ! str_starts "$IPADDR" "["; then
+ IPADDR="[$IPADDR]"
+diff -urN dracut-037/modules.d/80cms/cmssetup.sh dracut.dev/modules.d/80cms/cmssetup.sh
+--- dracut-037/modules.d/80cms/cmssetup.sh 2014-03-19 16:16:08.000000000 +0000
++++ dracut.dev/modules.d/80cms/cmssetup.sh 2014-05-17 10:31:22.000000000 +0000
+@@ -144,6 +144,7 @@
+ processcmsfile()
+ {
+ source /tmp/cms.conf
++ SUBCHANNELS="$(echo $SUBCHANNELS | sed 'y/ABCDEF/abcdef/')"
+
+ if [[ $NETTYPE ]]; then
+ (
+diff -urN dracut-037/modules.d/80cms/cms-write-ifcfg.sh dracut.dev/modules.d/80cms/cms-write-ifcfg.sh
+--- dracut-037/modules.d/80cms/cms-write-ifcfg.sh 2014-03-19 16:16:08.000000000 +0000
++++ dracut.dev/modules.d/80cms/cms-write-ifcfg.sh 2014-05-17 10:31:22.000000000 +0000
+@@ -26,7 +26,7 @@
+
+ IFCFGFILE=/run/initramfs/state/etc/sysconfig/network-scripts/ifcfg-$DEVICE
+
+- strstr "$IPADDR" '*:*:*' && ipv6=1
++ strglobin "$IPADDR" '*:*:*' && ipv6=1
+
+ # to please NetworkManager on startup in loader before loader reconfigures net
+ cat > /etc/sysconfig/network << EOF
+diff -urN dracut-037/modules.d/90dm/module-setup.sh dracut.dev/modules.d/90dm/module-setup.sh
+--- dracut-037/modules.d/90dm/module-setup.sh 2014-03-19 16:16:08.000000000 +0000
++++ dracut.dev/modules.d/90dm/module-setup.sh 2014-05-17 10:31:22.000000000 +0000
+@@ -16,7 +16,7 @@
+ # called by dracut
+ installkernel() {
+ instmods =drivers/md
+- instmods dm_mod
++ instmods dm_mod dm-cache dm-cache-mq dm-cache-cleaner
+ }
+
+ # called by dracut
+diff -urN dracut-037/modules.d/90lvm/module-setup.sh dracut.dev/modules.d/90lvm/module-setup.sh
+--- dracut-037/modules.d/90lvm/module-setup.sh 2014-03-19 16:16:08.000000000 +0000
++++ dracut.dev/modules.d/90lvm/module-setup.sh 2014-05-17 10:31:22.000000000 +0000
+@@ -80,7 +80,8 @@
+ inst_rules 11-dm-lvm.rules 69-dm-lvm-metad.rules
+
+ # Do not run lvmetad update via pvscan in udev rule - lvmetad is not running yet in dracut!
+- if grep -q SYSTEMD_WANTS ${initdir}/lib/udev/rules.d/69-dm-lvm-metad.rules; then
++ if [[ -f ${initdir}/lib/udev/rules.d/69-dm-lvm-metad.rules ]] && \
++ grep -q SYSTEMD_WANTS ${initdir}/lib/udev/rules.d/69-dm-lvm-metad.rules; then
+ sed -i -e 's/^ENV{SYSTEMD_ALIAS}=.*/# No LVM pvscan in dracut - lvmetad is not running yet/' ${initdir}/lib/udev/rules.d/69-dm-lvm-metad.rules
+ sed -i -e 's/^ENV{ID_MODEL}=.*//' ${initdir}/lib/udev/rules.d/69-dm-lvm-metad.rules
+ sed -i -e 's/^ENV{SYSTEMD_WANTS}=.*//' ${initdir}/lib/udev/rules.d/69-dm-lvm-metad.rules
+diff -urN dracut-037/modules.d/90mdraid/module-setup.sh dracut.dev/modules.d/90mdraid/module-setup.sh
+--- dracut-037/modules.d/90mdraid/module-setup.sh 2014-03-19 16:16:08.000000000 +0000
++++ dracut.dev/modules.d/90mdraid/module-setup.sh 2014-05-17 10:31:22.000000000 +0000
+@@ -54,6 +54,8 @@
+ done
+ )
+
++ [[ -z "$UUID" ]] && continue
++
+ if ! [[ ${_activated[${UUID}]} ]]; then
+ printf "%s" " rd.md.uuid=${UUID}"
+ _activated["${UUID}"]=1
+diff -urN dracut-037/modules.d/95fcoe/fcoe-genrules.sh dracut.dev/modules.d/95fcoe/fcoe-genrules.sh
+--- dracut-037/modules.d/95fcoe/fcoe-genrules.sh 2014-03-19 16:16:08.000000000 +0000
++++ dracut.dev/modules.d/95fcoe/fcoe-genrules.sh 2014-05-17 10:31:22.000000000 +0000
+@@ -13,4 +13,4 @@
+ else
+ printf 'ACTION=="add", SUBSYSTEM=="net", NAME=="%s", RUN+="/sbin/initqueue --onetime --unique --name fcoe-up-$env{INTERFACE} /sbin/fcoe-up $env{INTERFACE} %s"\n' "$fcoe_interface" "$fcoe_dcb"
+ fi
+-} > /etc/udev/rules.d/92-fcoe.rules
++} >> /etc/udev/rules.d/92-fcoe.rules
+diff -urN dracut-037/modules.d/95fcoe/fcoe-up.sh dracut.dev/modules.d/95fcoe/fcoe-up.sh
+--- dracut-037/modules.d/95fcoe/fcoe-up.sh 2014-03-19 16:16:08.000000000 +0000
++++ dracut.dev/modules.d/95fcoe/fcoe-up.sh 2014-05-17 10:31:22.000000000 +0000
+@@ -28,12 +28,35 @@
+ # are to kill it and start a new lldpad to take over. Data is transfered
+ # between the 2 using a shm segment
+ lldpad -d
+- # stupid tools, need sleep
+- sleep 1
+- dcbtool sc "$netif" dcb on
+- sleep 1
+- dcbtool sc "$netif" app:fcoe e:1 a:1 w:1
++ # wait for lldpad to be ready
++ i=0
++ while [ $i -lt 60 ]; do
++ lldptool -p && break
++ info "Waiting for lldpad to be ready"
++ sleep 1
++ i=$(($i+1))
++ done
++
++ # on some systems lldpad needs some time
++ # sleep until we find a better solution
++ sleep 30
++
++ while [ $i -lt 60 ]; do
++ dcbtool sc "$netif" dcb on && break
++ info "Retrying to turn dcb on"
++ sleep 1
++ i=$(($i+1))
++ done
++
++ while [ $i -lt 60 ]; do
++ dcbtool sc "$netif" app:fcoe e:1 a:1 w:1 && break
++ info "Retrying to turn fcoe on"
++ sleep 1
++ i=$(($i+1))
++ done
++
+ sleep 1
++
+ fipvlan "$netif" -c -s
+ elif [ "$netdriver" = "bnx2x" ]; then
+ # If driver is bnx2x, do not use /sys/module/fcoe/parameters/create but fipvlan
+diff -urN dracut-037/modules.d/95fcoe/module-setup.sh dracut.dev/modules.d/95fcoe/module-setup.sh
+--- dracut-037/modules.d/95fcoe/module-setup.sh 2014-03-19 16:16:08.000000000 +0000
++++ dracut.dev/modules.d/95fcoe/module-setup.sh 2014-05-17 10:31:22.000000000 +0000
+@@ -21,7 +21,7 @@
+
+ # called by dracut
+ install() {
+- inst_multiple ip dcbtool fipvlan lldpad readlink
++ inst_multiple ip dcbtool fipvlan lldpad readlink lldptool
+
+ mkdir -m 0755 -p "$initdir/var/lib/lldpad"
+
+diff -urN dracut-037/modules.d/95fstab-sys/mount-sys.sh dracut.dev/modules.d/95fstab-sys/mount-sys.sh
+--- dracut-037/modules.d/95fstab-sys/mount-sys.sh 2014-03-19 16:16:08.000000000 +0000
++++ dracut.dev/modules.d/95fstab-sys/mount-sys.sh 2014-05-17 10:31:22.000000000 +0000
+@@ -27,7 +27,11 @@
+ return 0
+ }
+
+-[ -f /etc/fstab ] && fstab_mount /etc/fstab
++# systemd will mount and run fsck from /etc/fstab and we don't want to
++# run into a race condition.
++if [ -z "$DRACUT_SYSTEMD" ]; then
++ [ -f /etc/fstab ] && fstab_mount /etc/fstab
++fi
+
+ # prefer $NEWROOT/etc/fstab.sys over local /etc/fstab.sys
+ if [ -f $NEWROOT/etc/fstab.sys ]; then
+diff -urN dracut-037/modules.d/95nbd/nbdroot.sh dracut.dev/modules.d/95nbd/nbdroot.sh
+--- dracut-037/modules.d/95nbd/nbdroot.sh 2014-03-19 16:16:08.000000000 +0000
++++ dracut.dev/modules.d/95nbd/nbdroot.sh 2014-05-17 10:31:22.000000000 +0000
+@@ -111,6 +111,10 @@
+ fi
+ fi
+
++if strstr "$(nbd-client --help 2>&1)" "systemd-mark"; then
++ preopts="--systemd-mark $preopts"
++fi
++
+ nbd-client $preopts "$nbdserver" $nbdport /dev/nbd0 $opts || exit 1
+
+ # NBD doesn't emit uevents when it gets connected, so kick it
+diff -urN dracut-037/modules.d/95nfs/nfs-lib.sh dracut.dev/modules.d/95nfs/nfs-lib.sh
+--- dracut-037/modules.d/95nfs/nfs-lib.sh 2014-03-19 16:16:08.000000000 +0000
++++ dracut.dev/modules.d/95nfs/nfs-lib.sh 2014-05-17 10:31:22.000000000 +0000
+@@ -40,7 +40,7 @@
+ arg="${arg##$nfs:}"
+
+ # check if we have a server
+- if strstr "$arg" ':/*' ; then
++ if strstr "$arg" ':/' ; then
+ server="${arg%%:/*}"
+ arg="/${arg##*:/}"
+ fi
+diff -urN dracut-037/modules.d/95resume/parse-resume.sh dracut.dev/modules.d/95resume/parse-resume.sh
+--- dracut-037/modules.d/95resume/parse-resume.sh 2014-03-19 16:16:08.000000000 +0000
++++ dracut.dev/modules.d/95resume/parse-resume.sh 2014-05-17 10:31:22.000000000 +0000
+@@ -70,9 +70,10 @@
+ printf '[ -e "%s" ] && { ln -s "%s" /dev/resume; rm -f -- "$job" "%s/initqueue/timeout/resume.sh"; }\n' \
+ "$resume" "$resume" "$hookdir" >> $hookdir/initqueue/settled/resume.sh
+
+- printf -- "%s" 'warn "Cancelling resume operation. Device not found.";'
+- printf -- ' cancel_wait_for_dev /dev/resume; rm -f -- "$job" "%s/initqueue/settled/resume.sh";\n' \
+- "$hookdir" >> $hookdir/initqueue/timeout/resume.sh
++ {
++ printf -- "%s" 'warn "Cancelling resume operation. Device not found.";'
++ printf -- ' cancel_wait_for_dev /dev/resume; rm -f -- "$job" "%s/initqueue/settled/resume.sh";\n' "$hookdir"
++ } >> $hookdir/initqueue/timeout/resume.sh
+
+ mv /lib/dracut/resume.sh /lib/dracut/hooks/pre-mount/10-resume.sh
+ else
+diff -urN dracut-037/modules.d/98systemd/dracut-initqueue.service dracut.dev/modules.d/98systemd/dracut-initqueue.service
+--- dracut-037/modules.d/98systemd/dracut-initqueue.service 2014-03-19 16:16:08.000000000 +0000
++++ dracut.dev/modules.d/98systemd/dracut-initqueue.service 2014-05-17 10:31:22.000000000 +0000
+@@ -11,6 +11,8 @@
+ Description=dracut initqueue hook
+ Documentation=man:dracut-initqueue.service(8)
+ DefaultDependencies=no
++Before=remote-fs-pre.target
++Wants=remote-fs-pre.target
+ After=systemd-udev-trigger.service
+ Wants=systemd-udev-trigger.service
+ ConditionPathExists=/etc/initrd-release
+diff -urN dracut-037/modules.d/98systemd/module-setup.sh dracut.dev/modules.d/98systemd/module-setup.sh
+--- dracut-037/modules.d/98systemd/module-setup.sh 2014-03-19 16:16:08.000000000 +0000
++++ dracut.dev/modules.d/98systemd/module-setup.sh 2014-05-17 10:31:22.000000000 +0000
+@@ -44,6 +44,7 @@
+ $systemdutildir/systemd-modules-load \
+ $systemdutildir/systemd-vconsole-setup \
+ $systemdutildir/system-generators/systemd-fstab-generator \
++ $systemdutildir/system-generators/systemd-gpt-auto-generator \
+ \
+ $systemdsystemunitdir/cryptsetup.target \
+ $systemdsystemunitdir/emergency.target \
+diff -urN dracut-037/modules.d/99base/dracut-lib.sh dracut.dev/modules.d/99base/dracut-lib.sh
+--- dracut-037/modules.d/99base/dracut-lib.sh 2014-03-19 16:16:08.000000000 +0000
++++ dracut.dev/modules.d/99base/dracut-lib.sh 2014-05-17 10:31:22.000000000 +0000
+@@ -20,19 +20,33 @@
+ [ "$RD_DEBUG" = "yes" ] && set -x
+ }
+
+-# returns OK if $1 contains $2
++# returns OK if $1 contains literal string $2 (and isn't empty)
+ strstr() {
+- [ "${1#*$2*}" != "$1" ]
++ [ "${1##*"$2"*}" != "$1" ]
+ }
+
+-# returns OK if $1 contains $2 at the beginning
++# returns OK if $1 matches (completely) glob pattern $2
++# An empty $1 will not be considered matched, even if $2 is * which technically
++# matches; as it would match anything, it's not an interesting case.
++strglob() {
++ [ -n "$1" -a -z "${1##$2}" ]
++}
++
++# returns OK if $1 contains (anywhere) a match of glob pattern $2
++# An empty $1 will not be considered matched, even if $2 is * which technically
++# matches; as it would match anything, it's not an interesting case.
++strglobin() {
++ [ -n "$1" -a -z "${1##*$2*}" ]
++}
++
++# returns OK if $1 contains literal string $2 at the beginning, and isn't empty
+ str_starts() {
+- [ "${1#$2*}" != "$1" ]
++ [ "${1#"$2"*}" != "$1" ]
+ }
+
+-# returns OK if $1 contains $2 at the end
++# returns OK if $1 contains literal string $2 at the end, and isn't empty
+ str_ends() {
+- [ "${1%*$2}" != "$1" ]
++ [ "${1%*"$2"}" != "$1" ]
+ }
+
+ if [ -z "$DRACUT_SYSTEMD" ]; then
+@@ -85,9 +99,9 @@
+ local out=''
+
+ while strstr "${in}" "$s"; do
+- chop="${in%%$s*}"
++ chop="${in%%"$s"*}"
+ out="${out}${chop}$r"
+- in="${in#*$s}"
++ in="${in#*"$s"}"
+ done
+ echo "${out}${in}"
+ }
+@@ -555,7 +569,7 @@
+ arg="${arg##$nfs:}"
+
+ # check if we have a server
+- if strstr "$arg" ':/*' ; then
++ if strstr "$arg" ':/' ; then
+ server="${arg%%:/*}"
+ arg="/${arg##*:/}"
+ fi
+@@ -969,6 +983,7 @@
+ local _cmd
+ local _exe
+ local _rl
++ local _ret=1
+ local i
+ _cmd="$1"
+ [ -z "$_cmd" ] && return 1
+@@ -983,8 +998,9 @@
+ fi
+ i=${i%/exe}
+ echo ${i##/proc/}
++ _ret=0
+ done
+- return 0
++ return $_ret
+ }
+ fi
+
+diff -urN dracut-037/modules.d/99base/init.sh dracut.dev/modules.d/99base/init.sh
+--- dracut-037/modules.d/99base/init.sh 2014-03-19 16:16:08.000000000 +0000
++++ dracut.dev/modules.d/99base/init.sh 2014-05-17 10:31:22.000000000 +0000
+@@ -353,7 +353,9 @@
+ # remove helper symlink
+ [ -h /dev/root ] && rm -f -- /dev/root
+
+-getarg rd.break -d rdbreak && emergency_shell -n switch_root "Break before switch_root"
++bv=$(getarg rd.break -d rdbreak) && [ -z "$bv" ] &&
++ emergency_shell -n switch_root "Break before switch_root"
++unset bv
+ info "Switching root"
+
+
+diff -urN dracut-037/modules.d/99fs-lib/module-setup.sh dracut.dev/modules.d/99fs-lib/module-setup.sh
+--- dracut-037/modules.d/99fs-lib/module-setup.sh 2014-03-19 16:16:08.000000000 +0000
++++ dracut.dev/modules.d/99fs-lib/module-setup.sh 2014-05-17 10:31:23.000000000 +0000
+@@ -17,10 +17,10 @@
+ local dev=$1 fs=$2
+ case "$fs" in
+ xfs)
+- echo -n " xfs_db xfs_repair xfs_check xfs_metadump "
++ echo -n " xfs_db xfs_repair xfs_check xfs_metadump"
+ ;;
+ ext?)
+- echo -n " fsck.$fs e2fsck "
++ echo -n " e2fsck "
+ ;;
+ jfs)
+ echo -n " jfs_fsck "
+@@ -31,10 +31,10 @@
+ btrfs)
+ echo -n " btrfsck "
+ ;;
+- *)
+- [[ -x fsck.$fs ]] && echo -n " fsck.$fs "
+- ;;
+ esac
++
++ echo -n " fsck.$fs "
++ return 0
+ }
+
+ include_fs_helper_modules() {
+diff -urN dracut-037/test/TEST-01-BASIC/test-init.sh dracut.dev/test/TEST-01-BASIC/test-init.sh
+--- dracut-037/test/TEST-01-BASIC/test-init.sh 2014-03-19 16:16:08.000000000 +0000
++++ dracut.dev/test/TEST-01-BASIC/test-init.sh 2014-05-17 10:31:23.000000000 +0000
+@@ -1,7 +1,7 @@
+ #!/bin/sh
+ >/dev/watchdog
+ export PATH=/sbin:/bin:/usr/sbin:/usr/bin
+-strstr() { [ "${1#*$2*}" != "$1" ]; }
++strstr() { [ "${1##*"$2"*}" != "$1" ]; }
+ CMDLINE=$(while read line; do echo $line;done < /proc/cmdline)
+ plymouth --quit
+ exec >/dev/console 2>&1
+diff -urN dracut-037/test/TEST-02-SYSTEMD/test-init.sh dracut.dev/test/TEST-02-SYSTEMD/test-init.sh
+--- dracut-037/test/TEST-02-SYSTEMD/test-init.sh 2014-03-19 16:16:08.000000000 +0000
++++ dracut.dev/test/TEST-02-SYSTEMD/test-init.sh 2014-05-17 10:31:23.000000000 +0000
+@@ -1,6 +1,6 @@
+ #!/bin/sh
+ export PATH=/sbin:/bin:/usr/sbin:/usr/bin
+-strstr() { [ "${1#*$2*}" != "$1" ]; }
++strstr() { [ "${1##*"$2"*}" != "$1" ]; }
+ CMDLINE=$(while read line; do echo $line;done < /proc/cmdline)
+ plymouth --quit
+ exec </dev/console >/dev/console 2>&1
+diff -urN dracut-037/test/TEST-03-USR-MOUNT/test-init.sh dracut.dev/test/TEST-03-USR-MOUNT/test-init.sh
+--- dracut-037/test/TEST-03-USR-MOUNT/test-init.sh 2014-03-19 16:16:08.000000000 +0000
++++ dracut.dev/test/TEST-03-USR-MOUNT/test-init.sh 2014-05-17 10:31:23.000000000 +0000
+@@ -1,7 +1,7 @@
+ #!/bin/sh
+ >/dev/watchdog
+ export PATH=/sbin:/bin:/usr/sbin:/usr/bin
+-strstr() { [ "${1#*$2*}" != "$1" ]; }
++strstr() { [ "${1##*"$2"*}" != "$1" ]; }
+ CMDLINE=$(while read line; do echo $line;done < /proc/cmdline)
+ plymouth --quit
+ exec </dev/console >/dev/console 2>&1
+diff -urN dracut-037/test/TEST-04-FULL-SYSTEMD/test-init.sh dracut.dev/test/TEST-04-FULL-SYSTEMD/test-init.sh
+--- dracut-037/test/TEST-04-FULL-SYSTEMD/test-init.sh 2014-03-19 16:16:08.000000000 +0000
++++ dracut.dev/test/TEST-04-FULL-SYSTEMD/test-init.sh 2014-05-17 10:31:23.000000000 +0000
+@@ -1,7 +1,7 @@
+ #!/bin/sh
+ >/dev/watchdog
+ export PATH=/sbin:/bin:/usr/sbin:/usr/bin
+-strstr() { [ "${1#*$2*}" != "$1" ]; }
++strstr() { [ "${1##*"$2"*}" != "$1" ]; }
+ CMDLINE=$(while read line; do echo $line;done < /proc/cmdline)
+ plymouth --quit
+ exec </dev/console >/dev/console 2>&1
+diff -urN dracut-037/test/TEST-10-RAID/test-init.sh dracut.dev/test/TEST-10-RAID/test-init.sh
+--- dracut-037/test/TEST-10-RAID/test-init.sh 2014-03-19 16:16:08.000000000 +0000
++++ dracut.dev/test/TEST-10-RAID/test-init.sh 2014-05-17 10:31:23.000000000 +0000
+@@ -1,6 +1,6 @@
+ #!/bin/sh
+ export PATH=/sbin:/bin:/usr/sbin:/usr/bin
+-strstr() { [ "${1#*$2*}" != "$1" ]; }
++strstr() { [ "${1##*"$2"*}" != "$1" ]; }
+ CMDLINE=$(while read line; do echo $line;done < /proc/cmdline)
+ command -v plymouth >/dev/null && plymouth --quit
+ exec >/dev/console 2>&1
+diff -urN dracut-037/test/TEST-11-LVM/test-init.sh dracut.dev/test/TEST-11-LVM/test-init.sh
+--- dracut-037/test/TEST-11-LVM/test-init.sh 2014-03-19 16:16:08.000000000 +0000
++++ dracut.dev/test/TEST-11-LVM/test-init.sh 2014-05-17 10:31:23.000000000 +0000
+@@ -1,6 +1,6 @@
+ #!/bin/sh
+ export PATH=/sbin:/bin:/usr/sbin:/usr/bin
+-strstr() { [ "${1#*$2*}" != "$1" ]; }
++strstr() { [ "${1##*"$2"*}" != "$1" ]; }
+ CMDLINE=$(while read line; do echo $line;done < /proc/cmdline)
+ plymouth --quit
+ exec >/dev/console 2>&1
+diff -urN dracut-037/test/TEST-12-RAID-DEG/test-init.sh dracut.dev/test/TEST-12-RAID-DEG/test-init.sh
+--- dracut-037/test/TEST-12-RAID-DEG/test-init.sh 2014-03-19 16:16:08.000000000 +0000
++++ dracut.dev/test/TEST-12-RAID-DEG/test-init.sh 2014-05-17 10:31:23.000000000 +0000
+@@ -1,6 +1,6 @@
+ #!/bin/sh
+ export PATH=/sbin:/bin:/usr/sbin:/usr/bin
+-strstr() { [ "${1#*$2*}" != "$1" ]; }
++strstr() { [ "${1##*"$2"*}" != "$1" ]; }
+ CMDLINE=$(while read line; do echo $line;done < /proc/cmdline)
+ command -v plymouth >/dev/null && plymouth --quit
+ exec >/dev/console 2>&1
+diff -urN dracut-037/test/TEST-14-IMSM/test-init.sh dracut.dev/test/TEST-14-IMSM/test-init.sh
+--- dracut-037/test/TEST-14-IMSM/test-init.sh 2014-03-19 16:16:08.000000000 +0000
++++ dracut.dev/test/TEST-14-IMSM/test-init.sh 2014-05-17 10:31:23.000000000 +0000
+@@ -1,6 +1,6 @@
+ #!/bin/sh
+ export PATH=/sbin:/bin:/usr/sbin:/usr/bin
+-strstr() { [ "${1#*$2*}" != "$1" ]; }
++strstr() { [ "${1##*"$2"*}" != "$1" ]; }
+ CMDLINE=$(while read line; do echo $line;done < /proc/cmdline)
+ plymouth --quit
+ exec >/dev/console 2>&1
+diff -urN dracut-037/test/TEST-16-DMSQUASH/test-init.sh dracut.dev/test/TEST-16-DMSQUASH/test-init.sh
+--- dracut-037/test/TEST-16-DMSQUASH/test-init.sh 2014-03-19 16:16:08.000000000 +0000
++++ dracut.dev/test/TEST-16-DMSQUASH/test-init.sh 2014-05-17 10:31:23.000000000 +0000
+@@ -1,6 +1,6 @@
+ #!/bin/sh
+ export PATH=/sbin:/bin:/usr/sbin:/usr/bin
+-strstr() { [ "${1#*$2*}" != "$1" ]; }
++strstr() { [ "${1##*"$2"*}" != "$1" ]; }
+ CMDLINE=$(while read line; do echo $line;done < /proc/cmdline)
+ plymouth --quit
+ exec >/dev/console 2>&1
+diff -urN dracut-037/test/TEST-17-LVM-THIN/test-init.sh dracut.dev/test/TEST-17-LVM-THIN/test-init.sh
+--- dracut-037/test/TEST-17-LVM-THIN/test-init.sh 2014-03-19 16:16:08.000000000 +0000
++++ dracut.dev/test/TEST-17-LVM-THIN/test-init.sh 2014-05-17 10:31:23.000000000 +0000
+@@ -1,6 +1,6 @@
+ #!/bin/sh
+ export PATH=/sbin:/bin:/usr/sbin:/usr/bin
+-strstr() { [ "${1#*$2*}" != "$1" ]; }
++strstr() { [ "${1##*"$2"*}" != "$1" ]; }
+ CMDLINE=$(while read line; do echo $line;done < /proc/cmdline)
+ plymouth --quit
+ exec >/dev/console 2>&1
+diff -urN dracut-037/test/TEST-20-NFS/client-init.sh dracut.dev/test/TEST-20-NFS/client-init.sh
+--- dracut-037/test/TEST-20-NFS/client-init.sh 2014-03-19 16:16:08.000000000 +0000
++++ dracut.dev/test/TEST-20-NFS/client-init.sh 2014-05-17 10:31:23.000000000 +0000
+@@ -4,7 +4,7 @@
+ export TERM=linux
+ export PS1='initramfs-test:\w\$ '
+ CMDLINE=$(while read line; do echo $line;done < /proc/cmdline)
+-strstr() { [ "${1#*$2*}" != "$1" ]; }
++strstr() { [ "${1##*"$2"*}" != "$1" ]; }
+
+ stty sane
+ strstr "$CMDLINE" "rd.shell" && sh -i
+diff -urN dracut-037/test/TEST-50-MULTINIC/client-init.sh dracut.dev/test/TEST-50-MULTINIC/client-init.sh
+--- dracut-037/test/TEST-50-MULTINIC/client-init.sh 2014-03-19 16:16:08.000000000 +0000
++++ dracut.dev/test/TEST-50-MULTINIC/client-init.sh 2014-05-17 10:31:23.000000000 +0000
+@@ -2,14 +2,15 @@
+ exec >/dev/console 2>&1
+ set -x
+ export PATH=/sbin:/bin:/usr/sbin:/usr/bin
+-strstr() { [ "${1#*$2*}" != "$1" ]; }
++strstr() { [ "${1##*"$2"*}" != "$1" ]; }
++strglobin() { [ -n "$1" -a -z "${1##*$2*}" ]; }
+ CMDLINE=$(while read line; do echo $line;done < /proc/cmdline)
+ export TERM=linux
+ export PS1='initramfs-test:\w\$ '
+ stty sane
+ echo "made it to the rootfs! Powering down."
+ for i in /run/initramfs/net.*.did-setup; do
+- strstr "$i" ":*:*:*:*:" && continue
++ strglobin "$i" ":*:*:*:*:" && continue
+ i=${i%.did-setup}
+ IFACES+="${i##*/net.} "
+ done