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