This syncs the fs-local service improvements from OmniOS.

Copyright 2018-2019 Andy Fiddaman <omnios@citrus-it.co.uk>

--- a/usr/src/cmd/svc/milestone/fs-local
+++ b/usr/src/cmd/svc/milestone/fs-local
@@ -88,6 +88,11 @@ fi
 # Mount all ZFS filesystems.
 
 if [ -x /usr/sbin/zfs ]; then
+	parallel=`svcprop -p config/parallel $SMF_FMRI`
+	if [ "$val" = "false" ]; then
+		ZFS_SERIAL_MOUNT=1
+		export ZFS_SERIAL_MOUNT
+	fi
 	/usr/sbin/zfs mount -va >/dev/msglog 2>&1
 	rc=$?
 	if [ $rc -ne 0 ]; then
--- a/usr/src/cmd/svc/milestone/local-fs.xml
+++ b/usr/src/cmd/svc/milestone/local-fs.xml
@@ -68,6 +68,10 @@
 		<propval name='duration' type='astring' value='transient' />
 	</property_group>
 
+	<property_group name='config' type='application'>
+		<propval name='parallel' type='boolean' value='true' />
+	</property_group>
+
 	<stability value='Unstable' />
 
 	<template>

--- a/usr/src/cmd/svc/milestone/fs-local
+++ b/usr/src/cmd/svc/milestone/fs-local
@@ -100,6 +100,36 @@ if [ -x /usr/sbin/zfs ]; then
 		echo $msg
 		echo "$SMF_FMRI:" $msg >/dev/msglog
 		result=$SMF_EXIT_MON_DEGRADE
+	else
+		# Mount all encrypted datasets for which the key is available
+		numenc=0
+		failed=
+		echo 'Loading encryption keys: \c'
+		/usr/sbin/zfs list -Ho name,encryption,keylocation | \
+		    while read name enc loc; do
+			[ "$enc" = off ] && continue
+			[[ "$loc" = file:///* ]] || continue
+			[ -f "${loc#file://}" ] || continue
+			/usr/sbin/zfs load-key "$name" </dev/null >/dev/msglog
+			if [ $? -eq 0 ]; then
+				echo "$name \\c"
+				((numenc++))
+			else
+				failed+="$name "
+			fi
+		done
+		echo
+		if [ -n "$failed" ]; then
+			msg="WARNING: Failed to load keys for $failed"
+			echo $msg
+			echo "$SMF_FMRI:" $msg >/dev/msglog
+		fi
+		if [ $numenc -gt 0 ]; then
+			msg="Mounting encrypted filesystems"
+			echo $msg
+			echo "$SMF_FMRI:" $msg >/dev/msglog
+			/usr/sbin/zfs mount -va >/dev/msglog 2>&1
+		fi
 	fi
 fi
 
