diff -up ./util/grub-mkconfig.in.original ./util/grub-mkconfig.in --- ./util/grub-mkconfig.in.original 2012-03-27 13:03:49.475388000 -0700 +++ ./util/grub-mkconfig.in 2012-03-27 13:06:38.948080000 -0700 @@ -140,9 +140,24 @@ if test -e ${GRUB_PREFIX}/device.map ; t ${grub_mkdevicemap} fi -# Device containing our userland. Typically used for root= parameter. -GRUB_DEVICE="`${grub_probe} --target=device /`" -GRUB_DEVICE_UUID="`${grub_probe} --device ${GRUB_DEVICE} --target=fs_uuid 2> /dev/null`" || true +# Attempt to detect if the root file system is in ZFS first +unset GRUB_DEVICE +unset GRUB_DEVICE_BOOT +getzfsgrubdevice() { + mount | while read dev dummy mntpnt dummy2 fstype rest ; do + if [ -n "$GRUB_DEVICE" ] ; then break ; fi + if [ "$fstype" != "zfs" ] ; then continue ; fi + if [ "$mntpnt" != "/" ] ; then continue ; fi + GRUB_DEVICE=`fstab-decode echo "$dev"` + GRUB_DEVICE="ZFS=$GRUB_DEVICE" ; echo "$GRUB_DEVICE" ; break + done +} +GRUB_DEVICE=`getzfsgrubdevice` +if [ -z "$GRUB_DEVICE" ] ; then + # Device containing our userland. Typically used for root= parameter. + GRUB_DEVICE="`${grub_probe} --target=device /`" + GRUB_DEVICE_UUID="`${grub_probe} --device ${GRUB_DEVICE} --target=fs_uuid 2> /dev/null`" || true +fi # Device containing our /boot partition. Usually the same as GRUB_DEVICE. GRUB_DEVICE_BOOT="`${grub_probe} --target=device /boot`"