[PATCH 3/3] bootstd: rauc: Only scan all partitions instead of boot files
Martin Schwan
m.schwan at phytec.de
Mon Jul 14 15:30:10 CEST 2025
Only scan for the existence of all required partitions of a RAUC system,
instead of searching for boot script files in all of them.
Previously, it might have occurred, that a slot did not contain required
files and RAUC already marked the corresponding slot as bad (not
suitable for booting). In that case, scanning for a non-existence boot
script would result in an error (and thus not booting anything), which
was different behavior compared to the legacy RAUC boot.
Signed-off-by: Martin Schwan <m.schwan at phytec.de>
---
boot/bootmeth_rauc.c | 30 +++++++++++++++---------------
1 file changed, 15 insertions(+), 15 deletions(-)
diff --git a/boot/bootmeth_rauc.c b/boot/bootmeth_rauc.c
index 72075c04de1c609da21b0277acae413d97875fd0..cc6180221ed90934801ebd801a7bd1b3fc889aec 100644
--- a/boot/bootmeth_rauc.c
+++ b/boot/bootmeth_rauc.c
@@ -79,18 +79,17 @@ static int distro_rauc_check(struct udevice *dev, struct bootflow_iter *iter)
return 0;
}
-static int distro_rauc_scan_boot_part(struct bootflow *bflow)
+static int distro_rauc_scan_parts(struct bootflow *bflow)
{
struct blk_desc *desc;
struct distro_rauc_priv *priv;
char *boot_order;
const char **boot_order_list;
- bool exists;
int ret;
int i;
- int j;
- desc = dev_get_uclass_plat(bflow->blk);
+ if (bflow->blk)
+ desc = dev_get_uclass_plat(bflow->blk);
priv = bflow->bootmeth_priv;
if (!priv || !priv->slots)
@@ -99,20 +98,21 @@ static int distro_rauc_scan_boot_part(struct bootflow *bflow)
boot_order = env_get("BOOT_ORDER");
boot_order_list = str_to_list(boot_order);
for (i = 0; boot_order_list[i]; i++) {
- exists = false;
- for (j = 0; script_names[j]; j++) {
- const struct distro_rauc_slot *slot;
+ const struct distro_rauc_slot *slot;
- slot = get_slot(priv, boot_order_list[i]);
- if (!slot)
- return log_msg_ret("env", -ENOENT);
+ slot = get_slot(priv, boot_order_list[i]);
+ if (!slot)
+ return log_msg_ret("slot", -EINVAL);
+ if (desc) {
ret = fs_set_blk_dev_with_part(desc, slot->boot_part);
if (ret)
- return log_msg_ret("blk", ret);
- exists |= fs_exists(script_names[j]);
+ return log_msg_ret("part", ret);
+ fs_close();
+ ret = fs_set_blk_dev_with_part(desc, slot->root_part);
+ if (ret)
+ return log_msg_ret("part", ret);
+ fs_close();
}
- if (!exists)
- return log_msg_ret("fs", -ENOENT);
}
str_free_list(boot_order_list);
@@ -185,7 +185,7 @@ static int distro_rauc_read_bootflow(struct udevice *dev, struct bootflow *bflow
bflow->bootmeth_priv = priv;
- ret = distro_rauc_scan_boot_part(bflow);
+ ret = distro_rauc_scan_parts(bflow);
if (ret < 0) {
for (i = 0; priv->slots[i]->name; i++) {
free(priv->slots[i]->name);
--
2.50.0
More information about the U-Boot
mailing list