Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:hellcp:flickerfree-boot
grub2
0001-Unify-the-check-to-enable-btrfs-relative-p...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 0001-Unify-the-check-to-enable-btrfs-relative-path.patch of Package grub2
From 80bb1b17b3f596dbd7331cf9cb20a46c8ef9800b Mon Sep 17 00:00:00 2001 From: Michael Chang <mchang@suse.com> Date: Sat, 22 Aug 2020 02:32:43 +0800 Subject: [PATCH] Unify the check to enable btrfs relative path This unified the test in grub-install and grub-mkconfig that the path to default or selected btrfs subvolume/snapshot is used if the root file system is btrfs and the config has enabled btrfs snapshot booting. Signed-off-by: Michael Chang <mchang@suse.com> --- util/grub-install.c | 67 +++++++++++++++++++++++++++------------ util/grub-mkconfig_lib.in | 3 +- 2 files changed, 48 insertions(+), 22 deletions(-) diff --git a/util/grub-install.c b/util/grub-install.c index 746a42a04..8d18f2530 100644 --- a/util/grub-install.c +++ b/util/grub-install.c @@ -870,6 +870,7 @@ main (int argc, char *argv[]) const char *efi_file = NULL; char **grub_devices; grub_fs_t grub_fs; + grub_fs_t root_fs; grub_device_t grub_dev = NULL; enum grub_install_plat platform; char *grubdir, *device_map; @@ -882,6 +883,8 @@ main (int argc, char *argv[]) int efidir_is_mac = 0; int is_prep = 0; const char *pkgdatadir; + char *rootdir_path; + char **rootdir_devices; grub_util_host_init (&argc, &argv); product_version = xstrdup (PACKAGE_VERSION); @@ -895,9 +898,6 @@ 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; @@ -1046,6 +1046,45 @@ main (int argc, char *argv[]) grub_hostfs_init (); grub_host_init (); + { + char *rootdir_grub_devname; + grub_device_t rootdir_grub_dev; + char *t = grub_util_path_concat (2, "/", rootdir); + + rootdir_path = grub_canonicalize_file_name (t); + if (!rootdir_path) + grub_util_error (_("failed to get canonical path of `%s'"), t); + + rootdir_devices = grub_guess_root_devices (rootdir_path); + if (!rootdir_devices || !rootdir_devices[0]) + grub_util_error (_("cannot find a device for %s (is /dev mounted?)"), + rootdir_path); + + for (curdev = rootdir_devices; *curdev; curdev++) + grub_util_pull_device (*curdev); + + rootdir_grub_devname = grub_util_get_grub_dev (rootdir_devices[0]); + if (!rootdir_grub_devname) + grub_util_error (_("cannot find a GRUB drive for %s. Check your device.map"), + rootdir_devices[0]); + + rootdir_grub_dev = grub_device_open (rootdir_grub_devname); + if (! rootdir_grub_dev) + grub_util_error ("%s", grub_errmsg); + + root_fs = grub_fs_probe (rootdir_grub_dev); + if (!root_fs) + grub_util_error ("%s", grub_errmsg); + + if (config.is_suse_btrfs_snapshot_enabled + && grub_strncmp(root_fs->name, "btrfs", sizeof ("btrfs") - 1) == 0) + use_relative_path_on_btrfs = 1; + + free (t); + free (rootdir_grub_devname); + grub_device_close (rootdir_grub_dev); + } + switch (platform) { case GRUB_INSTALL_PLATFORM_I386_EFI: @@ -1410,8 +1449,7 @@ main (int argc, char *argv[]) debug_image); } - if (config.is_suse_btrfs_snapshot_enabled - && grub_strncmp(grub_fs->name, "btrfs", sizeof ("btrfs") - 1) == 0) + if (use_relative_path_on_btrfs) { if (!load_cfg_f) load_cfg_f = grub_util_fopen (load_cfg, "wb"); @@ -1624,21 +1662,13 @@ main (int argc, char *argv[]) #ifdef __linux__ - if (config.is_suse_btrfs_snapshot_enabled - && grub_strncmp(grub_fs->name, "btrfs", sizeof ("btrfs") - 1) == 0) + if (use_relative_path_on_btrfs) { char *subvol = NULL; char *mount_path = NULL; - char **rootdir_devices = NULL; - char *t = grub_util_path_concat (2, "/", rootdir); - char *rootdir_path = grub_canonicalize_file_name (t); - - if (rootdir_path && grub_util_is_directory (rootdir_path)) - rootdir_devices = grub_guess_root_devices (rootdir_path); - if (rootdir_devices && rootdir_devices[0]) - if (grub_strcmp (rootdir_devices[0], grub_devices[0]) == 0) - subvol = grub_util_get_btrfs_subvol (platdir, &mount_path); + if (grub_strcmp (rootdir_devices[0], grub_devices[0]) == 0) + subvol = grub_util_get_btrfs_subvol (platdir, &mount_path); if (subvol && mount_path) { @@ -1663,11 +1693,6 @@ main (int argc, char *argv[]) } } - free (t); - free (rootdir_path); - for (curdev = rootdir_devices; *curdev; curdev++) - free (*curdev); - free (rootdir_devices); free (subvol); free (mount_path); } diff --git a/util/grub-mkconfig_lib.in b/util/grub-mkconfig_lib.in index 023f54a2d..eab46773b 100644 --- a/util/grub-mkconfig_lib.in +++ b/util/grub-mkconfig_lib.in @@ -49,7 +49,8 @@ grub_warn () make_system_path_relative_to_its_root () { - if [ "x${SUSE_BTRFS_SNAPSHOT_BOOTING}" = "xtrue" ] ; then + if [ "x${SUSE_BTRFS_SNAPSHOT_BOOTING}" = "xtrue" ] && + [ "x${GRUB_FS}" = "xbtrfs" ] ; then "${grub_mkrelpath}" -r "$1" else "${grub_mkrelpath}" "$1" -- 2.28.0
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor