* [PATCH v3 1/3] globalvar: suppress nvvar_save when no external environment was loaded
2025-12-12 16:22 [PATCH v3 0/3] environment: allow board code to suppress external env loading Ahmad Fatoum
@ 2025-12-12 16:22 ` Ahmad Fatoum
2025-12-12 16:22 ` [PATCH v3 2/3] startup: bump down log message about lack of persistent environment Ahmad Fatoum
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Ahmad Fatoum @ 2025-12-12 16:22 UTC (permalink / raw)
To: barebox; +Cc: Ahmad Fatoum
nvvar_save will load the external environment before writing it back
with nv changed, which we means we still end up parsing the environment
in this case, even if we don't execute init scripts or import nv out of
it.
Fix this to only parse the environment when we actually loaded it
before.
Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
v2 -> 3:
- still allow nv -s without previously loaded default environment, but
don't attempt to load the environment again
v1 -> v2:
- return error with message if saving without default environment
---
common/environment.c | 7 +++++++
common/globalvar.c | 9 ++++++++-
include/globalvar.h | 1 +
3 files changed, 16 insertions(+), 1 deletion(-)
diff --git a/common/environment.c b/common/environment.c
index 0e551c90352e..ec14d0629a14 100644
--- a/common/environment.c
+++ b/common/environment.c
@@ -453,6 +453,7 @@ int envfs_load(const char *filename, const char *dir, unsigned flags)
int envfd;
int ret = 0;
size_t size, rsize;
+ __maybe_unused const char *defenv_path;
#ifdef __BAREBOX__
if (!IS_ALLOWED(SCONFIG_ENVIRONMENT_LOAD))
@@ -531,6 +532,12 @@ int envfs_load(const char *filename, const char *dir, unsigned flags)
ret = 0;
+#ifdef CONFIG_NVVAR
+ defenv_path = default_environment_path_get();
+ if (defenv_path && !strcmp(filename, defenv_path))
+ nv_var_set_persistable();
+#endif
+
out:
close(envfd);
free(buf);
diff --git a/common/globalvar.c b/common/globalvar.c
index 77af6733a6a0..127ecd5c6075 100644
--- a/common/globalvar.c
+++ b/common/globalvar.c
@@ -15,6 +15,7 @@
#include <fnmatch.h>
static int nv_dirty;
+static bool nv_persistable;
struct device global_device = {
.name = "global",
@@ -31,6 +32,11 @@ void nv_var_set_clean(void)
nv_dirty = 0;
}
+void nv_var_set_persistable(void)
+{
+ nv_persistable = true;
+}
+
void globalvar_remove(const char *name)
{
struct param_d *p, *tmp;
@@ -718,8 +724,9 @@ int nvvar_save(void)
if (IS_ENABLED(CONFIG_DEFAULT_ENVIRONMENT))
defaultenv_load(TMPDIR, 0);
+ if (nv_persistable)
+ envfs_load(env, TMPDIR, 0);
- envfs_load(env, TMPDIR, 0);
unlink_recursive(TMPDIR "/nv", NULL);
dev_for_each_param(&nv_device, param) {
diff --git a/include/globalvar.h b/include/globalvar.h
index df32f22403bc..d0a8272588b4 100644
--- a/include/globalvar.h
+++ b/include/globalvar.h
@@ -148,6 +148,7 @@ static inline void globalvar_alias_deprecated(const char *newname, const char *o
#endif
void nv_var_set_clean(void);
+void nv_var_set_persistable(void);
int nvvar_save(void);
int nv_complete(struct string_list *sl, char *instr);
int global_complete(struct string_list *sl, char *instr);
--
2.47.3
^ permalink raw reply [flat|nested] 5+ messages in thread* [PATCH v3 2/3] startup: bump down log message about lack of persistent environment
2025-12-12 16:22 [PATCH v3 0/3] environment: allow board code to suppress external env loading Ahmad Fatoum
2025-12-12 16:22 ` [PATCH v3 1/3] globalvar: suppress nvvar_save when no external environment was loaded Ahmad Fatoum
@ 2025-12-12 16:22 ` Ahmad Fatoum
2025-12-12 16:22 ` [PATCH v3 3/3] environment: allow board code to suppress external env loading Ahmad Fatoum
2025-12-15 8:33 ` [PATCH v3 0/3] " Sascha Hauer
3 siblings, 0 replies; 5+ messages in thread
From: Ahmad Fatoum @ 2025-12-12 16:22 UTC (permalink / raw)
To: barebox; +Cc: Ahmad Fatoum
Not having a persisted environment is expected behavior in some configurations,
so emit it at info log level.
While at it, reword in preparation for the follow-up commit.
Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
v2 -> v3:
- no change
---
common/startup.c | 8 +++-----
1 file changed, 3 insertions(+), 5 deletions(-)
diff --git a/common/startup.c b/common/startup.c
index 53003b88bc1b..b6f8a49bb94b 100644
--- a/common/startup.c
+++ b/common/startup.c
@@ -99,12 +99,10 @@ static int load_environment(void)
ERR_PTR(ret));
}
- if (IS_ENABLED(CONFIG_ENV_HANDLING)) {
+ if (IS_ENABLED(CONFIG_ENV_HANDLING))
envfs_load(default_environment_path, "/env", 0);
- } else {
- if (IS_ENABLED(CONFIG_DEFAULT_ENVIRONMENT))
- pr_notice("No support for persistent environment. Using default environment\n");
- }
+ else if (IS_ENABLED(CONFIG_DEFAULT_ENVIRONMENT))
+ pr_info("external environment support disabled. Using default environment\n");
nvvar_load();
--
2.47.3
^ permalink raw reply [flat|nested] 5+ messages in thread* [PATCH v3 3/3] environment: allow board code to suppress external env loading
2025-12-12 16:22 [PATCH v3 0/3] environment: allow board code to suppress external env loading Ahmad Fatoum
2025-12-12 16:22 ` [PATCH v3 1/3] globalvar: suppress nvvar_save when no external environment was loaded Ahmad Fatoum
2025-12-12 16:22 ` [PATCH v3 2/3] startup: bump down log message about lack of persistent environment Ahmad Fatoum
@ 2025-12-12 16:22 ` Ahmad Fatoum
2025-12-15 8:33 ` [PATCH v3 0/3] " Sascha Hauer
3 siblings, 0 replies; 5+ messages in thread
From: Ahmad Fatoum @ 2025-12-12 16:22 UTC (permalink / raw)
To: barebox; +Cc: Ahmad Fatoum
It can be useful for board code to deny loading an environment without
disabling it altogether, e.g. to disable load of the environment when
entering a recovery mode. Add a function for that.
Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
v2 -> v3:
- no change
v1 -> v2:
- change from globalvar to C function
---
common/startup.c | 14 ++++++++++++--
include/envfs.h | 5 +++++
2 files changed, 17 insertions(+), 2 deletions(-)
diff --git a/common/startup.c b/common/startup.c
index b6f8a49bb94b..73cf4a495b9c 100644
--- a/common/startup.c
+++ b/common/startup.c
@@ -85,6 +85,15 @@ static int mount_root(void)
fs_initcall(mount_root);
#endif
+static bool may_autoload_external_env = IS_ENABLED(CONFIG_ENV_HANDLING);
+
+#ifdef CONFIG_ENV_HANDLING
+void autoload_external_env(bool endis)
+{
+ may_autoload_external_env = endis;
+}
+#endif
+
static int load_environment(void)
{
const char *default_environment_path;
@@ -99,10 +108,11 @@ static int load_environment(void)
ERR_PTR(ret));
}
- if (IS_ENABLED(CONFIG_ENV_HANDLING))
+ if (may_autoload_external_env)
envfs_load(default_environment_path, "/env", 0);
else if (IS_ENABLED(CONFIG_DEFAULT_ENVIRONMENT))
- pr_info("external environment support disabled. Using default environment\n");
+ pr_info("external environment support %s. Using default environment\n",
+ IS_ENABLED(CONFIG_ENV_HANDLING) ? "disallowed" : "disabled");
nvvar_load();
diff --git a/include/envfs.h b/include/envfs.h
index e21f2b52368a..0c6b2e681515 100644
--- a/include/envfs.h
+++ b/include/envfs.h
@@ -105,6 +105,7 @@ int envfs_load_from_buf(void *buf, int len, const char *dir, unsigned flags);
#ifdef CONFIG_ENV_HANDLING
void default_environment_path_set(const char *path);
const char *default_environment_path_get(void);
+void autoload_external_env(bool endis);
#else
static inline void default_environment_path_set(const char *path)
{
@@ -114,6 +115,10 @@ static inline const char *default_environment_path_get(void)
{
return NULL;
}
+
+static inline void autoload_external_env(bool endis)
+{
+}
#endif
#ifdef CONFIG_OF_BAREBOX_DRIVERS
--
2.47.3
^ permalink raw reply [flat|nested] 5+ messages in thread* Re: [PATCH v3 0/3] environment: allow board code to suppress external env loading
2025-12-12 16:22 [PATCH v3 0/3] environment: allow board code to suppress external env loading Ahmad Fatoum
` (2 preceding siblings ...)
2025-12-12 16:22 ` [PATCH v3 3/3] environment: allow board code to suppress external env loading Ahmad Fatoum
@ 2025-12-15 8:33 ` Sascha Hauer
3 siblings, 0 replies; 5+ messages in thread
From: Sascha Hauer @ 2025-12-15 8:33 UTC (permalink / raw)
To: barebox, Ahmad Fatoum
On Fri, 12 Dec 2025 17:22:06 +0100, Ahmad Fatoum wrote:
> It can be useful for board code to deny loading an environment without
> disabling it altogether, e.g. to disable load of the environment when
> entering a recovery mode. Add a function for that.
>
> Ahmad Fatoum (3):
> globalvar: suppress nvvar_save when no external environment was loaded
> startup: bump down log message about lack of persistent environment
> environment: allow board code to suppress external env loading
>
> [...]
Applied, thanks!
[1/3] globalvar: suppress nvvar_save when no external environment was loaded
https://git.pengutronix.de/cgit/barebox/commit/?id=3a70c74c9072 (link may not be stable)
[2/3] startup: bump down log message about lack of persistent environment
https://git.pengutronix.de/cgit/barebox/commit/?id=a44a846a6684 (link may not be stable)
[3/3] environment: allow board code to suppress external env loading
https://git.pengutronix.de/cgit/barebox/commit/?id=cbaad9fa1bfc (link may not be stable)
Best regards,
--
Sascha Hauer <s.hauer@pengutronix.de>
^ permalink raw reply [flat|nested] 5+ messages in thread