Pass boot=zfs and zfs-bootfs=... when / is ZFS on Linux Index: grub/util/grub.d/10_linux.in =================================================================== --- grub.orig/util/grub.d/10_linux.in 2012-02-02 03:34:48.512644650 -0600 +++ grub/util/grub.d/10_linux.in 2012-02-03 01:12:57.608355000 -0600 @@ -56,13 +56,11 @@ LINUX_ROOT_DEVICE=UUID=${GRUB_DEVICE_UUID} fi -if [ "x`${grub_probe} --device ${GRUB_DEVICE} --target=fs 2>/dev/null || true`" = xbtrfs ] \ - || [ "x`stat -f --printf=%T /`" = xbtrfs ]; then - rootsubvol="`make_system_path_relative_to_its_root /`" - rootsubvol="${rootsubvol#/}" - if [ "x${rootsubvol}" != x ]; then - GRUB_CMDLINE_LINUX="rootflags=subvol=${rootsubvol} ${GRUB_CMDLINE_LINUX}" - fi +LINUX_ROOT_FS=`${grub_probe} --device ${GRUB_DEVICE} --target=fs 2>/dev/null || true` +LINUX_ROOT_STAT=`stat -f --printf=%T / || true` + +if [ "x${LINUX_ROOT_FS}" = xzfs ]; then + RPOOL=`${grub_probe} --device ${GRUB_DEVICE} --target=fs_label 2>/dev/null || true` fi for word in $GRUB_CMDLINE_LINUX_DEFAULT; do @@ -193,6 +191,19 @@ version=`echo $basename | sed -e "s,^[^0-9]*-,,g"` alt_version=`echo $version | sed -e "s,\.old$,,g"` linux_root_device_thisversion="${LINUX_ROOT_DEVICE}" + cmdline="" + if [ "x${LINUX_ROOT_FS}" = xbtrfs -o "x${LINUX_ROOT_STAT}" = xbtrfs ]; then + rootsubvol="`make_system_path_relative_to_its_root /`" + rootsubvol="${rootsubvol#/}" + if [ "x${rootsubvol}" != x ]; then + cmdline="rootflags=subvol=${rootsubvol} ${cmdline}" + fi + fi + if [ "x${LINUX_ROOT_FS}" = xzfs ]; then + bootfs="`make_system_path_relative_to_its_root / | sed -e "s,@$,,"`" + linux_root_device_thisversion="ZFS=${RPOOL}${bootfs}" + cmdline="boot=zfs rpool=${RPOOL} bootfs=${RPOOL}${bootfs} ${cmdline}" + fi initrd= for i in "initrd.img-${version}" "initrd-${version}.img" "initrd-${version}.gz" \ @@ -229,7 +240,7 @@ fi linux_entry "${OS}" "${version}" false \ - "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_EXTRA} ${GRUB_CMDLINE_LINUX_DEFAULT}" \ + "${cmdline} ${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_EXTRA} ${GRUB_CMDLINE_LINUX_DEFAULT}" \ quiet if [ "x${GRUB_DISABLE_RECOVERY}" != "xtrue" ]; then if [ -x /lib/recovery-mode/recovery-menu ]; then