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