From 43b0a412efc1dfd8f2484a8b1e8aae11a855763c Mon Sep 17 00:00:00 2001 From: Jeremy Kerr Date: Tue, 24 Sep 2013 10:58:16 +0800 Subject: [PATCH] discover/boot: Check for failed loads in boot() Use the status argument to the URL load callback to check for load failures. Signed-off-by: Jeremy Kerr --- discover/boot.c | 47 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 33 insertions(+), 14 deletions(-) diff --git a/discover/boot.c b/discover/boot.c index 18bca58..313bd2a 100644 --- a/discover/boot.c +++ b/discover/boot.c @@ -31,6 +31,7 @@ enum boot_process_state { BOOT_STATE_INITIAL, BOOT_STATE_IMAGE_LOADING, BOOT_STATE_INITRD_LOADING, + BOOT_STATE_DTB_LOADING, BOOT_STATE_FINISH, BOOT_STATE_UNKNOWN, }; @@ -287,7 +288,7 @@ static void run_boot_hooks(struct boot_task *task) free(hooks); } -static void boot_process(void *ctx, int status __attribute__((unused))) +static void boot_process(void *ctx, int status) { struct boot_task *task = ctx; unsigned int clean_image = 0; @@ -305,13 +306,20 @@ static void boot_process(void *ctx, int status __attribute__((unused))) BOOT_STATUS_ERROR, "Couldn't load kernel image"); goto no_load; - } else { - task->state = BOOT_STATE_IMAGE_LOADING; - return; } + task->state = BOOT_STATE_IMAGE_LOADING; + return; } if (task->state == BOOT_STATE_IMAGE_LOADING) { + if (status) { + update_status(task->status_fn, task->status_arg, + BOOT_STATUS_ERROR, + "Error loading kernel image"); + goto no_load; + } + task->state = BOOT_STATE_INITRD_LOADING; + if (task->initrd) { update_status(task->status_fn, task->status_arg, BOOT_STATUS_INFO, "loading initrd"); @@ -322,16 +330,20 @@ static void boot_process(void *ctx, int status __attribute__((unused))) BOOT_STATUS_ERROR, "Couldn't load initrd image"); goto no_load; - } else { - task->state = BOOT_STATE_INITRD_LOADING; - return; } - } else { - task->state = BOOT_STATE_INITRD_LOADING; + return; } } if (task->state == BOOT_STATE_INITRD_LOADING) { + if (status) { + update_status(task->status_fn, task->status_arg, + BOOT_STATUS_ERROR, + "Error loading initrd"); + goto no_load; + } + task->state = BOOT_STATE_DTB_LOADING; + if (task->dtb) { update_status(task->status_fn, task->status_arg, BOOT_STATUS_INFO, @@ -343,15 +355,22 @@ static void boot_process(void *ctx, int status __attribute__((unused))) BOOT_STATUS_ERROR, "Couldn't load device tree"); goto no_load; - } else { - task->state = BOOT_STATE_FINISH; - return; } - } else { - task->state = BOOT_STATE_FINISH; + return; + } + } + + if (task->state == BOOT_STATE_DTB_LOADING) { + if (status) { + update_status(task->status_fn, task->status_arg, + BOOT_STATUS_ERROR, + "Error loading dtb"); + goto no_load; } + task->state = BOOT_STATE_FINISH; } + if (task->state != BOOT_STATE_FINISH) { task->state = BOOT_STATE_UNKNOWN; return; -- 2.39.2