summaryrefslogtreecommitdiffstats
path: root/patches/grub-mkconfig-zfs-support.diff
blob: ab5362c8fb36ca58fc8160ebe2bb8fcbd7407ea0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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`"