Module Name: src Committed By: alnsn Date: Thu Feb 3 20:52:44 UTC 2022
Modified Files: src/etc: rc.subr Log Message: Add mount_critical_filesystems_zfs The new function is similar to mount_critical_filesystems but it walks through ZFS datasets and mounts matching entries. To generate a diff of this commit: cvs rdiff -u -r1.107 -r1.108 src/etc/rc.subr Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/etc/rc.subr diff -u src/etc/rc.subr:1.107 src/etc/rc.subr:1.108 --- src/etc/rc.subr:1.107 Sat Nov 6 23:11:43 2021 +++ src/etc/rc.subr Thu Feb 3 20:52:44 2022 @@ -1,4 +1,4 @@ -# $NetBSD: rc.subr,v 1.107 2021/11/06 23:11:43 christos Exp $ +# $NetBSD: rc.subr,v 1.108 2022/02/03 20:52:44 alnsn Exp $ # # Copyright (c) 1997-2011 The NetBSD Foundation, Inc. # All rights reserved. @@ -202,6 +202,79 @@ mount_critical_filesystems() } # +# mount_critical_filesystems_zfs +# Go through the list of critical ZFS mountpoints as provided in +# the rc.conf(5) variable $critical_filesystems_zfs, checking +# each one to see if it is mounted, and if it is not, mounting it. +# It's not an error if file systems prefixed with "OPTIONAL:" +# aren't zfs mountpoints. +mount_critical_filesystems_zfs() +{ + eval _fslist=\$critical_filesystems_zfs + _tab=" " + _mountcrit_es=0 + for _fs in $_fslist; do + _optional=false + case "$_fs" in + OPTIONAL:*) + _optional=true + _fs="${_fs#*:}" + ;; + esac + + _dataset=` + zfs list -H -o mountpoint,name | + while read _line ; do + _dataset='' + case "$_line" in + "${_fs}${_tab}"*) + _dataset="${_line#*${_tab}}" + ;; + esac + if [ -n "$_dataset" ]; then + case "$( zfs get -H -o value canmount $_dataset )" in + on) + echo -n "$_dataset" + break ;; + *) # noauto|off - dataset isn't supposed to be mounted + ;; + esac + fi + done` + + if [ -z "$_dataset" ]; then + if $_optional; then + # ignore this error + print_rc_metadata \ + "note:Optional file system $_fs is not present" + else + printf >&2 "%s\n" "No suitable ZFS dataset found for mountpoint $_fs" + _mountcrit_es=1 + fi + else + _mount_es= + case "$( zfs get -H -o value mounted $_dataset )" in + yes) + _mount_es=1 + print_rc_metadata \ + "note:File system $_fs was already mounted" + ;; + esac + + if [ -z "$_mount_es" ]; then + zfs mount "$_dataset" >/dev/null + _mount_es=$? + fi + + if [ -n "$_mount_es" ]; then + _mountcrit_es="$_mount_es" + fi + fi + done + return $_mountcrit_es +} + +# # check_pidfile pidfile procname [interpreter] # Parses the first line of pidfile for a PID, and ensures # that the process is running and matches procname.