On Fri, Oct 30, 2015 at 03:52:10PM +0000, Edward Tomasz Napierala wrote:
> Author: trasz
> Date: Fri Oct 30 15:52:10 2015
> New Revision: 290197
> URL: https://svnweb.freebsd.org/changeset/base/290197

> Log:
>   After r290196, the kernel won't wait for stuff like gmirror nodes
>   if they are not required for mounting rootfs.  However, it's possible
>   that some setups try to mount them in mountcritlocal (ie from fstab).

>   Export the list of current root mount holds using a new sysctl,
>   vfs.root_mount_hold, and make mountcritlocal retry if "mount -a" fails
>   and the list is not empty.

>   MFC after:  1 month
>   Sponsored by:       The FreeBSD Foundation
>   Differential Revision:      https://reviews.freebsd.org/D3709

I like the faster startup, but the rc.d script clearly will not wait as
intended. See below.

> Modified:
>   head/etc/defaults/rc.conf
>   head/etc/rc.d/mountcritlocal
>   head/sys/kern/vfs_mountroot.c

> [snip]
> Modified: head/etc/rc.d/mountcritlocal
> ==============================================================================
> --- head/etc/rc.d/mountcritlocal      Fri Oct 30 15:35:04 2015        
> (r290196)
> +++ head/etc/rc.d/mountcritlocal      Fri Oct 30 15:52:10 2015        
> (r290197)
> @@ -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.

These lines are a bit too long.

>       mount -a -t ${mount_excludes}
>       err=$?
> +     if [ $? -ne 0 ]; then

The assignment will set $? to 0, so the new code will never be executed.
"$err" should be tested instead of $?.

> +             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
> [snip]

-- 
Jilles Tjoelker
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to