freebsd-nq/libexec/rc/rc.d/dumpon
Chuck Tuffli f30f11f878 wait for device mounts in zpool and dumpon
If the root file system is composed from multiple devices, wait for
devices to be ready before running zpool and dumpon rc scripts.

An example of this is if the bulk of the root file system exists on a
fast device (e.g. NVMe) but the /var directory comes from a ZFS dataset
on a slower device (e.g. SATA). In this case, it is possible that the
zpool import may run before the slower device has finished being probed,
leaving the system in an intermediate state.

Fix is to add root_hold_wait to the zpool and dumpon (which has a
similar issue) rc scripts.

PR:		242189
Reported by:	osidorkin@gmail.com
Reviewed by:	allanjude
MFC after:	1 month
Differential Revision:	https://reviews.freebsd.org/D29101
2021-04-05 09:25:04 -07:00

80 lines
1.3 KiB
Bash
Executable File

#!/bin/sh
#
# $FreeBSD$
#
# PROVIDE: dumpon
# BEFORE: disks
# KEYWORD: nojail
. /etc/rc.subr
name="dumpon"
desc="Dump kernel corefiles from swap to disk"
start_cmd="dumpon_start"
stop_cmd="dumpon_stop"
dumpon_try()
{
local flags
flags=${dumpon_flags}
if [ -n "${dumppubkey}" ]; then
warn "The dumppubkey variable is deprecated. Use dumpon_flags."
flags="${flags} -k ${dumppubkey}"
fi
/sbin/dumpon ${flags} "${1}"
if [ $? -eq 0 ]; then
# Make a symlink in devfs for savecore
ln -fs "${1}" /dev/dumpdev
return 0
fi
warn "unable to specify $1 as a dump device"
return 1
}
dumpon_start()
{
# Enable dumpdev so that savecore can see it. Enable it
# early so a crash early in the boot process can be caught.
#
case ${dumpdev} in
[Nn][Oo] | '')
;;
[Aa][Uu][Tt][Oo])
root_hold_wait
dev=$(/bin/kenv -q dumpdev)
if [ -n "${dev}" ] ; then
dumpon_try "${dev}"
return $?
fi
while read dev mp type more ; do
[ "${type}" = "swap" ] || continue
[ -c "${dev}" ] || continue
dumpon_try "${dev}" 2>/dev/null && return 0
done </etc/fstab
echo "No suitable dump device was found." 1>&2
return 1
;;
*)
root_hold_wait
dumpon_try "${dumpdev}"
;;
esac
}
dumpon_stop()
{
case ${dumpdev} in
[Nn][Oo] | '')
;;
*)
rm -f /dev/dumpdev
/sbin/dumpon -v off
;;
esac
}
load_rc_config $name
run_rc_command "$1"