Blob Blame History Raw
From 38412977daad049b12273966300d07211674834e Mon Sep 17 00:00:00 2001
From: Steffen Maier <maier@linux.ibm.com>
Date: Wed, 24 May 2023 19:02:09 +0200
Subject: [PATCH 03/23] refactor(cms): use zdev to simplify handling
 CMSDASD=... boot option

This is just internal to initrd, so we can already migrate the code to
consolidated dasd device configuration with zdev
https://github.com/ibm-s390-linux/s390-tools/tree/master/zdev/.
The code change is transparent to users after dracut switch root.

Signed-off-by: Steffen Maier <maier@linux.ibm.com>
---
 modules.d/80cms/cmssetup.sh     | 108 ++++++--------------------------
 modules.d/80cms/module-setup.sh |   3 +-
 2 files changed, 21 insertions(+), 90 deletions(-)

diff --git a/modules.d/80cms/cmssetup.sh b/modules.d/80cms/cmssetup.sh
index 68e45632..23e81ca9 100755
--- a/modules.d/80cms/cmssetup.sh
+++ b/modules.d/80cms/cmssetup.sh
@@ -2,34 +2,16 @@
 
 type getarg > /dev/null 2>&1 || . /lib/dracut-lib.sh
 
-function sysecho() {
-    file="$1"
-    shift
-    local i=1
-    while [ $i -le 10 ]; do
-        if [ ! -f "$file" ]; then
-            sleep 1
-            i=$((i + 1))
-        else
-            break
-        fi
-    done
-    local status
-    read -r status < "$file"
-    if [[ $status != "$*" ]]; then
-        [ -f "$file" ] && echo "$*" > "$file"
-    fi
-}
-
 function dasd_settle() {
-    local dasd_status=/sys/bus/ccw/devices/$1/status
+    local dasd_status
+    dasd_status=$(lszdev dasd "$1" --columns ATTRPATH:status --no-headings --active)
     if [ ! -f "$dasd_status" ]; then
         return 1
     fi
     local i=1
     while [ $i -le 60 ]; do
         local status
-        read -r status < "$dasd_status"
+        status=$(lszdev dasd "$1" --columns ATTR:status --no-headings --active)
         case $status in
             online | unformatted)
                 return 0
@@ -43,77 +25,23 @@ function dasd_settle() {
     return 1
 }
 
-function dasd_settle_all() {
-    for dasdccw in $(while read -r line || [ -n "$line" ]; do echo "${line%%(*}"; done < /proc/dasd/devices); do
-        if ! dasd_settle "$dasdccw"; then
-            echo $"Could not access DASD $dasdccw in time"
-            return 1
-        fi
-    done
-    return 0
-}
-
-# prints a canonocalized device bus ID for a given devno of any format
-function canonicalize_devno() {
-    case ${#1} in
-        3) echo "0.0.0${1}" ;;
-        4) echo "0.0.${1}" ;;
-        *) echo "${1}" ;;
-    esac
-    return 0
-}
-
 # read file from CMS and write it to /tmp
 function readcmsfile() { # $1=dasdport $2=filename
     local dev
-    local numcpus
     local devname
     local ret=0
     if [ $# -ne 2 ]; then return; fi
-    # precondition: udevd created dasda block device node
-    if ! dasd_cio_free -d "$1"; then
-        echo $"DASD $1 could not be cleared from device blacklist"
-        return 1
-    fi
-
-    modprobe dasd_mod dasd="$CMSDASD"
-    modprobe dasd_eckd_mod
-    udevadm settle
-
-    # precondition: dasd_eckd_mod driver incl. dependencies loaded,
-    #               dasd_mod must be loaded without setting any DASD online
-    dev=$(canonicalize_devno "$1")
-    numcpus=$(
-        while read -r line || [ -n "$line" ]; do
-            if strstr "$line" "# processors"; then
-                echo "${line##*:}"
-                break
-            fi
-        done < /proc/cpuinfo
-    )
+    # precondition: udevd created block device node
 
-    if [ "${numcpus}" -eq 1 ]; then
-        echo 1 > /sys/bus/ccw/devices/"$dev"/online
-    else
-        if ! sysecho /sys/bus/ccw/devices/"$dev"/online 1; then
-            echo $"DASD $dev could not be set online"
-            return 1
-        fi
-        udevadm settle
-        if ! dasd_settle "$dev"; then
-            echo $"Could not access DASD $dev in time"
-            return 1
-        fi
+    dev="$1"
+    chzdev --enable --active --yes --quiet --no-root-update --force dasd "$dev" || return 1
+    if ! dasd_settle "$dev"; then
+        echo $"Could not access DASD $dev in time"
+        return 1
     fi
 
-    udevadm settle
-
-    devname=$(
-        cd /sys/bus/ccw/devices/"$dev"/block || exit
-        set -- *
-        [ -b /dev/"$1" ] && echo "$1"
-    )
-    devname=${devname:-dasda}
+    devname=$(lszdev dasd "$dev" --columns NAMES --no-headings --active)
+    [[ -n $devname ]] || return 1
 
     [[ -d /mnt ]] || mkdir -p /mnt
     if cmsfs-fuse --to=UTF-8 -a /dev/"$devname" /mnt; then
@@ -125,20 +53,22 @@ function readcmsfile() { # $1=dasdport $2=filename
         ret=1
     fi
 
-    if ! sysecho /sys/bus/ccw/devices/"$dev"/online 0; then
-        echo $"DASD $dev could not be set offline again"
-        #return 1
-    fi
-    udevadm settle
+    chzdev --disable --active --yes --quiet --no-root-update --force dasd "$dev"
 
     # unbind all dasds to unload the dasd modules for a clean start
     (
         cd /sys/bus/ccw/drivers/dasd-eckd || exit
-        for i in *.*; do echo "$i" > unbind; done
+        for i in *.*; do echo "$i" > unbind 2> /dev/null; done
+    )
+    (
+        cd /sys/bus/ccw/drivers/dasd-fba || exit
+        for i in *.*; do echo "$i" > unbind 2> /dev/null; done
     )
     udevadm settle
     modprobe -r dasd_eckd_mod
     udevadm settle
+    modprobe -r dasd_fba_mod
+    udevadm settle
     modprobe -r dasd_diag_mod
     udevadm settle
     modprobe -r dasd_mod
diff --git a/modules.d/80cms/module-setup.sh b/modules.d/80cms/module-setup.sh
index 2b280e0f..4872734b 100755
--- a/modules.d/80cms/module-setup.sh
+++ b/modules.d/80cms/module-setup.sh
@@ -4,6 +4,7 @@
 check() {
     arch=${DRACUT_ARCH:-$(uname -m)}
     [ "$arch" = "s390" -o "$arch" = "s390x" ] || return 1
+    require_binaries chzdev lszdev || return 1
     return 255
 }
 
@@ -28,7 +29,7 @@ install() {
     # shellcheck disable=SC2046
     inst_multiple /etc/cmsfs-fuse/filetypes.conf /etc/udev/rules.d/99-fuse.rules /etc/fuse.conf \
         cmsfs-fuse fusermount bash insmod rmmod cat normalize_dasd_arg sed \
-        $(rpm -ql s390utils-base) awk getopt
+        $(rpm -ql s390utils-base) awk getopt chzdev lszdev
 
     inst_libdir_file "gconv/*"
     #inst /usr/lib/locale/locale-archive
-- 
2.42.0