diff options
author | Jeremy Kerr <jk@ozlabs.org> | 2014-01-30 16:19:20 +0800 |
---|---|---|
committer | Jeremy Kerr <jk@ozlabs.org> | 2014-01-30 21:59:10 +0800 |
commit | aa530148044a7c6d7ec7b6a32672cc69d53979b2 (patch) | |
tree | 09e9ef7bb4a1f0c6976657c581553bb00ea5c40f /discover | |
parent | a984595cfb4910ba6f464c69c316f1613f10f894 (diff) | |
download | talos-petitboot-aa530148044a7c6d7ec7b6a32672cc69d53979b2.tar.gz talos-petitboot-aa530148044a7c6d7ec7b6a32672cc69d53979b2.zip |
discover: Make boot_priorities more flexible
Rather than rely on the ordering of the boot_priorities array to define
which device types have a higher "default boot" priority, this change
introduces a slightly more flexible way of priority lookups, by adding a
separate priority field to struct boot_priority.
This means we can have an unordered array, change priorities without
re-writing the array, and implementing a disable mechanism.
Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Diffstat (limited to 'discover')
-rw-r--r-- | discover/device-handler.c | 18 | ||||
-rw-r--r-- | discover/platform.c | 3 |
2 files changed, 15 insertions, 6 deletions
diff --git a/discover/device-handler.c b/discover/device-handler.c index c57b7b6..a271390 100644 --- a/discover/device-handler.c +++ b/discover/device-handler.c @@ -386,28 +386,36 @@ static int default_option_priority(struct discover_boot_option *opt) for (i = 0; i < config->n_boot_priorities; i++) { prio = &config->boot_priorities[i]; if (priority_match(prio, opt)) - break; + return prio->priority; } - return i; + return 0; } static void set_default(struct device_handler *handler, struct discover_boot_option *opt) { + int new_prio; + if (!handler->autoboot_enabled) return; + new_prio = default_option_priority(opt); + + /* A negative priority indicates that we don't want to boot this device + * by default */ + if (new_prio < 0) + return; + /* Resolve any conflicts: if we have a new default option, it only * replaces the current if it has a higher priority. */ if (handler->default_boot_option) { - int new_prio, cur_prio; + int cur_prio; - new_prio = default_option_priority(opt); cur_prio = default_option_priority( handler->default_boot_option); - if (new_prio < cur_prio) { + if (new_prio > cur_prio) { handler->default_boot_option = opt; /* extend the timeout a little, so the user sees some * indication of the change */ diff --git a/discover/platform.c b/discover/platform.c index d52c9f6..db0ea61 100644 --- a/discover/platform.c +++ b/discover/platform.c @@ -67,8 +67,9 @@ void config_set_defaults(struct config *config) config->boot_priorities = talloc_array(config, struct boot_priority, config->n_boot_priorities); config->boot_priorities[0].type = DEVICE_TYPE_NETWORK; + config->boot_priorities[0].priority = 2; config->boot_priorities[1].type = DEVICE_TYPE_DISK; - + config->boot_priorities[1].priority = 1; } int platform_init(void *ctx) |