mirror of
https://github.com/ibm-s390-linux/s390-tools.git
synced 2026-08-05 02:14:52 +00:00
Shell library, which can be sourced by other POSIX compatible shell
scripts. Provide helper function parsing its stdin based on the syntax of
kernel device driver parameter dasd_mod.dasd= and invoking chzdev to
produce corresponding persistent device configurations. The helper function
takes one argument, which is either "globals" or "ranges". For a complete
configuration, call the function twice, first with "globals" and then with
"ranges".
The new script library file should be packaged in a core (sub)package of
s390-tools so the script is available for initrd environments.
Users with examples:
Subsequent commit ("zdev/dracut: add rd.dasd parsing") introduces
zdev/dracut/95zdev/parse-dasd.sh performing:
zdev_parse_rd_dasd | zdev_parse_dasd_list globals 2>&1 | zdev_vinfo
zdev_parse_rd_dasd | zdev_parse_dasd_list ranges 2>&1 | zdev_vinfo
https://github.com/dracutdevs/dracut/pull/2534 updates
modules.d/80cms/cmssetup.sh performing:
echo "$DASD" | zdev_parse_dasd_list globals 2>&1 | vinfo
echo "$DASD" | zdev_parse_dasd_list ranges 2>&1 | vinfo
The parsing code for rd.dasd using the same syntax as dasd_mod.dasd=
is inspired by the own implementation that used to be in linuxrc.s390
of https://github.com/rhinstaller/anaconda.
https://web.archive.org/web/20190721154444/https://www.redhat.com/archives/anaconda-devel-list/2009-February/msg00392.html
https://www.spinics.net/linux/fedora/anaconda-devel/msg08316.html
("Re: Improved linuxrc.s390 (third try)")
=> 9249e40f42ff ("IBM improvements to linuxrc.s390 (#475350)")
https://web.archive.org/web/20190721150254/https://www.redhat.com/archives/anaconda-devel-list/2009-July/msg00310.html
=> 5f0fcf6688d0 ("Update linuxrc.s390 and friends to reflect review comments.")
https://web.archive.org/web/20190721125255/https://www.redhat.com/archives/anaconda-devel-list/2009-August/msg00158.html
=> 523095c86876 ("Handle activation of DASDs in linuxrc.s390 since loader no longer works")
Github-ID: https://github.com/ibm-s390-linux/s390-tools/pull/158
Acked-by: Vineeth Vijayan <vneethv@linux.ibm.com>
Acked-by: Peter Oberparleiter <oberpar@linux.ibm.com>
Signed-off-by: Steffen Maier <maier@linux.ibm.com>
Signed-off-by: Jan Höppner <hoeppner@linux.ibm.com>
88 lines
4.4 KiB
Plaintext
88 lines
4.4 KiB
Plaintext
#
|
|
# Copyright IBM Corp. 2023
|
|
#
|
|
# s390-tools is free software; you can redistribute it and/or modify
|
|
# it under the terms of the MIT license. See LICENSE for details.
|
|
#
|
|
# zdev-from-dasd_mod.dasd
|
|
# Shell library, which can be sourced by other POSIX compatible shell scripts.
|
|
# Provide helper function parsing its stdin based on the syntax of kernel
|
|
# device driver parameter dasd_mod.dasd= and invoking chzdev to produce
|
|
# corresponding persistent device configurations. The helper function
|
|
# takes one argument, which is either "globals" or "ranges". For a
|
|
# complete configuration, call the function twice, first with "globals"
|
|
# and then with "ranges".
|
|
#
|
|
# shellcheck shell=sh
|
|
|
|
# It would be possible to pass the collected rd.dasd options via
|
|
# modprobe.d. However, it is still required to parse the options to handle
|
|
# cio_ignore. That in turn ensures devices get sensed. Sensing is in turn
|
|
# required for automatically loading the device drivers via modalias and
|
|
# for the dasd device driver to find devices it can probe (set online). So
|
|
# go all the way and parse the rd.dasd options. For device bus-IDs, use
|
|
# chzdev, which not only handles cio_ignore transparently, but also
|
|
# generates persistent configuration that can be transferred from initrd to
|
|
# another root files system such as in a distro installer environment.
|
|
|
|
zdev_dasd_base_args="--no-settle --yes --no-root-update --force"
|
|
|
|
zdev_parse_dasd_list() {
|
|
sed 's/,/\n/g' | while read -r _zdev_dasditem; do
|
|
unset _zdev_dasd_range _zdev_dasd_features _zdev_dasd_attrs
|
|
case $_zdev_dasditem in
|
|
autodetect|probeonly|nopav|nofcx)
|
|
[ "$1" = "globals" ] || continue
|
|
# Autodetect can of course only enable devices that are not
|
|
# in the cio_ignore list.
|
|
# Intentionally do not dynamically configure now, but only
|
|
# generate a modprobe.d file, which configures the device
|
|
# later during kernel module load.
|
|
echo "rd.dasd ...,${_zdev_dasditem},... :"
|
|
# shellcheck disable=SC2086
|
|
chzdev dasd --type "${_zdev_dasditem}=1" --persistent \
|
|
$zdev_dasd_base_args
|
|
;;
|
|
"") continue ;; # empty range
|
|
*) # currently no support for a device-spec "ipldev", only devbusid
|
|
[ "$1" = "ranges" ] || continue
|
|
SAVED_IFS="$IFS"
|
|
IFS='('
|
|
read -r _zdev_dasd_range _zdev_dasd_features <<EOF
|
|
$_zdev_dasditem
|
|
EOF
|
|
IFS="$SAVED_IFS"
|
|
if [ "${_zdev_dasd_features%%*)}" != "" ]; then
|
|
warn "rd.dasd: Missing closing parenthesis at features of DASD range $_zdev_dasd_range: ($_zdev_dasd_features"
|
|
fi
|
|
if [ -n "$_zdev_dasd_features" ]; then
|
|
_zdev_dasd_features="${_zdev_dasd_features%)}"
|
|
_zdev_dasd_features=$(echo "$_zdev_dasd_features" | sed 's/:/\n/g')
|
|
while read -r _zdev_dasd_feature; do
|
|
case $_zdev_dasd_feature in
|
|
ro) _zdev_dasd_attrs="$_zdev_dasd_attrs readonly=1" ;;
|
|
diag) _zdev_dasd_attrs="$_zdev_dasd_attrs use_diag=1" ;;
|
|
raw) _zdev_dasd_attrs="$_zdev_dasd_attrs raw_track_access=1" ;;
|
|
erplog|failfast) _zdev_dasd_attrs="$_zdev_dasd_attrs ${_zdev_dasd_feature}=1" ;;
|
|
*)
|
|
warn "rd.dasd: Unknown DASD feature for device range $_zdev_dasd_range: $_zdev_dasd_feature"
|
|
;;
|
|
esac
|
|
done <<EOF
|
|
$_zdev_dasd_features
|
|
EOF
|
|
fi
|
|
# Without dynamic (active) config zdev cannot infer
|
|
# the actual dasd type (eckd, fba) so configure for both.
|
|
echo "rd.dasd ...,${_zdev_dasditem},... :"
|
|
# shellcheck disable=SC2086
|
|
chzdev dasd-eckd --enable --persistent "$_zdev_dasd_range" $_zdev_dasd_attrs \
|
|
$zdev_dasd_base_args
|
|
# shellcheck disable=SC2086
|
|
chzdev dasd-fba --enable --persistent "$_zdev_dasd_range" $_zdev_dasd_attrs \
|
|
$zdev_dasd_base_args
|
|
;;
|
|
esac
|
|
done # input redir w/ process substitution causes syntax error in dracut env
|
|
}
|