--- zfs.orig 2018-10-19 13:42:38.188027000 +0200 +++ zfs 2019-05-17 19:41:07.712859000 +0200 @@ -16,6 +16,23 @@ stop_cmd="zfs_stop" required_modules="zfs" +# +# Add the following lines to /etc/rc.conf to enable ZFS ordered mount: +# zfs_ordered_mount_enable (bool): Mount ZFS in order (or NO). +# zfs_ordered_mount_zpools (str): Ordered list of all zpools to mount. +# zfs_ordered_mount_zpoolname_egrep_filter (str): Optional egrep(1) pattern for filtering unwanted filesystems, one per zpool. +# Filesystems having canmount=off will be excluded automatically. +# +# Example: +# zfs_ordered_mount_enable="YES" +# zfs_ordered_mount_zpools="zroot zdata" +# zfs_ordered_mount_zroot_egrep_filter="zroot\$|zroot/ROOT|zroot/do-not-destroy" +# zfs_ordered_mount_zdata_egrep_filter="zdata\$|zdata/do-not-destroy" +# + +zfs_ordered_mount_enable=${zfs_ordered_mount_enable:-"NO"} +zfs_ordered_mount_zpools=${zfs_ordered_mount_zpools:-""} + zfs_start_jail() { if [ `$SYSCTL_N security.jail.mount_allowed` -eq 1 ]; then @@ -25,7 +42,28 @@ zfs_start_main() { - zfs mount -va + if checkyesno zfs_ordered_mount_enable; then + if [ -z "${zfs_ordered_mount_zpools}" ]; then + # Save those who forgot to list their zpools. + echo $0: missing value for zfs_ordered_mount_zpools, check /etc/rc.conf + zfs mount -av + else + local _zpool _egrep_filter_name _egrep_filter _fs + for _zpool in ${zfs_ordered_mount_zpools}; do + _egrep_filter_name=zfs_ordered_mount_${_zpool}_egrep_filter + _egrep_filter=`eval echo \$\{${_egrep_filter_name}\}` + if [ -n "${_egrep_filter}" ]; then + # Need to separate our ^off from the user's specification. + _egrep_filter="|${_egrep_filter}" + fi + for _fs in `zfs list -Hro canmount,name -t filesystem ${_zpool} | egrep -ve "^off${_egrep_filter}" | awk '{print $2}'`; do + zfs mount -v ${_fs} + done + done + fi + else + zfs mount -va + fi zfs share -a if [ ! -r /etc/zfs/exports ]; then touch /etc/zfs/exports