Skip to content

Commit

Permalink
zdev: add helper to convert from dasd_mod.dasd to zdev config
Browse files Browse the repository at this point in the history
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

dracutdevs/dracut#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")

Signed-off-by: Steffen Maier <[email protected]>
  • Loading branch information
steffen-maier committed Nov 28, 2023
1 parent b66396d commit c55e82d
Show file tree
Hide file tree
Showing 2 changed files with 89 additions and 1 deletion.
3 changes: 2 additions & 1 deletion zdev/src/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -106,12 +106,13 @@ libs = $(rootdir)/libap/libap.a \
chzdev: $(chzdev_objects) $(libs)
lszdev: $(lszdev_objects) $(libs)

install: chzdev zdev_id zdev-to-dasd_mod.dasd
install: chzdev zdev_id zdev-to-dasd_mod.dasd zdev-from-dasd_mod.dasd
$(INSTALL) -d -m 755 $(DESTDIR)$(BINDIR)
$(INSTALL) -c chzdev $(DESTDIR)$(BINDIR)
$(INSTALL) -c lszdev $(DESTDIR)$(BINDIR)
$(INSTALL) -c zdev_id $(DESTDIR)$(TOOLS_LIBDIR)
$(INSTALL) -c zdev-to-dasd_mod.dasd $(DESTDIR)$(TOOLS_LIBDIR)
$(INSTALL) -c -m 644 zdev-from-dasd_mod.dasd $(DESTDIR)$(TOOLS_LIBDIR)
ifeq ($(HAVE_DRACUT),1)
$(INSTALL) -m 755 zdev-root-update.dracut \
$(DESTDIR)$(TOOLS_LIBDIR)/zdev-root-update
Expand Down
87 changes: 87 additions & 0 deletions zdev/src/zdev-from-dasd_mod.dasd
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
#
# 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
}

0 comments on commit c55e82d

Please sign in to comment.