X-Git-Url: http://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=discover%2Fdevice-handler.c;h=569e65290bd7e98cef518b078a16f76547ecb564;hp=ce3fc465ec03fadef829052eda8fe1ad8644ed7a;hb=5e364ce7e096f4e35e4c8b2d5eec79c56ac1b32e;hpb=3132110c344c60bbe648b5e1b0473bdec101d111 diff --git a/discover/device-handler.c b/discover/device-handler.c index ce3fc46..569e652 100644 --- a/discover/device-handler.c +++ b/discover/device-handler.c @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -18,6 +19,7 @@ #include #include #include +#include #include #include @@ -393,6 +395,7 @@ void device_handler_reinit(struct device_handler *handler) { struct discover_boot_option *opt, *tmp; struct ramdisk_device *ramdisk; + struct config *config; unsigned int i; device_handler_cancel_default(handler); @@ -440,6 +443,14 @@ void device_handler_reinit(struct device_handler *handler) set_env_variables(config_get()); + /* If the safe mode warning was active disable it now */ + if (config_get()->safe_mode) { + config = config_copy(handler, config_get()); + config->safe_mode = false; + config_set(config); + discover_server_notify_config(handler->server, config); + } + device_handler_reinit_sources(handler); } @@ -643,7 +654,7 @@ void device_handler_status_download(struct device_handler *handler, unit++; } update = talloc_asprintf(handler, - _("%u %s downloading: %.0f%% - %lu%cB"), + _("%u %s downloading: %.0f%% - %" PRIu64 "%cB"), handler->n_progress, ngettext("item", "items", handler->n_progress), (current / total) * 100, current_converted, @@ -821,6 +832,9 @@ static enum default_priority default_option_priority( int boot_match = autoboot_option_priority(config, opt); if (boot_match > 0) return boot_match; + } else { + /* If there is no specific boot order, boot any device */ + return DEFAULT_PRIORITY_LOCAL_FIRST; } /* If the option didn't match any entry in the array, it is disabled */ @@ -1346,7 +1360,7 @@ static void process_url_cb(struct load_url_result *result, void *data) mac = event_get_param(event, "mac"); char *url = talloc_asprintf(event, "file://%s", result->local); - event_set_param(event, "pxeconffile", url); + event_set_param(event, "pxeconffile-local", url); dev = discover_device_create(handler, mac, event->device); ctx = device_handler_discover_context_create(handler, dev); @@ -1546,8 +1560,7 @@ void device_handler_add_plugin_option(struct device_handler *handler, tmp = handler->plugins[i]; /* If both id and version match, ignore */ if (strncmp(opt->id, tmp->id, strlen(opt->id)) == 0 && - strncmp(opt->version, tmp->version, - strlen(opt->version) == 0)) { + strcmp(opt->version, tmp->version) == 0) { pb_log("discover: Plugin '%s' already exists, ignoring\n", opt->id); return; @@ -1782,6 +1795,20 @@ static int mount_device(struct discover_device *dev) rc = try_mount(device_path, dev->mount_path, fstype, MS_RDONLY | MS_SILENT, dev->ramdisk); + /* If mount fails clean up any snapshot and try again */ + if (rc && dev->ramdisk) { + pb_log("couldn't mount snapshot for %s: mount failed: %s\n", + device_path, strerror(errno)); + pb_log("falling back to actual device\n"); + + devmapper_destroy_snapshot(dev); + + device_path = get_device_path(dev); + pb_log("mounting device %s read-only\n", dev->device_path); + rc = try_mount(device_path, dev->mount_path, fstype, + MS_RDONLY | MS_SILENT, dev->ramdisk); + } + if (!rc) { dev->mounted = true; dev->mounted_rw = false; @@ -1793,9 +1820,6 @@ static int mount_device(struct discover_device *dev) pb_log("couldn't mount device %s: mount failed: %s\n", device_path, strerror(errno)); - /* If mount fails clean up any snapshot */ - devmapper_destroy_snapshot(dev); - pb_rmdir_recursive(mount_base(), dev->mount_path); err_free: talloc_free(dev->mount_path);