mirror of
https://github.com/ibm-s390-linux/s390-tools.git
synced 2026-08-05 02:14:52 +00:00
When we have identified the current event subject to represent the re-IPL target, we record its WWID for future identification in a stateful ID-file (per default: /run/udev/chreiplzfcpmp-ipl-volume-id). In addition to the WWID, we also record the current re-IPL triplet (<Dev-Bus-ID>:<WWPN>:<LUN>), so that when that changes - e.g. due to an operator manually changing the re-IPL target -, we know that the recorded WWID is stale. This record may be used in cases when the current re-IPL target is completely gone from the system, so we can't used it as comparison object for when events arrive for paths that go to the same volume, but don't have the same I_T_L nexus. They however have the same WWID. We may use these (new) paths as replacement for the one that is completely gone. The new helper `chreipl-fcp-mpath-record-volume-identifier` uses the kernel scsi-device attribute `wwid` as source for the WWID (verbatim). As with reading the re-IPL firmware information, when writing to the ID-file, a lock is taken via `flock`, to prevent overlapping writes/reads to the file. Reviewed-by: Steffen Maier <maier@linux.ibm.com> Signed-off-by: Benjamin Block <bblock@linux.ibm.com> Signed-off-by: Jan Höppner <hoeppner@linux.ibm.com>
74 lines
2.0 KiB
Bash
74 lines
2.0 KiB
Bash
#!/bin/bash
|
|
# SPDX-License-Identifier: MIT
|
|
#
|
|
# chreipl-fcp-mpath: use multipath information to change FCP IPL target
|
|
# (C) Copyright IBM Corp. 2021
|
|
#
|
|
# Uses the following system-utilities (and shell-builtins):
|
|
# Those necessary for sourced library:
|
|
# - chreipl-fcp-mpath-common.sh
|
|
# GNU coreutils:
|
|
# - truncate
|
|
# util-linux:
|
|
# - hexdump
|
|
|
|
# Record the identification of the volume we want to re-IPL from
|
|
#
|
|
# Makes use of udev event environment variables:
|
|
# DM_UUID
|
|
# SUBSYSTEM
|
|
# DEVPATH
|
|
|
|
# shellcheck disable=SC2034
|
|
declare -gr debug_trace_tag=10rvid
|
|
# shellcheck disable=SC1091
|
|
source '@chreiplzfcpmp-lib@' || exit 127
|
|
|
|
function id_file_record_ipl_information() {
|
|
local sdev_wwid="${1}" ipl_busid="${2}" ipl_wwpn="${3}" ipl_lun="${4}"
|
|
|
|
# lock file before writing ID, so noone sees any intermediate state
|
|
id_file_lock_exclusive_create || return 1
|
|
|
|
# reset ID without removing the file (necessary for the locking to work
|
|
# properly, since the FD we use for locking is on this file/inode)
|
|
truncate --no-create --size=0 "${ID_FILE}" || return 3
|
|
echo -ne "${sdev_wwid}\x00${ipl_busid}\x00${ipl_wwpn}\x00${ipl_lun}\x00" \
|
|
>>"${ID_FILE}" || return 4
|
|
|
|
if '@DEBUG@'; then hexdump -vC "${ID_FILE}" 1>&2; fi
|
|
|
|
id_file_unlock_exclusive_create
|
|
|
|
return 0
|
|
}
|
|
|
|
if [[ "${DM_UUID}" == mpath-* ]]; then
|
|
# Assume Multipath Device Mapper Device;
|
|
# e.g.: DEVPATH = /devices/virtual/block/dm-0
|
|
declare sdev
|
|
|
|
for sdev in /sys/"${DEVPATH}"/slaves/sd*/device; do
|
|
if sdev_get_wwid "${sdev}"; then
|
|
break
|
|
fi
|
|
done
|
|
unset sdev
|
|
|
|
elif [ "${SUBSYSTEM}" = block ]; then
|
|
# Assume SCSI Disk;
|
|
# e.g.: DEVPATH = /devices/css0/0.0.0014/0.0.1700/host0/rport-0:0-0/target0:0:0/0:0:0:1074806808/block/sds
|
|
|
|
sdev_get_wwid /sys/"${DEVPATH}"/device
|
|
fi
|
|
# shellcheck disable=SC2153
|
|
[ "${SDEV_WWID}" != "" ] || exit 1
|
|
|
|
firmware_get_ipl_information || exit 2
|
|
# shellcheck disable=SC2153
|
|
id_file_record_ipl_information \
|
|
"${SDEV_WWID}" "${IPL_BUSID}" "${IPL_WWPN}" "${IPL_LUN}" \
|
|
|| exit 3
|
|
|
|
exit 0
|