|
|
b32e65 |
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
|
b32e65 |
From: =?UTF-8?q?Renaud=20M=C3=A9trich?= <rmetrich@redhat.com>
|
|
|
b32e65 |
Date: Tue, 8 Feb 2022 08:39:11 +0100
|
|
|
b32e65 |
Subject: [PATCH] search: new --efidisk-only option on EFI systems
|
|
|
b32e65 |
MIME-Version: 1.0
|
|
|
b32e65 |
Content-Type: text/plain; charset=UTF-8
|
|
|
b32e65 |
Content-Transfer-Encoding: 8bit
|
|
|
b32e65 |
|
|
|
b32e65 |
When using 'search' on EFI systems, we sometimes want to exclude devices
|
|
|
b32e65 |
that are not EFI disks (e.g. md, lvm).
|
|
|
b32e65 |
This is typically used when wanting to chainload when having a software
|
|
|
b32e65 |
raid (md) for EFI partition:
|
|
|
b32e65 |
with no option, 'search --file /EFI/redhat/shimx64.efi' sets root envvar
|
|
|
b32e65 |
to 'md/boot_efi' which cannot be used for chainloading since there is no
|
|
|
b32e65 |
effective EFI device behind.
|
|
|
b32e65 |
|
|
|
b32e65 |
This commit also refactors handling of --no-floppy option.
|
|
|
b32e65 |
|
|
|
b32e65 |
Signed-off-by: Renaud Métrich <rmetrich@redhat.com>
|
|
|
b9d01e |
[rharwood: apply rmetrich's flags initialization fix]
|
|
|
b9d01e |
Signed-off-by: Robbie Harwood <rharwood@redhat.com>
|
|
|
b9d01e |
(cherry picked from commit fdd8396f4fa750bbbabd4298f2593942f2b84710)
|
|
|
b9d01e |
(cherry picked from commit bea473b58726705bb83a3db88f52d46fdcc6150e)
|
|
|
b32e65 |
---
|
|
|
b32e65 |
grub-core/commands/search.c | 27 +++++++++++++++++++++++----
|
|
|
b32e65 |
grub-core/commands/search_wrap.c | 18 ++++++++++++------
|
|
|
b32e65 |
include/grub/search.h | 15 ++++++++++++---
|
|
|
b32e65 |
3 files changed, 47 insertions(+), 13 deletions(-)
|
|
|
b32e65 |
|
|
|
b32e65 |
diff --git a/grub-core/commands/search.c b/grub-core/commands/search.c
|
|
|
b32e65 |
index d3180bf66..2036a756b 100644
|
|
|
b32e65 |
--- a/grub-core/commands/search.c
|
|
|
b32e65 |
+++ b/grub-core/commands/search.c
|
|
|
b32e65 |
@@ -47,7 +47,7 @@ struct search_ctx
|
|
|
b32e65 |
{
|
|
|
b32e65 |
const char *key;
|
|
|
b32e65 |
const char *var;
|
|
|
b32e65 |
- int no_floppy;
|
|
|
b32e65 |
+ enum search_flags flags;
|
|
|
b32e65 |
char **hints;
|
|
|
b32e65 |
unsigned nhints;
|
|
|
b32e65 |
int count;
|
|
|
b32e65 |
@@ -62,10 +62,29 @@ iterate_device (const char *name, void *data)
|
|
|
b32e65 |
int found = 0;
|
|
|
b32e65 |
|
|
|
b32e65 |
/* Skip floppy drives when requested. */
|
|
|
b32e65 |
- if (ctx->no_floppy &&
|
|
|
b32e65 |
+ if (ctx->flags & SEARCH_FLAGS_NO_FLOPPY &&
|
|
|
b32e65 |
name[0] == 'f' && name[1] == 'd' && name[2] >= '0' && name[2] <= '9')
|
|
|
b32e65 |
return 0;
|
|
|
b32e65 |
|
|
|
b32e65 |
+ /* Limit to EFI disks when requested. */
|
|
|
b32e65 |
+ if (ctx->flags & SEARCH_FLAGS_EFIDISK_ONLY)
|
|
|
b32e65 |
+ {
|
|
|
b32e65 |
+ grub_device_t dev;
|
|
|
b32e65 |
+ dev = grub_device_open (name);
|
|
|
b32e65 |
+ if (! dev)
|
|
|
b32e65 |
+ {
|
|
|
b32e65 |
+ grub_errno = GRUB_ERR_NONE;
|
|
|
b32e65 |
+ return 0;
|
|
|
b32e65 |
+ }
|
|
|
b32e65 |
+ if (! dev->disk || dev->disk->dev->id != GRUB_DISK_DEVICE_EFIDISK_ID)
|
|
|
b32e65 |
+ {
|
|
|
b32e65 |
+ grub_device_close (dev);
|
|
|
b32e65 |
+ grub_errno = GRUB_ERR_NONE;
|
|
|
b32e65 |
+ return 0;
|
|
|
b32e65 |
+ }
|
|
|
b32e65 |
+ grub_device_close (dev);
|
|
|
b32e65 |
+ }
|
|
|
b32e65 |
+
|
|
|
b32e65 |
#ifdef DO_SEARCH_FS_UUID
|
|
|
b32e65 |
#define compare_fn grub_strcasecmp
|
|
|
b32e65 |
#else
|
|
|
b32e65 |
@@ -261,13 +280,13 @@ try (struct search_ctx *ctx)
|
|
|
b32e65 |
}
|
|
|
b32e65 |
|
|
|
b32e65 |
void
|
|
|
b32e65 |
-FUNC_NAME (const char *key, const char *var, int no_floppy,
|
|
|
b32e65 |
+FUNC_NAME (const char *key, const char *var, enum search_flags flags,
|
|
|
b32e65 |
char **hints, unsigned nhints)
|
|
|
b32e65 |
{
|
|
|
b32e65 |
struct search_ctx ctx = {
|
|
|
b32e65 |
.key = key,
|
|
|
b32e65 |
.var = var,
|
|
|
b32e65 |
- .no_floppy = no_floppy,
|
|
|
b32e65 |
+ .flags = flags,
|
|
|
b32e65 |
.hints = hints,
|
|
|
b32e65 |
.nhints = nhints,
|
|
|
b32e65 |
.count = 0,
|
|
|
b32e65 |
diff --git a/grub-core/commands/search_wrap.c b/grub-core/commands/search_wrap.c
|
|
|
b9d01e |
index 47fc8eb99..0b62acf85 100644
|
|
|
b32e65 |
--- a/grub-core/commands/search_wrap.c
|
|
|
b32e65 |
+++ b/grub-core/commands/search_wrap.c
|
|
|
b32e65 |
@@ -40,6 +40,7 @@ static const struct grub_arg_option options[] =
|
|
|
b32e65 |
N_("Set a variable to the first device found."), N_("VARNAME"),
|
|
|
b32e65 |
ARG_TYPE_STRING},
|
|
|
b32e65 |
{"no-floppy", 'n', 0, N_("Do not probe any floppy drive."), 0, 0},
|
|
|
b32e65 |
+ {"efidisk-only", 0, 0, N_("Only probe EFI disks."), 0, 0},
|
|
|
b32e65 |
{"hint", 'h', GRUB_ARG_OPTION_REPEATABLE,
|
|
|
b32e65 |
N_("First try the device HINT. If HINT ends in comma, "
|
|
|
b32e65 |
"also try subpartitions"), N_("HINT"), ARG_TYPE_STRING},
|
|
|
b32e65 |
@@ -73,6 +74,7 @@ enum options
|
|
|
b32e65 |
SEARCH_FS_UUID,
|
|
|
b32e65 |
SEARCH_SET,
|
|
|
b32e65 |
SEARCH_NO_FLOPPY,
|
|
|
b32e65 |
+ SEARCH_EFIDISK_ONLY,
|
|
|
b32e65 |
SEARCH_HINT,
|
|
|
b32e65 |
SEARCH_HINT_IEEE1275,
|
|
|
b32e65 |
SEARCH_HINT_BIOS,
|
|
|
b32e65 |
@@ -89,6 +91,7 @@ grub_cmd_search (grub_extcmd_context_t ctxt, int argc, char **args)
|
|
|
b32e65 |
const char *id = 0;
|
|
|
b32e65 |
int i = 0, j = 0, nhints = 0;
|
|
|
b32e65 |
char **hints = NULL;
|
|
|
b9d01e |
+ enum search_flags flags = 0;
|
|
|
b32e65 |
|
|
|
b32e65 |
if (state[SEARCH_HINT].set)
|
|
|
b32e65 |
for (i = 0; state[SEARCH_HINT].args[i]; i++)
|
|
|
b32e65 |
@@ -180,15 +183,18 @@ grub_cmd_search (grub_extcmd_context_t ctxt, int argc, char **args)
|
|
|
b32e65 |
goto out;
|
|
|
b32e65 |
}
|
|
|
b32e65 |
|
|
|
b32e65 |
+ if (state[SEARCH_NO_FLOPPY].set)
|
|
|
b32e65 |
+ flags |= SEARCH_FLAGS_NO_FLOPPY;
|
|
|
b32e65 |
+
|
|
|
b32e65 |
+ if (state[SEARCH_EFIDISK_ONLY].set)
|
|
|
b32e65 |
+ flags |= SEARCH_FLAGS_EFIDISK_ONLY;
|
|
|
b32e65 |
+
|
|
|
b32e65 |
if (state[SEARCH_LABEL].set)
|
|
|
b32e65 |
- grub_search_label (id, var, state[SEARCH_NO_FLOPPY].set,
|
|
|
b32e65 |
- hints, nhints);
|
|
|
b32e65 |
+ grub_search_label (id, var, flags, hints, nhints);
|
|
|
b32e65 |
else if (state[SEARCH_FS_UUID].set)
|
|
|
b32e65 |
- grub_search_fs_uuid (id, var, state[SEARCH_NO_FLOPPY].set,
|
|
|
b32e65 |
- hints, nhints);
|
|
|
b32e65 |
+ grub_search_fs_uuid (id, var, flags, hints, nhints);
|
|
|
b32e65 |
else if (state[SEARCH_FILE].set)
|
|
|
b32e65 |
- grub_search_fs_file (id, var, state[SEARCH_NO_FLOPPY].set,
|
|
|
b32e65 |
- hints, nhints);
|
|
|
b32e65 |
+ grub_search_fs_file (id, var, flags, hints, nhints);
|
|
|
b32e65 |
else
|
|
|
b32e65 |
grub_error (GRUB_ERR_INVALID_COMMAND, "unspecified search type");
|
|
|
b32e65 |
|
|
|
b32e65 |
diff --git a/include/grub/search.h b/include/grub/search.h
|
|
|
b32e65 |
index d80347df3..4190aeb2c 100644
|
|
|
b32e65 |
--- a/include/grub/search.h
|
|
|
b32e65 |
+++ b/include/grub/search.h
|
|
|
b32e65 |
@@ -19,11 +19,20 @@
|
|
|
b32e65 |
#ifndef GRUB_SEARCH_HEADER
|
|
|
b32e65 |
#define GRUB_SEARCH_HEADER 1
|
|
|
b32e65 |
|
|
|
b32e65 |
-void grub_search_fs_file (const char *key, const char *var, int no_floppy,
|
|
|
b32e65 |
+enum search_flags
|
|
|
b32e65 |
+ {
|
|
|
b32e65 |
+ SEARCH_FLAGS_NO_FLOPPY = 1,
|
|
|
b32e65 |
+ SEARCH_FLAGS_EFIDISK_ONLY = 2
|
|
|
b32e65 |
+ };
|
|
|
b32e65 |
+
|
|
|
b32e65 |
+void grub_search_fs_file (const char *key, const char *var,
|
|
|
b32e65 |
+ enum search_flags flags,
|
|
|
b32e65 |
char **hints, unsigned nhints);
|
|
|
b32e65 |
-void grub_search_fs_uuid (const char *key, const char *var, int no_floppy,
|
|
|
b32e65 |
+void grub_search_fs_uuid (const char *key, const char *var,
|
|
|
b32e65 |
+ enum search_flags flags,
|
|
|
b32e65 |
char **hints, unsigned nhints);
|
|
|
b32e65 |
-void grub_search_label (const char *key, const char *var, int no_floppy,
|
|
|
b32e65 |
+void grub_search_label (const char *key, const char *var,
|
|
|
b32e65 |
+ enum search_flags flags,
|
|
|
b32e65 |
char **hints, unsigned nhints);
|
|
|
b32e65 |
|
|
|
b32e65 |
#endif
|