[PATCH v2 1/3] globalvar: suppress nvvar_save when no external environment was loaded

Ahmad Fatoum a.fatoum at pengutronix.de
Thu Dec 11 12:48:10 PST 2025


nvvar_save will load the extenral 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 at pengutronix.de>
---
 common/environment.c | 7 +++++++
 common/globalvar.c   | 8 +++++++-
 include/globalvar.h  | 1 +
 3 files changed, 15 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..1e06fb43775f 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;
@@ -713,7 +719,7 @@ int nvvar_save(void)
 	const char *env = default_environment_path_get();
 	int ret = 0;
 #define TMPDIR "/.env.tmp"
-	if (!nv_dirty || !env)
+	if (!nv_dirty || !env || !nv_persistable)
 		return 0;
 
 	if (IS_ENABLED(CONFIG_DEFAULT_ENVIRONMENT))
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




More information about the barebox mailing list