diff options
Diffstat (limited to 'boot/bootmeth_rauc.c')
-rw-r--r-- | boot/bootmeth_rauc.c | 40 |
1 files changed, 22 insertions, 18 deletions
diff --git a/boot/bootmeth_rauc.c b/boot/bootmeth_rauc.c index fc60e6e355d..cc6180221ed 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); @@ -168,20 +168,24 @@ static int distro_rauc_read_bootflow(struct udevice *dev, struct bootflow *bflow (slot = strsep(&boot_order_copy, " ")); i++) { struct distro_rauc_slot *s; + struct distro_rauc_slot **new_slots; s = calloc(1, sizeof(struct distro_rauc_slot)); s->name = strdup(slot); s->boot_part = simple_strtoul(strsep(&parts, ","), NULL, 10); s->root_part = simple_strtoul(strsep(&parts, ","), NULL, 10); - priv->slots = realloc(priv->slots, (i + 1) * - sizeof(struct distro_rauc_slot)); + new_slots = realloc(priv->slots, (i + 1) * + sizeof(struct distro_rauc_slot)); + if (!new_slots) + return log_msg_ret("buf", -ENOMEM); + priv->slots = new_slots; priv->slots[i - 1] = s; - priv->slots[i]->name = NULL; + priv->slots[i] = NULL; } 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); |