|
| 1 | +# |
| 2 | +# Copyright IBM Corp. 2023 |
| 3 | +# |
| 4 | +# s390-tools is free software; you can redistribute it and/or modify |
| 5 | +# it under the terms of the MIT license. See LICENSE for details. |
| 6 | +# |
| 7 | +# zdev-from-dasd_mod.dasd |
| 8 | +# Shell library, which can be sourced by other POSIX compatible shell scripts. |
| 9 | +# Provide helper function parsing its stdin based on the syntax of kernel |
| 10 | +# device driver parameter dasd_mod.dasd= and invoking chzdev to produce |
| 11 | +# corresponding persistent device configurations. The helper function |
| 12 | +# takes one argument, which is either "globals" or "ranges". For a |
| 13 | +# complete configuration, call the function twice, first with "globals" |
| 14 | +# and then with "ranges". |
| 15 | +# |
| 16 | +# shellcheck shell=sh |
| 17 | + |
| 18 | +# It would be possible to pass the collected rd.dasd options via |
| 19 | +# modprobe.d. However, it is still required to parse the options to handle |
| 20 | +# cio_ignore. That in turn ensures devices get sensed. Sensing is in turn |
| 21 | +# required for automatically loading the device drivers via modalias and |
| 22 | +# for the dasd device driver to find devices it can probe (set online). So |
| 23 | +# go all the way and parse the rd.dasd options. For device bus-IDs, use |
| 24 | +# chzdev, which not only handles cio_ignore transparently, but also |
| 25 | +# generates persistent configuration that can be transferred from initrd to |
| 26 | +# another root files system such as in a distro installer environment. |
| 27 | + |
| 28 | +zdev_dasd_base_args="--no-settle --yes --no-root-update --force" |
| 29 | + |
| 30 | +zdev_parse_dasd_list() { |
| 31 | + sed 's/,/\n/g' | while read -r _zdev_dasditem; do |
| 32 | + unset _zdev_dasd_range _zdev_dasd_features _zdev_dasd_attrs |
| 33 | + case $_zdev_dasditem in |
| 34 | + autodetect|probeonly|nopav|nofcx) |
| 35 | + [ "$1" = "globals" ] || continue |
| 36 | + # Autodetect can of course only enable devices that are not |
| 37 | + # in the cio_ignore list. |
| 38 | + # Intentionally do not dynamically configure now, but only |
| 39 | + # generate a modprobe.d file, which configures the device |
| 40 | + # later during kernel module load. |
| 41 | + echo "rd.dasd ...,${_zdev_dasditem},... :" |
| 42 | + # shellcheck disable=SC2086 |
| 43 | + chzdev dasd --type "${_zdev_dasditem}=1" --persistent \ |
| 44 | + $zdev_dasd_base_args |
| 45 | + ;; |
| 46 | + "") continue ;; # empty range |
| 47 | + *) # currently no support for a device-spec "ipldev", only devbusid |
| 48 | + [ "$1" = "ranges" ] || continue |
| 49 | + SAVED_IFS="$IFS" |
| 50 | + IFS='(' |
| 51 | + read -r _zdev_dasd_range _zdev_dasd_features <<EOF |
| 52 | +$_zdev_dasditem |
| 53 | +EOF |
| 54 | + IFS="$SAVED_IFS" |
| 55 | + if [ "${_zdev_dasd_features%%*)}" != "" ]; then |
| 56 | + warn "rd.dasd: Missing closing parenthesis at features of DASD range $_zdev_dasd_range: ($_zdev_dasd_features" |
| 57 | + fi |
| 58 | + if [ -n "$_zdev_dasd_features" ]; then |
| 59 | + _zdev_dasd_features="${_zdev_dasd_features%)}" |
| 60 | + _zdev_dasd_features=$(echo "$_zdev_dasd_features" | sed 's/:/\n/g') |
| 61 | + while read -r _zdev_dasd_feature; do |
| 62 | + case $_zdev_dasd_feature in |
| 63 | + ro) _zdev_dasd_attrs="$_zdev_dasd_attrs readonly=1" ;; |
| 64 | + diag) _zdev_dasd_attrs="$_zdev_dasd_attrs use_diag=1" ;; |
| 65 | + raw) _zdev_dasd_attrs="$_zdev_dasd_attrs raw_track_access=1" ;; |
| 66 | + erplog|failfast) _zdev_dasd_attrs="$_zdev_dasd_attrs ${_zdev_dasd_feature}=1" ;; |
| 67 | + *) |
| 68 | + warn "rd.dasd: Unknown DASD feature for device range $_zdev_dasd_range: $_zdev_dasd_feature" |
| 69 | + ;; |
| 70 | + esac |
| 71 | + done <<EOF |
| 72 | +$_zdev_dasd_features |
| 73 | +EOF |
| 74 | + fi |
| 75 | + # Without dynamic (active) config zdev cannot infer |
| 76 | + # the actual dasd type (eckd, fba) so configure for both. |
| 77 | + echo "rd.dasd ...,${_zdev_dasditem},... :" |
| 78 | + # shellcheck disable=SC2086 |
| 79 | + chzdev dasd-eckd --enable --persistent "$_zdev_dasd_range" $_zdev_dasd_attrs \ |
| 80 | + $zdev_dasd_base_args |
| 81 | + # shellcheck disable=SC2086 |
| 82 | + chzdev dasd-fba --enable --persistent "$_zdev_dasd_range" $_zdev_dasd_attrs \ |
| 83 | + $zdev_dasd_base_args |
| 84 | + ;; |
| 85 | + esac |
| 86 | + done # input redir w/ process substitution causes syntax error in dracut env |
| 87 | +} |
0 commit comments