* Re: [PATCH v2 4/9] util/grub-editenv: wire set_variables to optional fs_envblk [not found] <mailman.4164.1757927381.1199.grub-devel@gnu.org> @ 2025-09-17 17:08 ` Avnish Chouhan 2025-09-24 2:29 ` Michael Chang via Grub-devel 2025-09-17 17:23 ` [PATCH v2 5/9] util/grub-editenv: wire unset_variables " Avnish Chouhan 2025-09-17 17:27 ` [PATCH v2 6/9] util/grub-editenv: wire list_variables " Avnish Chouhan 2 siblings, 1 reply; 6+ messages in thread From: Avnish Chouhan @ 2025-09-17 17:08 UTC (permalink / raw) To: mchang; +Cc: grub-devel, ngompa13, mlewando, Daniel Kiper On 2025-09-15 14:39, grub-devel-request@gnu.org wrote: > Message: 1 > Date: Mon, 15 Sep 2025 17:08:43 +0800 > From: Michael Chang <mchang@suse.com> > To: The development of GNU GRUB <grub-devel@gnu.org> > Cc: Neal Gompa <ngompa13@gmail.com>, Marta Lewandowska > <mlewando@redhat.com> > Subject: [PATCH v2 4/9] util/grub-editenv: wire set_variables to > optional fs_envblk > Message-ID: <20250915090848.131937-5-mchang@suse.com> > > This patch changes set_variables so that it can use an external > environment block when one is present. The variable next_entry is > written into the external block, env_block is treated as read only, and > all other variables are written into the normal file based envblk. > > A cleanup step is added to handle cases where GRUB at runtime writes > variables into the external block because file based updates are not > safe on a copy on write filesystem such as Btrfs. For example, the > savedefault command can update saved_entry, and on Btrfs GRUB will > place > that update in the external block instead of the file envblk. If an > older copy remains in the external block, it would override the newer > value from the file envblk when GRUB first loads the file and then > applies the external block on top of it. To avoid this, whenever a > variable is updated in the file envblk, any same named key in the > external block is deleted. > > Signed-off-by: Michael Chang <mchang@suse.com> > --- > util/grub-editenv.c | 55 +++++++++++++++++++++++++++++++++++++++++++-- > 1 file changed, 53 insertions(+), 2 deletions(-) > > diff --git a/util/grub-editenv.c b/util/grub-editenv.c > index 26a81d2d0..d47adeb5e 100644 > --- a/util/grub-editenv.c > +++ b/util/grub-editenv.c > @@ -394,12 +394,33 @@ fs_envblk_write (grub_envblk_t envblk) > fclose (fp); > } > > +struct var_lookup_ctx { > + const char *varname; > + bool found; > +}; > + > +static int > +var_lookup_iter (const char *varname, const char *value __attribute__ > ((unused)), void *hook_data) > +{ > + struct var_lookup_ctx *ctx = (struct var_lookup_ctx *)hook_data; Hi Michael, Missing a space before "hook_data;" Thank you! Regards, Avnish Chouhan **** Reviewed-by: Avnish Chouhan <avnish@linux.ibm.com> _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2 4/9] util/grub-editenv: wire set_variables to optional fs_envblk 2025-09-17 17:08 ` [PATCH v2 4/9] util/grub-editenv: wire set_variables to optional fs_envblk Avnish Chouhan @ 2025-09-24 2:29 ` Michael Chang via Grub-devel 0 siblings, 0 replies; 6+ messages in thread From: Michael Chang via Grub-devel @ 2025-09-24 2:29 UTC (permalink / raw) To: Avnish Chouhan Cc: Michael Chang, grub-devel, ngompa13, mlewando, Daniel Kiper On Wed, Sep 17, 2025 at 10:38:17PM +0530, Avnish Chouhan wrote: > On 2025-09-15 14:39, grub-devel-request@gnu.org wrote: > > Message: 1 > > Date: Mon, 15 Sep 2025 17:08:43 +0800 > > From: Michael Chang <mchang@suse.com> > > To: The development of GNU GRUB <grub-devel@gnu.org> > > Cc: Neal Gompa <ngompa13@gmail.com>, Marta Lewandowska > > <mlewando@redhat.com> > > Subject: [PATCH v2 4/9] util/grub-editenv: wire set_variables to > > optional fs_envblk > > Message-ID: <20250915090848.131937-5-mchang@suse.com> > > > > This patch changes set_variables so that it can use an external > > environment block when one is present. The variable next_entry is > > written into the external block, env_block is treated as read only, and > > all other variables are written into the normal file based envblk. > > > > A cleanup step is added to handle cases where GRUB at runtime writes > > variables into the external block because file based updates are not > > safe on a copy on write filesystem such as Btrfs. For example, the > > savedefault command can update saved_entry, and on Btrfs GRUB will place > > that update in the external block instead of the file envblk. If an > > older copy remains in the external block, it would override the newer > > value from the file envblk when GRUB first loads the file and then > > applies the external block on top of it. To avoid this, whenever a > > variable is updated in the file envblk, any same named key in the > > external block is deleted. > > > > Signed-off-by: Michael Chang <mchang@suse.com> > > --- > > util/grub-editenv.c | 55 +++++++++++++++++++++++++++++++++++++++++++-- > > 1 file changed, 53 insertions(+), 2 deletions(-) > > > > diff --git a/util/grub-editenv.c b/util/grub-editenv.c > > index 26a81d2d0..d47adeb5e 100644 > > --- a/util/grub-editenv.c > > +++ b/util/grub-editenv.c > > @@ -394,12 +394,33 @@ fs_envblk_write (grub_envblk_t envblk) > > fclose (fp); > > } > > > > +struct var_lookup_ctx { > > + const char *varname; > > + bool found; > > +}; > > + > > +static int > > +var_lookup_iter (const char *varname, const char *value __attribute__ > > ((unused)), void *hook_data) > > +{ > > + struct var_lookup_ctx *ctx = (struct var_lookup_ctx *)hook_data; > > Hi Michael, > > Missing a space before "hook_data;" OK. I'll put a space the cast operator. Thanks, Michael > > Thank you! > > Regards, > Avnish Chouhan > > **** > > Reviewed-by: Avnish Chouhan <avnish@linux.ibm.com> > _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2 5/9] util/grub-editenv: wire unset_variables to optional fs_envblk [not found] <mailman.4164.1757927381.1199.grub-devel@gnu.org> 2025-09-17 17:08 ` [PATCH v2 4/9] util/grub-editenv: wire set_variables to optional fs_envblk Avnish Chouhan @ 2025-09-17 17:23 ` Avnish Chouhan 2025-09-17 17:27 ` [PATCH v2 6/9] util/grub-editenv: wire list_variables " Avnish Chouhan 2 siblings, 0 replies; 6+ messages in thread From: Avnish Chouhan @ 2025-09-17 17:23 UTC (permalink / raw) To: mchang; +Cc: grub-devel, Daniel Kiper, ngompa13, mlewando On 2025-09-15 14:39, grub-devel-request@gnu.org wrote: > Message: 3 > Date: Mon, 15 Sep 2025 17:08:44 +0800 > From: Michael Chang <mchang@suse.com> > To: The development of GNU GRUB <grub-devel@gnu.org> > Cc: Neal Gompa <ngompa13@gmail.com>, Marta Lewandowska > <mlewando@redhat.com> > Subject: [PATCH v2 5/9] util/grub-editenv: wire unset_variables to > optional fs_envblk > Message-ID: <20250915090848.131937-6-mchang@suse.com> > > This patch updates unset_variables so that removals are also applied to > the external environment block when it is present. The code opens the > external block, deletes the same named keys there, and then writes the > external block back using fs_envblk_write. The file based envblk is > still updated and written as before. > > Signed-off-by: Michael Chang <mchang@suse.com> Reviewed-by: Avnish Chouhan <avnish@linux.ibm.com> _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2 6/9] util/grub-editenv: wire list_variables to optional fs_envblk [not found] <mailman.4164.1757927381.1199.grub-devel@gnu.org> 2025-09-17 17:08 ` [PATCH v2 4/9] util/grub-editenv: wire set_variables to optional fs_envblk Avnish Chouhan 2025-09-17 17:23 ` [PATCH v2 5/9] util/grub-editenv: wire unset_variables " Avnish Chouhan @ 2025-09-17 17:27 ` Avnish Chouhan 2 siblings, 0 replies; 6+ messages in thread From: Avnish Chouhan @ 2025-09-17 17:27 UTC (permalink / raw) To: mchang; +Cc: grub-devel, Daniel Kiper, ngompa13, mlewando On 2025-09-15 14:39, grub-devel-request@gnu.org wrote: > Message: 2 > Date: Mon, 15 Sep 2025 17:08:45 +0800 > From: Michael Chang <mchang@suse.com> > To: The development of GNU GRUB <grub-devel@gnu.org> > Cc: Neal Gompa <ngompa13@gmail.com>, Marta Lewandowska > <mlewando@redhat.com> > Subject: [PATCH v2 6/9] util/grub-editenv: wire list_variables to > optional fs_envblk > Message-ID: <20250915090848.131937-7-mchang@suse.com> > > This patch updates list_variables so that it also prints entries from > the external environment block when one is present. The function first > lists all variables from the file based envblk, then iterates over the > external envblk and prints those as well. > > The output format remains the same as before. The change makes it > possible to inspect variables regardless of whether they are stored in > the file envblk or in the reserved block. > > Signed-off-by: Michael Chang <mchang@suse.com> Reviewed-by: Avnish Chouhan <avnish@linux.ibm.com> _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v2 0/9] Add support for external environment block on Btrfs
@ 2025-09-15 9:08 Michael Chang via Grub-devel
2025-09-15 9:08 ` [PATCH v2 6/9] util/grub-editenv: wire list_variables to optional fs_envblk Michael Chang via Grub-devel
0 siblings, 1 reply; 6+ messages in thread
From: Michael Chang via Grub-devel @ 2025-09-15 9:08 UTC (permalink / raw)
To: The development of GNU GRUB; +Cc: Michael Chang, Neal Gompa, Marta Lewandowska
This patch series adds support for storing the GRUB environment block in
a reserved area of the Btrfs header. On copy on write filesystems such
as Btrfs, the normal file based envblk cannot be updated safely at
runtime because block addresses are not stable. The reserved area
provides a fixed location that GRUB can write directly, allowing
commands such as grub-reboot and savedefault to work on Btrfs volumes.
The series proceeds in small chunks to keep each change buildable and
easier to review. The first patches add new data structures and helpers
for creating, opening, and writing an environment block in the reserved
area. Later patches update set_variables, unset_variables, and
list_variables so they can use the external block when it is present. An
entry is added to the Btrfs header to reserve space at 256 KiB for the
environment block. Finally, grub.cfg is modified so that load_env and
save_env use the external block automatically when env_block is defined.
v2:
- Define ENV_BTRFS_OFFSET as 256*1024
- Do not conflate type and variable definitions
- Align typedef with struct declaration to follow coding style
- Use bool as the return type of is_abstraction()
- Add "if (dev->disk != NULL)" check in is_abstraction()
- Refine the loop logic in is_abstraction() tests
- Remove extra indentation and redundant lines in read_envblk_fs
- Use off_t and size_t for offset and size variables, fix similar cases
throughout
- Use explicit check "(fp == NULL)" instead of "(! fp)", fix similar
cases throughout
- Use bool for the "found" field in var_lookup_ctx
- Add documentation describing the Btrfs environment block and special
environment block variables
Michael Chang (9):
util/grub-editenv: add basic structures and probe call for external
envblk
util/grub-editenv: add fs_envblk open helper
util/grub-editenv: add fs_envblk write helper
util/grub-editenv: wire set_variables to optional fs_envblk
util/grub-editenv: wire unset_variables to optional fs_envblk
util/grub-editenv: wire list_variables to optional fs_envblk
btrfs: add environment block to reserved header area
00_header.in: wire grub.cfg to use env_block when present
docs: add Btrfs env block and special env vars
docs/grub.texi | 60 ++++++
grub-core/fs/btrfs.c | 3 +-
include/grub/fs.h | 2 +
util/grub-editenv.c | 393 ++++++++++++++++++++++++++++++++++++++-
util/grub.d/00_header.in | 26 ++-
5 files changed, 477 insertions(+), 7 deletions(-)
--
2.51.0
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel
^ permalink raw reply [flat|nested] 6+ messages in thread* [PATCH v2 6/9] util/grub-editenv: wire list_variables to optional fs_envblk 2025-09-15 9:08 [PATCH v2 0/9] Add support for external environment block on Btrfs Michael Chang via Grub-devel @ 2025-09-15 9:08 ` Michael Chang via Grub-devel 2025-09-17 15:16 ` Sudhakar Kuppusamy 0 siblings, 1 reply; 6+ messages in thread From: Michael Chang via Grub-devel @ 2025-09-15 9:08 UTC (permalink / raw) To: The development of GNU GRUB; +Cc: Michael Chang, Neal Gompa, Marta Lewandowska This patch updates list_variables so that it also prints entries from the external environment block when one is present. The function first lists all variables from the file based envblk, then iterates over the external envblk and prints those as well. The output format remains the same as before. The change makes it possible to inspect variables regardless of whether they are stored in the file envblk or in the reserved block. Signed-off-by: Michael Chang <mchang@suse.com> --- util/grub-editenv.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/util/grub-editenv.c b/util/grub-editenv.c index 5fe240c42..43c87aa73 100644 --- a/util/grub-editenv.c +++ b/util/grub-editenv.c @@ -335,10 +335,17 @@ static void list_variables (const char *name) { grub_envblk_t envblk; + grub_envblk_t envblk_fs = NULL; envblk = open_envblk_file (name); + grub_envblk_iterate (envblk, &envblk_fs, read_envblk_fs); grub_envblk_iterate (envblk, NULL, print_var); grub_envblk_close (envblk); + if (envblk_fs != NULL) + { + grub_envblk_iterate (envblk_fs, NULL, print_var); + grub_envblk_close (envblk_fs); + } } static void -- 2.51.0 _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v2 6/9] util/grub-editenv: wire list_variables to optional fs_envblk 2025-09-15 9:08 ` [PATCH v2 6/9] util/grub-editenv: wire list_variables to optional fs_envblk Michael Chang via Grub-devel @ 2025-09-17 15:16 ` Sudhakar Kuppusamy 0 siblings, 0 replies; 6+ messages in thread From: Sudhakar Kuppusamy @ 2025-09-17 15:16 UTC (permalink / raw) To: The development of GNU GRUB; +Cc: Michael Chang, Neal Gompa, Marta Lewandowska > On 15 Sep 2025, at 2:38 PM, Michael Chang via Grub-devel <grub-devel@gnu.org> wrote: > > This patch updates list_variables so that it also prints entries from > the external environment block when one is present. The function first > lists all variables from the file based envblk, then iterates over the > external envblk and prints those as well. > > The output format remains the same as before. The change makes it > possible to inspect variables regardless of whether they are stored in > the file envblk or in the reserved block. > > Signed-off-by: Michael Chang <mchang@suse.com> Reviewed-by: Sudhakar Kuppusamy <sudhakar@linux.ibm.com> > --- > util/grub-editenv.c | 7 +++++++ > 1 file changed, 7 insertions(+) > > diff --git a/util/grub-editenv.c b/util/grub-editenv.c > index 5fe240c42..43c87aa73 100644 > --- a/util/grub-editenv.c > +++ b/util/grub-editenv.c > @@ -335,10 +335,17 @@ static void > list_variables (const char *name) > { > grub_envblk_t envblk; > + grub_envblk_t envblk_fs = NULL; > > envblk = open_envblk_file (name); > + grub_envblk_iterate (envblk, &envblk_fs, read_envblk_fs); > grub_envblk_iterate (envblk, NULL, print_var); > grub_envblk_close (envblk); > + if (envblk_fs != NULL) > + { > + grub_envblk_iterate (envblk_fs, NULL, print_var); > + grub_envblk_close (envblk_fs); > + } > } > > static void > -- > 2.51.0 > > > _______________________________________________ > Grub-devel mailing list > Grub-devel@gnu.org > https://lists.gnu.org/mailman/listinfo/grub-devel _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2025-09-24 2:30 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <mailman.4164.1757927381.1199.grub-devel@gnu.org>
2025-09-17 17:08 ` [PATCH v2 4/9] util/grub-editenv: wire set_variables to optional fs_envblk Avnish Chouhan
2025-09-24 2:29 ` Michael Chang via Grub-devel
2025-09-17 17:23 ` [PATCH v2 5/9] util/grub-editenv: wire unset_variables " Avnish Chouhan
2025-09-17 17:27 ` [PATCH v2 6/9] util/grub-editenv: wire list_variables " Avnish Chouhan
2025-09-15 9:08 [PATCH v2 0/9] Add support for external environment block on Btrfs Michael Chang via Grub-devel
2025-09-15 9:08 ` [PATCH v2 6/9] util/grub-editenv: wire list_variables to optional fs_envblk Michael Chang via Grub-devel
2025-09-17 15:16 ` Sudhakar Kuppusamy
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).