15a2072
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
15a2072
From: Michael Chang <mchang@suse.com>
15a2072
Date: Thu, 21 Aug 2014 03:39:11 +0000
15a2072
Subject: [PATCH] grub2-btrfs-05-grub2-mkconfig
15a2072
7e98da0
Signed-off-by: Michael Chang <mchang@suse.com>
15a2072
---
15a2072
 util/grub-mkconfig.in       |  3 ++-
15a2072
 util/grub-mkconfig_lib.in   |  4 ++++
a1dedc8
 util/grub.d/00_header.in    | 25 ++++++++++++++++++++++++-
15a2072
 util/grub.d/10_linux.in     |  4 ++++
15a2072
 util/grub.d/20_linux_xen.in |  4 ++++
a1dedc8
 5 files changed, 38 insertions(+), 2 deletions(-)
15a2072
15a2072
diff --git a/util/grub-mkconfig.in b/util/grub-mkconfig.in
13985b0
index 005f093809b..535c0f02499 100644
15a2072
--- a/util/grub-mkconfig.in
15a2072
+++ b/util/grub-mkconfig.in
13985b0
@@ -252,7 +252,8 @@ export GRUB_DEFAULT \
15a2072
   GRUB_BADRAM \
15a2072
   GRUB_OS_PROBER_SKIP_LIST \
15a2072
   GRUB_DISABLE_SUBMENU \
15a2072
-  GRUB_DEFAULT_DTB
15a2072
+  GRUB_DEFAULT_DTB \
15a2072
+  SUSE_BTRFS_SNAPSHOT_BOOTING
15a2072
 
15a2072
 if test "x${grub_cfg}" != "x"; then
15a2072
   rm -f "${grub_cfg}.new"
15a2072
diff --git a/util/grub-mkconfig_lib.in b/util/grub-mkconfig_lib.in
46968b6
index 42c2ea9ba50..fafeac95061 100644
15a2072
--- a/util/grub-mkconfig_lib.in
15a2072
+++ b/util/grub-mkconfig_lib.in
15a2072
@@ -52,7 +52,11 @@ grub_warn ()
15a2072
 
15a2072
 make_system_path_relative_to_its_root ()
15a2072
 {
15a2072
+  if [ "x${SUSE_BTRFS_SNAPSHOT_BOOTING}" = "xtrue" ] ; then
15a2072
+  "${grub_mkrelpath}" -r "$1"
15a2072
+  else
15a2072
   "${grub_mkrelpath}" "$1"
15a2072
+  fi
15a2072
 }
15a2072
 
15a2072
 is_path_readable_by_grub ()
15a2072
diff --git a/util/grub.d/00_header.in b/util/grub.d/00_header.in
a1dedc8
index 858b526c925..de727e6ee6b 100644
15a2072
--- a/util/grub.d/00_header.in
15a2072
+++ b/util/grub.d/00_header.in
15a2072
@@ -27,6 +27,14 @@ export TEXTDOMAINDIR="@localedir@"
15a2072
 
15a2072
 . "$pkgdatadir/grub-mkconfig_lib"
15a2072
 
15a2072
+if [ "x${SUSE_BTRFS_SNAPSHOT_BOOTING}" = "xtrue" ] &&
15a2072
+   [ "x${GRUB_FS}" = "xbtrfs" ] ; then
15a2072
+    cat <
15a2072
+set btrfs_relative_path="y"
15a2072
+export btrfs_relative_path
15a2072
+EOF
15a2072
+fi
15a2072
+
15a2072
 # Do this as early as possible, since other commands might depend on it.
15a2072
 # (e.g. the `loadfont' command might need lvm or raid modules)
15a2072
 for i in ${GRUB_PRELOAD_MODULES} ; do
15a2072
@@ -45,7 +53,9 @@ if [ "x${GRUB_TIMEOUT_BUTTON}" = "x" ] ; then GRUB_TIMEOUT_BUTTON="$GRUB_TIMEOUT
15a2072
 cat << EOF
15a2072
 set pager=1
15a2072
 
15a2072
-if [ -s \$prefix/grubenv ]; then
15a2072
+if [ -f \${config_directory}/grubenv ]; then
15a2072
+  load_env -f \${config_directory}/grubenv
15a2072
+elif [ -s \$prefix/grubenv ]; then
15a2072
   load_env
15a2072
 fi
15a2072
 EOF
a1dedc8
@@ -356,3 +366,16 @@ fi
a1dedc8
 if [ "x${GRUB_BADRAM}" != "x" ] ; then
a1dedc8
   echo "badram ${GRUB_BADRAM}"
a1dedc8
 fi
a1dedc8
+
a1dedc8
+if [ "x${SUSE_BTRFS_SNAPSHOT_BOOTING}" = "xtrue" ] &&
a1dedc8
+   [ "x${GRUB_ENABLE_BLSCFG}" = "xtrue" ] &&
a1dedc8
+   [ "x${GRUB_FS}" = "xbtrfs" ] ; then
a1dedc8
+    # Note: No $snapshot_num on *read-only* rollback!  (bsc#901487)
a1dedc8
+    cat <
a1dedc8
+if [ -n "\$extra_cmdline" ]; then
a1dedc8
+  submenu "Bootable snapshot #\$snapshot_num" {
a1dedc8
+    menuentry "If OK, run 'snapper rollback' and reboot." { true; }
a1dedc8
+  }
a1dedc8
+fi
a1dedc8
+EOF
a1dedc8
+fi
15a2072
diff --git a/util/grub.d/10_linux.in b/util/grub.d/10_linux.in
46968b6
index 0f3c19e30cc..cbfaca34cc7 100644
15a2072
--- a/util/grub.d/10_linux.in
15a2072
+++ b/util/grub.d/10_linux.in
15a2072
@@ -66,10 +66,14 @@ fi
15a2072
 
15a2072
 case x"$GRUB_FS" in
15a2072
     xbtrfs)
15a2072
+	if [ "x${SUSE_BTRFS_SNAPSHOT_BOOTING}" = "xtrue" ]; then
15a2072
+	GRUB_CMDLINE_LINUX="${GRUB_CMDLINE_LINUX} \${extra_cmdline}"
15a2072
+	else
15a2072
 	rootsubvol="`make_system_path_relative_to_its_root /`"
15a2072
 	rootsubvol="${rootsubvol#/}"
15a2072
 	if [ "x${rootsubvol}" != x ]; then
15a2072
 	    GRUB_CMDLINE_LINUX="rootflags=subvol=${rootsubvol} ${GRUB_CMDLINE_LINUX}"
15a2072
+	fi
15a2072
 	fi;;
15a2072
     xzfs)
15a2072
 	rpool=`${grub_probe} --device ${GRUB_DEVICE} --target=fs_label 2>/dev/null || true`
15a2072
diff --git a/util/grub.d/20_linux_xen.in b/util/grub.d/20_linux_xen.in
46968b6
index ada20775a14..e9e73b815fb 100644
15a2072
--- a/util/grub.d/20_linux_xen.in
15a2072
+++ b/util/grub.d/20_linux_xen.in
15a2072
@@ -73,10 +73,14 @@ fi
15a2072
 
15a2072
 case x"$GRUB_FS" in
15a2072
     xbtrfs)
15a2072
+	if [ "x${SUSE_BTRFS_SNAPSHOT_BOOTING}" = "xtrue" ]; then
15a2072
+	GRUB_CMDLINE_LINUX="${GRUB_CMDLINE_LINUX} \${extra_cmdline}"
15a2072
+	else
15a2072
 	rootsubvol="`make_system_path_relative_to_its_root /`"
15a2072
 	rootsubvol="${rootsubvol#/}"
15a2072
 	if [ "x${rootsubvol}" != x ]; then
15a2072
 	    GRUB_CMDLINE_LINUX="rootflags=subvol=${rootsubvol} ${GRUB_CMDLINE_LINUX}"
15a2072
+	fi
15a2072
 	fi;;
15a2072
     xzfs)
15a2072
 	rpool=`${grub_probe} --device ${GRUB_DEVICE} --target=fs_label 2>/dev/null || true`