On Tue, June 3, 2025 at 5:04 AM, Avnish Chouhan <avn...@linux.ibm.com> wrote: > > Message: 1 > > Date: Wed, 21 May 2025 12:51:25 +0000 > > From: Alec Brown <alec.r.br...@oracle.com> > > To: grub-devel@gnu.org > > Cc: christopher.obb...@linaro.org, daniel.ki...@oracle.com, > > jan.setjeeil...@oracle.com, alec.r.br...@oracle.com, > > mate.ku...@canonical.com, pjo...@redhat.com, > > ross.philip...@oracle.com, 93...@debian.org, phco...@gmail.com > > Subject: [PATCH v4 3/4] blsuki: Check for mounted /boot in emu > > Message-ID: <20250521125126.3928350-4-alec.r.br...@oracle.com> > > > > From: Robbie Harwood <rharw...@redhat.com> > > > > Irritatingly, BLS defines paths relative to the mountpoint of the > > filesystem which contains its snippets, not / or any other fixed > > location. So grub2-emu needs to know whether /boot is a separate > > filesystem from / and conditionally prepend a path. > > > > Signed-off-by: Robbie Harwood <rharw...@redhat.com> > > Signed-off-by: Alec Brown <alec.r.br...@oracle.com> > > --- > > grub-core/Makefile.core.def | 4 ++ > > grub-core/commands/blsuki.c | 92 ++++++++++++++++++++++++++++++--- > > grub-core/osdep/linux/getroot.c | 8 +++ > > grub-core/osdep/unix/getroot.c | 10 ++++ > > include/grub/emu/misc.h | 2 +- > > 5 files changed, 107 insertions(+), 9 deletions(-) > > > > diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def > > index 67628f65f..93b88795e 100644 > > --- a/grub-core/Makefile.core.def > > +++ b/grub-core/Makefile.core.def > > @@ -367,6 +367,10 @@ kernel = { > > emu = kern/emu/cache_s.S; > > emu = kern/emu/hostdisk.c; > > emu = osdep/unix/hostdisk.c; > > + emu = osdep/relpath.c; > > + emu = osdep/getroot.c; > > + emu = osdep/unix/getroot.c; > > + emu = osdep/devmapper/getroot.c; > > emu = osdep/exec.c; > > extra_dist = osdep/unix/exec.c; > > emu = osdep/devmapper/hostdisk.c; > > diff --git a/grub-core/commands/blsuki.c b/grub-core/commands/blsuki.c > > index 2ad960ae3..bf2edc5ac 100644 > > --- a/grub-core/commands/blsuki.c > > +++ b/grub-core/commands/blsuki.c > > @@ -32,6 +32,13 @@ > > #include <grub/vercmp.h> > > #include <grub/lib/envblk.h> > > > > +#ifdef GRUB_MACHINE_EMU > > +#include <grub/emu/misc.h> > > +#define GRUB_BOOT_DEVICE "/boot" > > +#else > > +#define GRUB_BOOT_DEVICE "" > > +#endif > > + > > GRUB_MOD_LICENSE ("GPLv3+"); > > > > #define GRUB_BLS_CONFIG_PATH "/loader/entries/" > > @@ -56,6 +63,40 @@ static grub_blsuki_entry_t *entries = NULL; > > > > #define FOR_BLSUKI_ENTRIES(var) FOR_LIST_ELEMENTS (var, entries) > > > > +#ifdef GRUB_MACHINE_EMU > > +/* > > + * Cache probing in blsuki_update_boot_device(). > > + */ > > Hi Alec, > > /* Cache probing in blsuki_update_boot_device(). */ > > > +static int separate_boot = -1; > > +#endif > > + > > +/* > > + * BLS appears to make paths relative to the filesystem that snippets > > are > > + * on, not /. Attempt to cope. > > + */ > > +static char *blsuki_update_boot_device (char *tmp) > > +{ > > +#ifdef GRUB_MACHINE_EMU > > + char *ret; > > char *ret = NULL;
Hi Avnish, I don't think it is necessary for this variable to be initialized to NULL since it will be overwritten by grub_make_system_path_relative_to_its_root(). > > > + > > + if (separate_boot != -1) > > + goto probed; > > + > > + separate_boot = 0; > > + > > + ret = grub_make_system_path_relative_to_its_root (GRUB_BOOT_DEVICE); > > + > > + if (ret != NULL && ret[0] == '\0') > > + separate_boot = 1; > > + > > + probed: > > + if (!separate_boot) > > + return tmp; > > +#endif > > + > > + return grub_stpcpy (tmp, GRUB_BOOT_DEVICE); > > +} > > + > > /* > > * This function will add a new keyval pair to a list of keyvals > > stored in the > > * entry parameter. > > @@ -582,7 +623,7 @@ bls_get_linux (grub_blsuki_entry_t *entry) > > if (options == NULL) > > options = blsuki_expand_val (grub_env_get ("default_kernelopts")); > > > > - if (grub_add (grub_strlen ("linux "), grub_strlen (linux_path), > > &size)) > > + if (grub_add (grub_strlen ("linux " GRUB_BOOT_DEVICE), grub_strlen > > (linux_path), &size)) > > { > > grub_error (GRUB_ERR_OUT_OF_RANGE, "overflow detected while > > calculating linux buffer size"); > > goto finish; > > @@ -604,6 +645,7 @@ bls_get_linux (grub_blsuki_entry_t *entry) > > > > tmp = linux_cmd; > > tmp = grub_stpcpy (tmp, "linux "); > > + tmp = blsuki_update_boot_device (tmp); > > tmp = grub_stpcpy (tmp, linux_path); > > if (options != NULL) > > { > > @@ -679,7 +721,7 @@ bls_get_initrd (grub_blsuki_entry_t *entry) > > > > for (i = 0; early_initrd_list != NULL && early_initrd_list[i] > > != NULL; i++) > > { > > - if (grub_add (size, 1, &size) || > > + if (grub_add (size, grub_strlen (" " GRUB_BOOT_DEVICE), &size) || > > grub_add (size, grub_strlen (prefix), &size) || > > grub_add (size, grub_strlen (early_initrd_list[i]), &size)) > > { > > @@ -690,7 +732,7 @@ bls_get_initrd (grub_blsuki_entry_t *entry) > > > > for (i = 0; initrd_list != NULL && initrd_list[i] != NULL; i++) > > { > > - if (grub_add (size, 1, &size) || > > + if (grub_add (size, grub_strlen (" " GRUB_BOOT_DEVICE), &size) || > > grub_add (size, grub_strlen (initrd_list[i]), &size)) > > { > > grub_error (GRUB_ERR_OUT_OF_RANGE, "overflow detected > > calculating initrd buffer size"); > > @@ -713,6 +755,7 @@ bls_get_initrd (grub_blsuki_entry_t *entry) > > { > > grub_dprintf ("blsuki", "adding early initrd %s\n", > > early_initrd_list[i]); > > tmp = grub_stpcpy (tmp, " "); > > + tmp = blsuki_update_boot_device (tmp); > > tmp = grub_stpcpy (tmp, prefix); > > tmp = grub_stpcpy (tmp, early_initrd_list[i]); > > } > > @@ -721,6 +764,7 @@ bls_get_initrd (grub_blsuki_entry_t *entry) > > { > > grub_dprintf ("blsuki", "adding initrd %s\n", initrd_list[i]); > > tmp = grub_stpcpy (tmp, " "); > > + tmp = blsuki_update_boot_device (tmp); > > tmp = grub_stpcpy (tmp, initrd_list[i]); > > } > > tmp = grub_stpcpy (tmp, "\n"); > > @@ -775,7 +819,7 @@ bls_get_devicetree (grub_blsuki_entry_t *entry) > > } > > } > > > > - if (grub_add (grub_strlen ("devicetree "), grub_strlen > > (dt_path), &size) || > > + if (grub_add (grub_strlen ("devicetree " GRUB_BOOT_DEVICE), > > grub_strlen (dt_path), &size) || > > grub_add (size, 1, &size)) > > { > > grub_error (GRUB_ERR_OUT_OF_RANGE, "overflow detected calculating > > device tree buffer size"); > > @@ -796,6 +840,7 @@ bls_get_devicetree (grub_blsuki_entry_t *entry) > > tmp = dt_cmd; > > tmp = grub_stpcpy (dt_cmd, "devicetree"); > > tmp = grub_stpcpy (tmp, " "); > > + tmp = blsuki_update_boot_device (tmp); > > if (add_dt_prefix == true) > > tmp = grub_stpcpy (tmp, prefix); > > tmp = grub_stpcpy (tmp, dt_path); > > @@ -924,7 +969,11 @@ blsuki_set_find_entry_info (struct > > find_entry_info *info, const char *dirname, c > > > > if (devid == NULL) > > { > > +#ifdef GRUB_MACHINE_EMU > > + devid = "host"; > > +#else > > devid = grub_env_get ("root"); > > +#endif > > if (devid == NULL) > > return grub_error (GRUB_ERR_FILE_NOT_FOUND, N_("variable `%s' isn't > > set"), "root"); > > } > > @@ -966,10 +1015,13 @@ blsuki_set_find_entry_info (struct > > find_entry_info *info, const char *dirname, c > > * parameter. If the fallback option is enabled, the default location > > will be > > * checked for BLS config files if the first attempt fails. > > */ > > -static void > > +static grub_err_t > > blsuki_find_entry (struct find_entry_info *info, bool enable_fallback) > > { > > struct read_entry_info read_entry_info; > > + char *default_dir = NULL; > > + char *tmp; > > char *tmp = NULL; I don't think it is necessary for this NULL initialization either since tmp will get set to the value given by blsuki_update_boot_device(). Times where I think it would be necessary is if the variables initialization is dependent on an if conditional. However, looking through this function in particular, I see some variables such as dir_fs and dir_dev don't need to be set to NULL. > > > + grub_size_t default_size; > > grub_fs_t dir_fs = NULL; > > grub_device_t dir_dev = NULL; > > bool fallback = false; > > @@ -1000,7 +1052,15 @@ blsuki_find_entry (struct find_entry_info > > *info, bool enable_fallback) > > */ > > if (entries == NULL && fallback == false && enable_fallback == > > true) > > { > > - blsuki_set_find_entry_info (info, GRUB_BLS_CONFIG_PATH, NULL); > > + default_size = grub_strlen (GRUB_BOOT_DEVICE) + grub_strlen > > (GRUB_BLS_CONFIG_PATH); > > + default_dir = grub_malloc (default_size); > > + if (default_dir == NULL) > > + return grub_errno; > > + > > + tmp = blsuki_update_boot_device (default_dir); > > + tmp = grub_stpcpy (tmp, GRUB_BLS_CONFIG_PATH); > > + > > + blsuki_set_find_entry_info (info, default_dir, NULL); > > This function returns "grub_err_t", error check missed! Good catch! I'll fix that. > > err = blsuki_set_find_entry_info (info, default_dir, NULL); > if (err) > return grub_errno; > > > grub_dprintf ("blsuki", "Entries weren't found in %s, fallback to > > %s\n", > > read_entry_info.dirname, info->dirname); > > fallback = true; > > @@ -1009,6 +1069,9 @@ blsuki_find_entry (struct find_entry_info *info, > > bool enable_fallback) > > fallback = false; > > } > > while (fallback == true); > > + > > + grub_free (default_dir); > > + return GRUB_ERR_NONE; > > } > > > > static grub_err_t > > @@ -1018,6 +1081,9 @@ blsuki_load_entries (char *path, bool > > enable_fallback) > > static grub_err_t r; > > const char *devid = NULL; > > char *dir = NULL; > > + char *default_dir = NULL; > > + char *tmp; > > char *tmp = NULL; > > > + grub_size_t dir_size; > > struct find_entry_info info = { > > .dev = NULL, > > .fs = NULL, > > @@ -1059,15 +1125,25 @@ blsuki_load_entries (char *path, bool > > enable_fallback) > > } > > > > if (dir == NULL) > > - dir = (char *) GRUB_BLS_CONFIG_PATH; > > + { > > + dir_size = grub_strlen (GRUB_BOOT_DEVICE) + grub_strlen > > (GRUB_BLS_CONFIG_PATH); > > + default_dir = grub_malloc (dir_size); > > + if (default_dir == NULL) > > + return grub_errno; > > Indentation seems off, please check! Same thing with the other patches, the indentation looks strange because tabs are being used in place of 8 spaces and the formatting of the patch looks strange because of it. > > Thank you! > > Regards, > Avnish Chouhan > Thanks for looking through these patches! Alec Brown _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel