X-Git-Url: https://git.camperquake.de/gitweb.cgi?a=blobdiff_plain;f=etc%2Finit.d%2Fzfs.gentoo;h=f709ed9e7d6bc2406fbf5e01d82e48f30e816ae7;hb=1ef5e8296a07a0d208d0663ae966c8b0206f7e6a;hp=1d8ece2c8ce4bd446baaa87cd9f9040b77957e9a;hpb=06abcdd3f44999f694766b22a5fc42d125aa9bef;p=zfs.git diff --git a/etc/init.d/zfs.gentoo b/etc/init.d/zfs.gentoo index 1d8ece2..f709ed9 100644 --- a/etc/init.d/zfs.gentoo +++ b/etc/init.d/zfs.gentoo @@ -5,21 +5,19 @@ depend() { - before net - after udev + # bootmisc will log to /var which may be a different zfs than root. + before net bootmisc + after udev localmount keyword -lxc -openvz -prefix -vserver } CACHEFILE=/etc/zfs/zpool.cache -ZPOOL=/usr/sbin/zpool -ZFS=/usr/sbin/zfs +ZPOOL=/sbin/zpool +ZFS=/sbin/zfs ZFS_MODULE=zfs checksystem() { - if [ -c /dev/zfs ]; then - einfo "ZFS modules already loaded" - return 0 - else + if [ ! -c /dev/zfs ]; then einfo "Checking if ZFS modules present" if [ "x$(modprobe -l $ZFS_MODULE | grep $ZFS_MODULE)" == "x" ]; then eerror "$ZFS_MODULE not found. Is the ZFS package installed?" @@ -41,6 +39,10 @@ checksystem() { start() { ebegin "Starting ZFS" checksystem || return 1 + + # Delay until all required block devices are present. + udevadm settle + if [ ! -c /dev/zfs ]; then modprobe $ZFS_MODULE rv=$? @@ -75,16 +77,14 @@ start() { return $rv fi - # hack to read mounted file systems because otherwise - # zfs returns EPERM when a non-root user reads a mounted filesystem before root did - savepwd="$PWD" - mount | grep " type zfs " | sed 's/.*on //' | sed 's/ type zfs.*$//' | \ - while read line - do - cd "$line" &> /dev/null - ls &> /dev/null - done - cd "$savepwd" + einfo "Exporting ZFS filesystems" + $ZFS share -a + rv=$? + if [ $rv -ne 0 ]; then + eerror "Failed to export ZFS filesystems." + eend $rv + return $rv + fi eend 0 return 0 @@ -96,10 +96,12 @@ stop() $ZFS umount -a rv=$? if [ $rv -ne 0 ]; then - eerror "Failed to umount ZFS filesystems." + einfo "Some ZFS filesystems not unmounted" fi - eend $rv + # Don't fail if we couldn't umount everything. /usr might be in use. + eend 0 + return 0 } status()