1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
|
#
# 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.
#
#
# 95zdev/zdev-lib.sh
# Common shell library functionality for 95zdev and 95zdev-kdump.
#
# shellcheck shell=bash
zdev_is_kdump() {
# https://src.fedoraproject.org/rpms/kexec-tools/c/4eedcae5e1540690a3761857fe2e692774c44960
# https://src.fedoraproject.org/rpms/kexec-tools/blob/rawhide/f/mkdumprd
# https://src.fedoraproject.org/rpms/kexec-tools/blob/rawhide/f/dracut-module-setup.sh
# shellcheck disable=SC2154
if [[ $hostonly && "$hostonly_mode" == "strict" && -n "$IN_KDUMP" ]]; then
return 0
fi
# https://github.com/openSUSE/kdump/blob/master/dracut/module-setup.sh
# shellcheck disable=SC2154
if [[ " $dracutmodules $add_dracutmodules $force_add_dracutmodules " == *\ kdump\ * ]]; then
return 0
fi
return 1
}
zdev_zfcp_auto_lun_scan_active() {
local _fcpdevsysfs=$1
local _porttype _lunscan
read -r _porttype < "$_fcpdevsysfs"/host*/fc_host/host*/port_type
read -r _lunscan < /sys/module/zfcp/parameters/allow_lun_scan
if [[ "$_porttype" == "NPIV VPORT" && "$_lunscan" == "Y" ]]; then
return 0
fi
return 1
}
# zdev_check_dev() can be extended for other device types such as PCIe
zdev_check_dev() {
local _dev=$1
local _devsysfs _devtype _subsystem _driver
local _intlun _fcplun _scsitarget _wwpn _hbaid
local _busid _arg
_devsysfs=$(
cd -P /sys/dev/block/"$_dev" 2> /dev/null && echo "$PWD"
)
# This is roughly what systemd's udev-builtin-path_id does:
while [[ -n "$_devsysfs" ]]; do
# ascend to parent: strip last path part
_devsysfs=${_devsysfs%/*}
_subsystem=$(
cd -P "$_devsysfs"/subsystem 2> /dev/null && echo "$PWD"
)
if [[ "${_subsystem##*/}" == "scsi" ]]; then
_devtype=$(grep "^DEVTYPE=" "$_devsysfs"/uevent)
# check for FCP LUN
if [[ "$_devtype" == "DEVTYPE=scsi_device" ]]; then
_intlun=${_devsysfs##*:}
# convert _intlun to _fcplun [int_to_scsilun()]
_fcplun=0
((_fcplun |= (_intlun & 0x000000000000ffff) << 48))
((_fcplun |= (_intlun & 0x00000000ffff0000) << 16))
((_fcplun |= (_intlun & 0x0000ffff00000000) >> 16))
((_fcplun |= (_intlun & 0xffff000000000000) >> 48))
printf -v _fcplun "0x%016x" "$_fcplun"
# bail out if not scsi_transport_fc
[[ "${_devsysfs/*rport-*/FOUND}" == "FOUND" ]] || return 0
continue
fi
# check for target WWPN
if [[ "$_devtype" == "DEVTYPE=scsi_target" ]]; then
_scsitarget=${_devsysfs##*/}
read -r _wwpn < "$_devsysfs/fc_transport/$_scsitarget/port_name"
continue
fi
fi
if [[ "${_subsystem##*/}" == "ccw" ]]; then
_driver=$(
cd -P "$_devsysfs"/driver 2> /dev/null && echo "$PWD"
)
# check for FCP device (vHBA) bus-ID
if [[ "${_driver##*/}" == "zfcp" ]]; then
_hbaid=${_devsysfs##*/}
# drop full path and use zfcp auto LUN scan, if:
# - not building for kdump which has zfcp auto LUN scan off
# - and zfcp auto LUN scan is available
if ! zdev_is_kdump && \
zdev_zfcp_auto_lun_scan_active "$_devsysfs"; then
unset _wwpn
unset _fcplun
fi
if [[ -n "$_wwpn" ]] && [[ -n "$_fcplun" ]]; then
printf " rd.zfcp=%s,%s,%s\n" "$_hbaid" "$_wwpn" "$_fcplun"
else
printf " rd.zfcp=%s\n" "$_hbaid"
fi
break
fi
# check for DASD device bus-ID
if [[ "${_driver##*/}" == dasd-* ]]; then
_busid=${_devsysfs##*/}
_arg=$(/lib/s390-tools/zdev-to-dasd_mod.dasd "active" "$_busid")
printf " rd.dasd=%s\n" "$_arg"
break
fi
fi
done
}
|