diff --git a/grub2-btrfs-07-subvol-fallback.patch b/grub2-btrfs-07-subvol-fallback.patch new file mode 100644 index 0000000..357aa44 --- /dev/null +++ b/grub2-btrfs-07-subvol-fallback.patch @@ -0,0 +1,46 @@ +Index: grub-2.02~beta3/grub-core/fs/btrfs.c +=================================================================== +--- grub-2.02~beta3.orig/grub-core/fs/btrfs.c ++++ grub-2.02~beta3/grub-core/fs/btrfs.c +@@ -925,10 +925,40 @@ lookup_root_by_name(struct grub_btrfs_da + } + + static grub_err_t ++lookup_root_by_name_fallback(struct grub_btrfs_data *data, const char *path) ++{ ++ grub_err_t err; ++ grub_uint64_t tree = 0; ++ grub_uint8_t type; ++ struct grub_btrfs_key key; ++ ++ err = find_path (data, path, &key, &tree, &type); ++ if (err) ++ return grub_error(GRUB_ERR_FILE_NOT_FOUND, "couldn't locate %s\n", path); ++ ++ if (key.object_id != grub_cpu_to_le64_compile_time (GRUB_BTRFS_OBJECT_ID_CHUNK) || tree == 0) ++ return grub_error(GRUB_ERR_BAD_FILE_TYPE, "%s: not a subvolume\n", path); ++ ++ data->fs_tree = tree; ++ return GRUB_ERR_NONE; ++} ++ ++static grub_err_t + btrfs_handle_subvol(struct grub_btrfs_data *data __attribute__ ((unused))) + { + if (btrfs_default_subvol) +- return lookup_root_by_name(data, btrfs_default_subvol); ++ { ++ grub_err_t err; ++ err = lookup_root_by_name(data, btrfs_default_subvol); ++ ++ /* Fallback to old schemes */ ++ if (err == GRUB_ERR_FILE_NOT_FOUND) ++ { ++ err = GRUB_ERR_NONE; ++ return lookup_root_by_name_fallback(data, btrfs_default_subvol); ++ } ++ return err; ++ } + + if (btrfs_default_subvolid) + return lookup_root_by_id(data, btrfs_default_subvolid); diff --git a/grub2-btrfs-workaround-grub2-once.patch b/grub2-btrfs-workaround-grub2-once.patch index c50dbc5..a914e88 100644 --- a/grub2-btrfs-workaround-grub2-once.patch +++ b/grub2-btrfs-workaround-grub2-once.patch @@ -1,7 +1,7 @@ -Index: grub-2.02~beta2/grub-core/kern/fs.c +Index: grub-2.02~beta3/grub-core/kern/fs.c =================================================================== ---- grub-2.02~beta2.orig/grub-core/kern/fs.c -+++ grub-2.02~beta2/grub-core/kern/fs.c +--- grub-2.02~beta3.orig/grub-core/kern/fs.c ++++ grub-2.02~beta3/grub-core/kern/fs.c @@ -27,6 +27,7 @@ #include #include @@ -24,11 +24,11 @@ Index: grub-2.02~beta2/grub-core/kern/fs.c ret += size; len -= size; sector -= ((size + offset) >> GRUB_DISK_SECTOR_BITS); -Index: grub-2.02~beta2/util/grub-editenv.c +Index: grub-2.02~beta3/util/grub-editenv.c =================================================================== ---- grub-2.02~beta2.orig/util/grub-editenv.c -+++ grub-2.02~beta2/util/grub-editenv.c -@@ -23,8 +23,10 @@ +--- grub-2.02~beta3.orig/util/grub-editenv.c ++++ grub-2.02~beta3/util/grub-editenv.c +@@ -23,8 +23,11 @@ #include #include #include @@ -37,10 +37,11 @@ Index: grub-2.02~beta2/util/grub-editenv.c #include +#include +#include ++#include #include #include -@@ -120,6 +122,140 @@ block, use `rm %s'."), +@@ -120,6 +123,140 @@ block, use `rm %s'."), NULL, help_filter, NULL }; @@ -181,7 +182,7 @@ Index: grub-2.02~beta2/util/grub-editenv.c static grub_envblk_t open_envblk_file (const char *name) { -@@ -176,10 +312,17 @@ static void +@@ -176,10 +313,17 @@ static void list_variables (const char *name) { grub_envblk_t envblk; @@ -199,7 +200,7 @@ Index: grub-2.02~beta2/util/grub-editenv.c } static void -@@ -202,6 +345,38 @@ write_envblk (const char *name, grub_env +@@ -202,6 +346,38 @@ write_envblk (const char *name, grub_env } static void @@ -238,7 +239,7 @@ Index: grub-2.02~beta2/util/grub-editenv.c set_variables (const char *name, int argc, char *argv[]) { grub_envblk_t envblk; -@@ -217,8 +392,26 @@ set_variables (const char *name, int arg +@@ -217,8 +393,26 @@ set_variables (const char *name, int arg *(p++) = 0; @@ -267,7 +268,7 @@ Index: grub-2.02~beta2/util/grub-editenv.c argc--; argv++; -@@ -226,26 +419,147 @@ set_variables (const char *name, int arg +@@ -226,26 +420,158 @@ set_variables (const char *name, int arg write_envblk (name, envblk); grub_envblk_close (envblk); @@ -319,8 +320,8 @@ Index: grub-2.02~beta2/util/grub-editenv.c + { + have_abstraction = 1; + } -+} -+ + } + +static fs_envblk_t +probe_fs_envblk (fs_envblk_spec_t spec) +{ @@ -338,6 +339,16 @@ Index: grub-2.02~beta2/util/grub-editenv.c + + grub_util_biosdisk_init (DEFAULT_DEVICE_MAP); + grub_init_all (); ++ grub_gcry_init_all (); ++ ++ grub_lvm_fini (); ++ grub_mdraid09_fini (); ++ grub_mdraid1x_fini (); ++ grub_diskfilter_fini (); ++ grub_diskfilter_init (); ++ grub_mdraid09_init (); ++ grub_mdraid1x_init (); ++ grub_lvm_init (); + + grub_devices = grub_guess_root_devices (DEFAULT_DIRECTORY); + @@ -388,6 +399,7 @@ Index: grub-2.02~beta2/util/grub-editenv.c + + free (grub_drives); + grub_device_close (grub_dev); ++ grub_gcry_fini_all (); + grub_fini_all (); + grub_util_biosdisk_fini (); + @@ -409,13 +421,13 @@ Index: grub-2.02~beta2/util/grub-editenv.c + } + + return NULL; - } - ++} ++ + int main (int argc, char *argv[]) { -@@ -277,6 +591,9 @@ main (int argc, char *argv[]) +@@ -277,6 +603,9 @@ main (int argc, char *argv[]) command = argv[curindex++]; } @@ -425,10 +437,10 @@ Index: grub-2.02~beta2/util/grub-editenv.c if (strcmp (command, "create") == 0) grub_util_create_envblk_file (filename); else if (strcmp (command, "list") == 0) -Index: grub-2.02~beta2/util/grub.d/00_header.in +Index: grub-2.02~beta3/util/grub.d/00_header.in =================================================================== ---- grub-2.02~beta2.orig/util/grub.d/00_header.in -+++ grub-2.02~beta2/util/grub.d/00_header.in +--- grub-2.02~beta3.orig/util/grub.d/00_header.in ++++ grub-2.02~beta3/util/grub.d/00_header.in @@ -46,6 +46,11 @@ cat << EOF if [ -s \$prefix/grubenv ]; then load_env diff --git a/grub2-snapper-plugin.sh b/grub2-snapper-plugin.sh index 83392b9..355fb25 100644 --- a/grub2-snapper-plugin.sh +++ b/grub2-snapper-plugin.sh @@ -97,13 +97,19 @@ snapshot_submenu () { title="${important}${NAME} ${VERSION} ($full_desc)" fi + if test "$s390" = "1"; then + subvol="\$2" + else + subvol="\$3" + fi + cat <