]> git.ozlabs.org Git - petitboot/commitdiff
discover: add reinit path
authorJeremy Kerr <jk@ozlabs.org>
Wed, 2 Apr 2014 06:33:38 +0000 (14:33 +0800)
committerJeremy Kerr <jk@ozlabs.org>
Wed, 2 Apr 2014 06:33:38 +0000 (14:33 +0800)
Currently, changes to settings doesn't take effect while the discover
server is running. This means we need to reboot for any changes (eg, to
network settings) to take effect.

This change introduces a reinit path. Triggered by a configuration
update, this will cause the device handler to drop all of its devices
(and boot options), and restart the discovery process from the device
sources.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
discover/device-handler.c
discover/network.c
discover/udev.c
discover/udev.h

index 352a477d16230c49b4a14c6201bf3d7ab03de649..f5dc32c7abcb4f2239980b1c5a837fd2dd60cc2b 100644 (file)
@@ -57,6 +57,7 @@ static int mount_device(struct discover_device *dev);
 static int umount_device(struct discover_device *dev);
 
 static int device_handler_init_sources(struct device_handler *handler);
+static void device_handler_reinit_sources(struct device_handler *handler);
 
 void discover_context_add_boot_option(struct discover_context *ctx,
                struct discover_boot_option *boot_option)
@@ -293,6 +294,31 @@ struct device_handler *device_handler_init(struct discover_server *server,
        return handler;
 }
 
+static void device_handler_reinit(struct device_handler *handler)
+{
+       struct discover_boot_option *opt, *tmp;
+       unsigned int i;
+
+       device_handler_cancel_default(handler);
+
+       /* free unresolved boot options */
+       list_for_each_entry_safe(&handler->unresolved_boot_options,
+                       opt, tmp, list)
+               talloc_free(opt);
+       list_init(&handler->unresolved_boot_options);
+
+       /* drop all devices */
+       for (i = 0; i < handler->n_devices; i++)
+               discover_server_notify_device_remove(handler->server,
+                               handler->devices[i]->device);
+
+       talloc_free(handler->devices);
+       handler->devices = NULL;
+       handler->n_devices = 0;
+
+       device_handler_reinit_sources(handler);
+}
+
 void device_handler_remove(struct device_handler *handler,
                struct discover_device *device)
 {
@@ -763,6 +789,7 @@ void device_handler_update_config(struct device_handler *handler,
 {
        config_set(config);
        discover_server_notify_config(handler->server, config);
+       device_handler_reinit(handler);
 }
 
 #ifndef PETITBOOT_TEST
@@ -786,6 +813,15 @@ static int device_handler_init_sources(struct device_handler *handler)
        return 0;
 }
 
+static void device_handler_reinit_sources(struct device_handler *handler)
+{
+       udev_reinit(handler->udev);
+
+       network_shutdown(handler->network);
+       handler->network = network_init(handler, handler->waitset,
+                       handler->dry_run);
+}
+
 static bool check_existing_mount(struct discover_device *dev)
 {
        struct stat devstat, mntstat;
@@ -953,6 +989,11 @@ static int device_handler_init_sources(
        return 0;
 }
 
+static void device_handler_reinit_sources(
+               struct device_handler *handler __attribute__((unused)))
+{
+}
+
 static int umount_device(struct discover_device *dev __attribute__((unused)))
 {
        return 0;
index 9acd4cb5f0cf695637c4d087a066d87947442eb9..ca4cc44acf1ba3d1334452b547326041c33f8b13 100644 (file)
@@ -584,7 +584,6 @@ err:
        return NULL;
 }
 
-
 int network_shutdown(struct network *network)
 {
        struct interface *interface;
index 320dffd03c1676d5f401153bb24ed80bb3c21e55..7db36a7de5f3777428951f9312c0c78de0b62b8a 100644 (file)
@@ -469,3 +469,9 @@ fail_new:
        talloc_free(udev);
        return NULL;
 }
+
+void udev_reinit(struct pb_udev *udev)
+{
+       pb_log("udev: reinit requested, starting enumeration\n");
+       udev_enumerate(udev->udev);
+}
index edd18fa3887baf17d18d3d8ebe1a982d9423d07a..c0fa5c04e83158736c7340678ea78781cd350273 100644 (file)
@@ -8,4 +8,6 @@ struct waitset;
 struct pb_udev *udev_init(struct device_handler *handler,
                struct waitset *waitset);
 
+void udev_reinit(struct pb_udev *udev);
+
 #endif /* _UDEV_H */