[PATCH] blspec: derive root prefix from blspec config path instead of mountpoint

chalianis1 at gmail.com chalianis1 at gmail.com
Thu Nov 13 21:00:34 PST 2025


From: Chali Anis <chalianis1 at gmail.com>

Add get_prefix_path() to compute the filesystem prefix of a BLSpec
entry by locating the deepest /loader/entries/ component in the
configuration path. This ensures correct rootpath extraction for
nested loader directories, mixed path layouts, duplicate segments,
and paths without valid loader entries. If no prefix is found,
fall back to get_mounted_path().

Signed-off-by: Chali Anis <chalianis1 at gmail.com>
---
 common/blspec.c | 25 ++++++++++++++++++++++++-
 1 file changed, 24 insertions(+), 1 deletion(-)

diff --git a/common/blspec.c b/common/blspec.c
index 80ebe256ceaf..ad94d4d6be64 100644
--- a/common/blspec.c
+++ b/common/blspec.c
@@ -391,6 +391,29 @@ static bool entry_is_match_machine_id(struct blspec_entry *entry)
 	return ret;
 }
 
+/*
+ * Return the path prefix before the deepest "/loader/entries/" component
+ * in @configname. Falls back to the mounted path if none is found.
+ */
+static char *get_blspec_prefix_path(char *configname)
+{
+	char *p;
+	char *scfg = configname;
+	char *save = NULL;
+
+	while ((p = strstr(scfg, "/loader/entries/")) != NULL) {
+		if (p - configname > 0)
+			save = p;
+
+		scfg = p + 1;
+	}
+
+	if (save && save - configname > 0)
+		return xstrndup(configname, save - configname);
+
+	return get_mounted_path(configname);
+}
+
 static int __blspec_scan_file(struct bootentries *bootentries, const char *root,
 			      const char *configname)
 {
@@ -404,7 +427,7 @@ static int __blspec_scan_file(struct bootentries *bootentries, const char *root,
 	if (IS_ERR(entry))
 		return PTR_ERR(entry);
 
-	root = root ?: get_mounted_path(configname);
+	root = root ?: get_blspec_prefix_path(configname);
 	entry->rootpath = xstrdup_const(root);
 	entry->configpath = xstrdup_const(configname);
 	entry->cdev = get_cdev_by_mountpath(root);
-- 
2.49.0




More information about the barebox mailing list