mountcritlocal revision 298514
1194084Sedwin#!/bin/sh
2194084Sedwin#
3194084Sedwin# $FreeBSD: head/etc/rc.d/mountcritlocal 298514 2016-04-23 16:10:54Z lme $
4194084Sedwin#
5194084Sedwin
6194084Sedwin# PROVIDE: mountcritlocal
7194084Sedwin# REQUIRE: root hostid_save mdconfig
8194084Sedwin# KEYWORD: nojail shutdown
9194084Sedwin
10194084Sedwin. /etc/rc.subr
11194084Sedwin
12194084Sedwinname="mountcritlocal"
13194084Sedwindesc="Mount critical local filesystems"
14194084Sedwinstart_cmd="mountcritlocal_start"
15194084Sedwinstop_cmd=sync
16194084Sedwin
17194084Sedwinmountcritlocal_start()
18194084Sedwin{
19194084Sedwin	local err holders waited
20194084Sedwin
21194084Sedwin	# Set up the list of network filesystem types for which mounting
22194084Sedwin	# should be delayed until after network initialization.
23194084Sedwin	case ${extra_netfs_types} in
24194084Sedwin	[Nn][Oo])
25194084Sedwin		;;
26194084Sedwin	*)
27194084Sedwin		netfs_types="${netfs_types} ${extra_netfs_types}"
28194084Sedwin		;;
29194084Sedwin	esac
30194084Sedwin
31194084Sedwin	# Mount everything except nfs filesystems.
32194084Sedwin	check_startmsgs && echo -n 'Mounting local filesystems:'
33194084Sedwin	mount_excludes='no'
34194084Sedwin	for i in ${netfs_types}; do
35194084Sedwin		fstype=${i%:*}
36194084Sedwin		mount_excludes="${mount_excludes}${fstype},"
37194084Sedwin	done
38194084Sedwin	mount_excludes=${mount_excludes%,}
39194084Sedwin
40194084Sedwin	# Originally, root mount hold had to be released before mounting
41194084Sedwin	# the root filesystem.  This delayed the boot, so it was changed
42194084Sedwin	# to only wait if the root device isn't readily available.  This
43194084Sedwin	# can result in this script executing before all the devices - such
44194084Sedwin	# as graid(8) - are available.  Thus, should the mount fail,
45194084Sedwin	# we will wait for the root mount hold release and retry.
46194084Sedwin	mount -a -t ${mount_excludes}
47194084Sedwin	err=$?
48194084Sedwin	if [ ${err} -ne 0 ]; then
49194084Sedwin		echo
50194084Sedwin		echo 'Mounting /etc/fstab filesystems failed,' \
51194084Sedwin		    'will retry after root mount hold release'
52194084Sedwin
53194084Sedwin		waited=0
54194084Sedwin		while [ ${waited} -lt ${root_hold_delay} ]; do
55194084Sedwin			holders="$(sysctl -n vfs.root_mount_hold)"
56194084Sedwin			if [ -z "${holders}" ]; then
57194084Sedwin				break;
58194084Sedwin			fi
59194084Sedwin			if [ ${waited} -eq 0 ]; then
60194084Sedwin				echo -n "Waiting ${root_hold_delay}s" \
61194084Sedwin				"for the root mount holders: ${holders}"
62194084Sedwin			else
63194084Sedwin				echo -n .
64194084Sedwin			fi
65194084Sedwin			if [ ${waited} -eq ${root_hold_delay} ]; then
66194084Sedwin				break 2
67194084Sedwin			fi
68194084Sedwin			sleep 1
69194084Sedwin			waited=$(($waited + 1))
70194084Sedwin		done
71194084Sedwin		mount -a -t ${mount_excludes}
72194084Sedwin		err=$?
73194084Sedwin	fi
74194084Sedwin
75194084Sedwin	check_startmsgs && echo '.'
76194084Sedwin
77194084Sedwin	case ${err} in
78194084Sedwin	0)
79194084Sedwin		;;
80194084Sedwin	*)
81194084Sedwin		echo 'Mounting /etc/fstab filesystems failed,' \
82194084Sedwin		    'startup aborted'
83194084Sedwin		stop_boot true
84194084Sedwin		;;
85194084Sedwin	esac
86194084Sedwin}
87194084Sedwin
88194084Sedwinload_rc_config $name
89194084Sedwinrun_rc_command "$1"
90194084Sedwin