From f332611abee97247e40311d99492d53697152a1a Mon Sep 17 00:00:00 2001 From: Boucman Date: Fri, 10 Nov 2017 17:00:32 +0100 Subject: [PATCH] device : reload when udev generates a "changed" event (#6850) --- man/systemd.device.xml | 6 ++++++ src/core/device.c | 20 ++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/man/systemd.device.xml b/man/systemd.device.xml index c60b9c0..6edf109 100644 --- a/man/systemd.device.xml +++ b/man/systemd.device.xml @@ -83,6 +83,12 @@ the escaping logic used to convert a file system path to a unit name see systemd.unit5. + + Device units will be reloaded by systemd whenever the + corresponding device generates a changed event. + Other units can use ReloadPropagatedFrom= to react + to that event + diff --git a/src/core/device.c b/src/core/device.c index 87186f1..3915b26 100644 --- a/src/core/device.c +++ b/src/core/device.c @@ -766,6 +766,26 @@ static int device_dispatch_io(sd_event_source *source, int fd, uint32_t revents, return 0; } + if (streq(action, "change")) { + _cleanup_free_ char *e = NULL; + Unit *u; + + r = unit_name_from_path(sysfs, ".device", &e); + if (r < 0) + log_error_errno(r, "Failed to generate unit name from device path: %m"); + else { + u = manager_get_unit(m, e); + if (u && UNIT_VTABLE(u)->active_state(u) == UNIT_ACTIVE) { + r = manager_propagate_reload(m, u, JOB_REPLACE, NULL); + if (r < 0) + log_error_errno(r, "Failed to propagate reload: %m"); + } + } + } + + /* A change event can signal that a device is becoming ready, in particular if + * the device is using the SYSTEMD_READY logic in udev + * so we need to reach the else block of the follwing if, even for change events */ if (streq(action, "remove")) { r = swap_process_device_remove(m, dev); if (r < 0) -- 2.7.4