summaryrefslogtreecommitdiffstats
path: root/etc
diff options
context:
space:
mode:
Diffstat (limited to 'etc')
-rw-r--r--etc/defaults/rc.conf1
-rwxr-xr-xetc/rc.d/mountcritlocal38
2 files changed, 37 insertions, 2 deletions
diff --git a/etc/defaults/rc.conf b/etc/defaults/rc.conf
index fbe18db..4c0e899 100644
--- a/etc/defaults/rc.conf
+++ b/etc/defaults/rc.conf
@@ -84,6 +84,7 @@ geli_autodetach="YES" # Automatically detach on last close.
#geli_mirror_home_flags="-k /etc/geli/home.keys"
root_rw_mount="YES" # Set to NO to inhibit remounting root read-write.
+root_hold_delay="30" # Time to wait for root mount hold release.
fsck_y_enable="NO" # Set to YES to do fsck -y if the initial preen fails.
fsck_y_flags="" # Additional flags for fsck -y
background_fsck="YES" # Attempt to run fsck in the background where possible.
diff --git a/etc/rc.d/mountcritlocal b/etc/rc.d/mountcritlocal
index 06bf464..1513ec7 100755
--- a/etc/rc.d/mountcritlocal
+++ b/etc/rc.d/mountcritlocal
@@ -15,7 +15,7 @@ stop_cmd=sync
mountcritlocal_start()
{
- local err
+ local err holders waited
# Set up the list of network filesystem types for which mounting
# should be delayed until after network initialization.
@@ -35,8 +35,42 @@ mountcritlocal_start()
mount_excludes="${mount_excludes}${fstype},"
done
mount_excludes=${mount_excludes%,}
+
+ # Originally, root mount hold had to be released before mounting the root
+ # filesystem. This delayed the boot, so it was changed to only wait if
+ # the root device isn't readily available. This can result in this script
+ # executing before all the devices - such as graid(8) - are available.
+ # Thus, should the mount fail, we will wait for the root mount hold release
+ # and retry.
mount -a -t ${mount_excludes}
err=$?
+ if [ $? -ne 0 ]; then
+ echo
+ echo 'Mounting /etc/fstab filesystems failed,' \
+ 'will retry after root mount hold release'
+
+ waited=0
+ while [ ${waited} -lt ${root_hold_delay} ]; do
+ holders="$(sysctl -n vfs.root_mount_hold)"
+ if [ -z "${holders}" ]; then
+ break;
+ fi
+ if [ ${waited} -eq 0 ]; then
+ echo -n "Waiting ${root_hold_delay}s" \
+ "for the root mount holders: ${holders}"
+ else
+ echo -n .
+ fi
+ if [ ${waited} -eq ${root_hold_delay} ]; then
+ break 2
+ fi
+ sleep 1
+ waited=$(($waited + 1))
+ done
+ mount -a -t ${mount_excludes}
+ err=$?
+ fi
+
check_startmsgs && echo '.'
case ${err} in
@@ -44,7 +78,7 @@ mountcritlocal_start()
;;
*)
echo 'Mounting /etc/fstab filesystems failed,' \
- ' startup aborted'
+ 'startup aborted'
stop_boot true
;;
esac
OpenPOWER on IntegriCloud