device : reload when udev generates a "changed" event (#6850)

This commit is contained in:
Boucman
2017-11-10 17:00:32 +01:00
committed by Lennart Poettering
parent 8d644046d9
commit f332611abe
2 changed files with 26 additions and 0 deletions
+6
View File
@@ -83,6 +83,12 @@
the escaping logic used to convert a file system path to a unit
name see
<citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>.</para>
<para>Device units will be reloaded by systemd whenever the
corresponding device generates a <literal>changed</literal> event.
Other units can use <varname>ReloadPropagatedFrom=</varname> to react
to that event</para>
</refsect1>
<refsect1>
+20
View File
@@ -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)