From 58deca4a48a4bc02c95a30e3774b40d7aa144c70 Mon Sep 17 00:00:00 2001
From: Thomas Blume <Thomas.Blume@suse.com>
Date: Thu, 28 Mar 2024 13:32:46 +0100
Subject: [PATCH] parse ipl device for activation

ported from dracut modules
---
 zdev/dracut/95zdev/parse-dasd.sh | 18 ++++++++--
 zdev/dracut/95zdev/parse-zfcp.sh | 56 +++++++++++++++++++++-----------
 2 files changed, 52 insertions(+), 22 deletions(-)

diff --git a/zdev/dracut/95zdev/parse-dasd.sh b/zdev/dracut/95zdev/parse-dasd.sh
index a97801fe..b4135cf5 100644
--- a/zdev/dracut/95zdev/parse-dasd.sh
+++ b/zdev/dracut/95zdev/parse-dasd.sh
@@ -10,6 +10,8 @@
 #   parameters are evaluated and used to configure dasd devices.
 #
 
+zdev_dasd_base_args="--no-settle --yes --no-root-update --force"
+
 # shellcheck source=/dev/null
 type zdev_parse_dasd_list > /dev/null 2>&1 || . /lib/s390-tools/zdev-from-dasd_mod.dasd
 
@@ -27,9 +29,19 @@ zdev_vinfo() {
 
 zdev_parse_rd_dasd() {
     local _zdev_dasd _zdev_dasd_list
-    for _zdev_dasd in $(getargs rd.dasd -d 'rd_DASD='); do
-        _zdev_dasd_list="${_zdev_dasd_list:+${_zdev_dasd_list},}$_zdev_dasd"
-    done
+    # autodetect active bootdev from zipl device
+    if ! getargbool 0 'rd.dasd' \
+        && [[ -f /sys/firmware/ipl/ipl_type ]] \
+        && [[ $(< /sys/firmware/ipl/ipl_type) == "ccw" ]]; then
+        read -r _ccw < /sys/firmware/ipl/device
+
+        chzdev --offline --existing --enable --active $zdev_dasd_base_args \
+               dasd "$_ccw"
+    else
+        for _zdev_dasd in $(getargs rd.dasd -d 'rd_DASD='); do
+            _zdev_dasd_list="${_zdev_dasd_list:+${_zdev_dasd_list},}$_zdev_dasd"
+        done
+    fi
     echo "$_zdev_dasd_list"
 }
 
diff --git a/zdev/dracut/95zdev/parse-zfcp.sh b/zdev/dracut/95zdev/parse-zfcp.sh
index 715aa009..e4fef0b9 100644
--- a/zdev/dracut/95zdev/parse-zfcp.sh
+++ b/zdev/dracut/95zdev/parse-zfcp.sh
@@ -12,25 +12,43 @@
 
 zdev_zfcp_base_args="--no-settle --yes --no-root-update --force"
 
-for zdev_zfcp_arg in $(getargs rd.zfcp -d 'rd_ZFCP='); do
-    (
-        IFS_SAVED="$IFS"
-        IFS="," # did not work in front of built-in set command below
-        # shellcheck disable=SC2086
-        set -- $zdev_zfcp_arg
-        IFS=":" args="$*"
-        IFS="$IFS_SAVED"
-        echo "rd.zfcp ${zdev_zfcp_arg} :" | zdev_vinfo
-        if [ "$#" -eq 1 ]; then
-            # shellcheck disable=SC2086
-            chzdev --enable --persistent $zdev_zfcp_base_args \
-                   zfcp-host "$args" 2>&1 | zdev_vinfo
-        else
+zdev_vinfo() {
+    local _zdev_vinfo_line
+    while read -r _zdev_vinfo_line || [ -n "$_zdev_vinfo_line" ]; do
+        # Prefix "<30>" represents facility LOG_DAEMON 3 and loglevel INFO 6:
+        # (facility << 3) | level.
+        echo "<30>dracut: $_zdev_vinfo_line" > /dev/kmsg
+    done
+}
+
+# autodetect active bootdev from zipl device
+if ! getargbool 0 'rd.zfcp' \
+    && [[ -f /sys/firmware/ipl/ipl_type ]] \
+    && [[ $(< /sys/firmware/ipl/ipl_type) == "fcp" ]]; then
+        chzdev --offline --existing --enable --active $zdev_zfcp_base_args \
+               zfcp-host 2>&1 | zdev_vinfo
+else
+    for zdev_zfcp_arg in $(getargs rd.zfcp -d 'rd_ZFCP='); do
+        (
+            IFS_SAVED="$IFS"
+            IFS="," # did not work in front of built-in set command below
             # shellcheck disable=SC2086
-            chzdev --enable --persistent $zdev_zfcp_base_args \
-                   zfcp-lun "$args" 2>&1 | zdev_vinfo
-        fi
-    )
-done
+            set -- $zdev_zfcp_arg
+            IFS=":" args="$*"
+            IFS="$IFS_SAVED"
+            echo "rd.zfcp ${zdev_zfcp_arg} :" | zdev_vinfo
+            if [ "$#" -eq 1 ]; then
+                # shellcheck disable=SC2086
+                chzdev --enable --persistent $zdev_zfcp_base_args \
+                       zfcp-host "$args" 2>&1 | zdev_vinfo
+            else
+                # shellcheck disable=SC2086
+                chzdev --enable --persistent $zdev_zfcp_base_args \
+                       zfcp-lun "$args" 2>&1 | zdev_vinfo
+            fi
+        )
+    done
+fi
+
 unset zdev_zfcp_arg
 unset zdev_zfcp_base_args
