From 58db060fbb1548a0acdfc475fa41fe86fb32dd11 Mon Sep 17 00:00:00 2001 From: Samuel Mendoza-Jonas Date: Thu, 15 Jun 2017 15:23:06 +1000 Subject: discover: Wait for net interfaces to be marked ready If pb-discover is started before udev has settled there is a race between Petitboot configuring interfaces and udev renaming them. If an interface is set "up" the name change will fail and interfaces can be inconsistently named, eg: Device: (*) eth0 [0c:c4:7a:f4:1c:50, link up] ( ) enP1p9s0f1 [0c:c4:7a:f4:1c:51, link down] ( ) enP1p9s0f2 [0c:c4:7a:f4:1c:52, link down] ( ) enP1p9s0f3 [0c:c4:7a:f4:1c:53, link down] Add "net" devices to the udev filter and wait for them to be announced by udev before configuring them. udev_enumerate_add_match_is_initialized() ensures that by the time an interface appears via udev its name will be consistent. This also swaps the network and udev init order, but since interfaces now will not be configured until after udev is ready this should not have a user-visible effect. Signed-off-by: Samuel Mendoza-Jonas --- discover/device-handler.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'discover/device-handler.c') diff --git a/discover/device-handler.c b/discover/device-handler.c index 3858444..778cc8d 100644 --- a/discover/device-handler.c +++ b/discover/device-handler.c @@ -1424,15 +1424,15 @@ static void device_handler_update_lang(const char *lang) static int device_handler_init_sources(struct device_handler *handler) { /* init our device sources: udev, network and user events */ - handler->udev = udev_init(handler, handler->waitset); - if (!handler->udev) - return -1; - handler->network = network_init(handler, handler->waitset, handler->dry_run); if (!handler->network) return -1; + handler->udev = udev_init(handler, handler->waitset); + if (!handler->udev) + return -1; + handler->user_event = user_event_init(handler, handler->waitset); if (!handler->user_event) return -1; @@ -1451,11 +1451,11 @@ static void device_handler_reinit_sources(struct device_handler *handler) system_info_reinit(); - udev_reinit(handler->udev); - network_shutdown(handler->network); handler->network = network_init(handler, handler->waitset, handler->dry_run); + + udev_reinit(handler->udev); } static inline const char *get_device_path(struct discover_device *dev) -- cgit v1.2.1