struct discover_boot_option *default_boot_option;
struct list unresolved_boot_options;
+
+ struct boot_task *pending_boot;
+ bool pending_boot_is_default;
};
static int mount_device(struct discover_device *dev);
if (!handler->default_boot_option)
return 0;
+ if (handler->pending_boot)
+ return 0;
+
opt = handler->default_boot_option;
if (handler->sec_to_boot) {
pb_log("Timeout expired, booting default option %s\n", opt->option->id);
- boot(handler, handler->default_boot_option, NULL,
- handler->dry_run, boot_status, handler);
+ handler->pending_boot = boot(handler, handler->default_boot_option,
+ NULL, handler->dry_run, boot_status, handler);
+ handler->pending_boot_is_default = true;
return 0;
}
if (resource_is_resolved(res))
return true;
- pb_log("Attempting to resolve resource %s->%s with parser %s\n",
+ pb_debug("Attempting to resolve resource %s->%s with parser %s\n",
opt->option->id, name, parser->name);
parser->resolve_resource(handler, res);
list_for_each_entry_safe(&handler->unresolved_boot_options,
opt, tmp, list) {
- pb_log("queue: attempting resolution for %s\n",
+ pb_debug("queue: attempting resolution for %s\n",
opt->option->id);
if (!boot_option_resolve(opt, handler))
continue;
- pb_log("\tresolved!\n");
+ pb_debug("\tresolved!\n");
list_remove(&opt->list);
list_add_tail(&opt->device->boot_options, &opt->list);
{
struct discover_context *ctx;
- ctx = talloc(handler, struct discover_context);
+ ctx = talloc_zero(handler, struct discover_context);
ctx->device = device;
- ctx->conf_url = NULL;
- ctx->test_data = NULL;
list_init(&ctx->boot_options);
return ctx;
void device_handler_boot(struct device_handler *handler,
struct boot_command *cmd)
{
- struct discover_boot_option *opt;
+ struct discover_boot_option *opt = NULL;
- opt = find_boot_option_by_id(handler, cmd->option_id);
+ if (cmd->option_id && strlen(cmd->option_id))
+ opt = find_boot_option_by_id(handler, cmd->option_id);
- boot(handler, opt, cmd, handler->dry_run, boot_status, handler);
+ if (handler->pending_boot)
+ boot_cancel(handler->pending_boot);
+ handler->pending_boot = boot(handler, opt, cmd, handler->dry_run,
+ boot_status, handler);
+ handler->pending_boot_is_default = false;
}
void device_handler_cancel_default(struct device_handler *handler)
pb_log("Cancelling default boot option\n");
+ if (handler->pending_boot && handler->pending_boot_is_default) {
+ boot_cancel(handler->pending_boot);
+ handler->pending_boot = NULL;
+ handler->pending_boot_is_default = false;
+ }
+
handler->default_boot_option = NULL;
status.type = BOOT_STATUS_INFO;
return -1;
dev->mounted = false;
- talloc_free(dev->mount_path);
- dev->mount_path = NULL;
pb_rmdir_recursive(mount_base(), dev->mount_path);
+ talloc_free(dev->mount_path);
+ dev->mount_path = NULL;
+
return 0;
}