You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
174 lines
5.2 KiB
174 lines
5.2 KiB
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
|
From: Michael Chang <mchang@suse.com> |
|
Date: Thu, 21 Aug 2014 03:39:11 +0000 |
|
Subject: [PATCH] grub2-btrfs-04-grub2-install |
|
|
|
--- |
|
grub-core/osdep/linux/getroot.c | 7 +++++++ |
|
grub-core/osdep/unix/config.c | 17 +++++++++++++++-- |
|
util/config.c | 10 ++++++++++ |
|
util/grub-install.c | 15 +++++++++++++++ |
|
util/grub-mkrelpath.c | 6 ++++++ |
|
include/grub/emu/config.h | 1 + |
|
6 files changed, 54 insertions(+), 2 deletions(-) |
|
|
|
diff --git a/grub-core/osdep/linux/getroot.c b/grub-core/osdep/linux/getroot.c |
|
index 001b818fe58..caf9b1ccd3f 100644 |
|
--- a/grub-core/osdep/linux/getroot.c |
|
+++ b/grub-core/osdep/linux/getroot.c |
|
@@ -376,6 +376,7 @@ get_btrfs_fs_prefix (const char *mount_path) |
|
return NULL; |
|
} |
|
|
|
+int use_relative_path_on_btrfs = 0; |
|
|
|
char ** |
|
grub_find_root_devices_from_mountinfo (const char *dir, char **relroot) |
|
@@ -519,6 +520,12 @@ again: |
|
{ |
|
ret = grub_find_root_devices_from_btrfs (dir); |
|
fs_prefix = get_btrfs_fs_prefix (entries[i].enc_path); |
|
+ if (use_relative_path_on_btrfs) |
|
+ { |
|
+ if (fs_prefix) |
|
+ free (fs_prefix); |
|
+ fs_prefix = xstrdup ("/"); |
|
+ } |
|
} |
|
else if (!retry && grub_strcmp (entries[i].fstype, "autofs") == 0) |
|
{ |
|
diff --git a/grub-core/osdep/unix/config.c b/grub-core/osdep/unix/config.c |
|
index 7d6325138ce..46a881530c0 100644 |
|
--- a/grub-core/osdep/unix/config.c |
|
+++ b/grub-core/osdep/unix/config.c |
|
@@ -82,6 +82,19 @@ grub_util_load_config (struct grub_util_config *cfg) |
|
if (v) |
|
cfg->grub_distributor = xstrdup (v); |
|
|
|
+ v = getenv ("SUSE_BTRFS_SNAPSHOT_BOOTING"); |
|
+ if (v) |
|
+ { |
|
+ if (grub_strncmp(v, "true", sizeof ("true") - 1) == 0) |
|
+ { |
|
+ cfg->is_suse_btrfs_snapshot_enabled = 1; |
|
+ } |
|
+ else |
|
+ { |
|
+ cfg->is_suse_btrfs_snapshot_enabled = 0; |
|
+ } |
|
+ } |
|
+ |
|
cfgfile = grub_util_get_config_filename (); |
|
if (!grub_util_is_regular (cfgfile)) |
|
return; |
|
@@ -105,8 +118,8 @@ grub_util_load_config (struct grub_util_config *cfg) |
|
*ptr++ = *iptr; |
|
} |
|
|
|
- strcpy (ptr, "'; printf \"GRUB_ENABLE_CRYPTODISK=%s\\nGRUB_DISTRIBUTOR=%s\\n\" " |
|
- "\"$GRUB_ENABLE_CRYPTODISK\" \"$GRUB_DISTRIBUTOR\""); |
|
+ strcpy (ptr, "'; printf \"GRUB_ENABLE_CRYPTODISK=%s\\nGRUB_DISTRIBUTOR=%s\\nSUSE_BTRFS_SNAPSHOT_BOOTING=%s\\n\" " |
|
+ "\"$GRUB_ENABLE_CRYPTODISK\" \"$GRUB_DISTRIBUTOR\" \"$SUSE_BTRFS_SNAPSHOT_BOOTING\""); |
|
|
|
argv[2] = script; |
|
argv[3] = '\0'; |
|
diff --git a/util/config.c b/util/config.c |
|
index ebcdd8f5e22..f044a880a76 100644 |
|
--- a/util/config.c |
|
+++ b/util/config.c |
|
@@ -42,6 +42,16 @@ grub_util_parse_config (FILE *f, struct grub_util_config *cfg, int simple) |
|
cfg->is_cryptodisk_enabled = 1; |
|
continue; |
|
} |
|
+ if (grub_strncmp (ptr, "SUSE_BTRFS_SNAPSHOT_BOOTING=", |
|
+ sizeof ("SUSE_BTRFS_SNAPSHOT_BOOTING=") - 1) == 0) |
|
+ { |
|
+ ptr += sizeof ("SUSE_BTRFS_SNAPSHOT_BOOTING=") - 1; |
|
+ if (*ptr == '"' || *ptr == '\'') |
|
+ ptr++; |
|
+ if (grub_strncmp(ptr, "true", sizeof ("true") - 1) == 0) |
|
+ cfg->is_suse_btrfs_snapshot_enabled = 1; |
|
+ continue; |
|
+ } |
|
if (grub_strncmp (ptr, "GRUB_DISTRIBUTOR=", |
|
sizeof ("GRUB_DISTRIBUTOR=") - 1) == 0) |
|
{ |
|
diff --git a/util/grub-install.c b/util/grub-install.c |
|
index 0fbe7f78c6d..0f66f36d23a 100644 |
|
--- a/util/grub-install.c |
|
+++ b/util/grub-install.c |
|
@@ -827,6 +827,8 @@ fill_core_services (const char *core_services) |
|
free (sysv_plist); |
|
} |
|
|
|
+extern int use_relative_path_on_btrfs; |
|
+ |
|
int |
|
main (int argc, char *argv[]) |
|
{ |
|
@@ -860,6 +862,9 @@ main (int argc, char *argv[]) |
|
|
|
grub_util_load_config (&config); |
|
|
|
+ if (config.is_suse_btrfs_snapshot_enabled) |
|
+ use_relative_path_on_btrfs = 1; |
|
+ |
|
if (!bootloader_id && config.grub_distributor) |
|
{ |
|
char *ptr; |
|
@@ -1352,6 +1357,16 @@ main (int argc, char *argv[]) |
|
fprintf (load_cfg_f, "set debug='%s'\n", |
|
debug_image); |
|
} |
|
+ |
|
+ if (config.is_suse_btrfs_snapshot_enabled |
|
+ && grub_strncmp(grub_fs->name, "btrfs", sizeof ("btrfs") - 1) == 0) |
|
+ { |
|
+ if (!load_cfg_f) |
|
+ load_cfg_f = grub_util_fopen (load_cfg, "wb"); |
|
+ have_load_cfg = 1; |
|
+ fprintf (load_cfg_f, "set btrfs_relative_path='y'\n"); |
|
+ } |
|
+ |
|
char *prefix_drive = NULL; |
|
char *install_drive = NULL; |
|
|
|
diff --git a/util/grub-mkrelpath.c b/util/grub-mkrelpath.c |
|
index 47a241a391b..5db7a9a7d97 100644 |
|
--- a/util/grub-mkrelpath.c |
|
+++ b/util/grub-mkrelpath.c |
|
@@ -40,9 +40,12 @@ struct arguments |
|
}; |
|
|
|
static struct argp_option options[] = { |
|
+ {"relative", 'r', 0, 0, "use relative path on btrfs", 0}, |
|
{ 0, 0, 0, 0, 0, 0 } |
|
}; |
|
|
|
+extern int use_relative_path_on_btrfs; |
|
+ |
|
static error_t |
|
argp_parser (int key, char *arg, struct argp_state *state) |
|
{ |
|
@@ -52,6 +55,9 @@ argp_parser (int key, char *arg, struct argp_state *state) |
|
|
|
switch (key) |
|
{ |
|
+ case 'r': |
|
+ use_relative_path_on_btrfs = 1; |
|
+ break; |
|
case ARGP_KEY_ARG: |
|
if (state->arg_num == 0) |
|
arguments->pathname = xstrdup (arg); |
|
diff --git a/include/grub/emu/config.h b/include/grub/emu/config.h |
|
index 875d5896ce1..c9a7e5f4ade 100644 |
|
--- a/include/grub/emu/config.h |
|
+++ b/include/grub/emu/config.h |
|
@@ -37,6 +37,7 @@ struct grub_util_config |
|
{ |
|
int is_cryptodisk_enabled; |
|
char *grub_distributor; |
|
+ int is_suse_btrfs_snapshot_enabled; |
|
}; |
|
|
|
void
|
|
|