Merge pull request #6428 from boucman/device_reload

device : reload when udev generates a "changed" event
This commit is contained in:
Lennart Poettering 2017-09-14 12:46:23 +02:00 committed by GitHub
commit 3b22864e20
3 changed files with 37 additions and 5 deletions

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>

View file

@ -766,7 +766,27 @@ static int device_dispatch_io(sd_event_source *source, int fd, uint32_t revents,
return 0;
}
if (streq(action, "remove")) {
if (streq(action, "change")) {
_cleanup_free_ char *e = NULL;
Unit *u;
r = unit_name_from_path(sysfs, ".device", &e);
if (r < 0)
return log_error_errno(r, "Failed to generate unit name from device path: %m");
u = manager_get_unit(m, e);
if (!u) {
log_error("Failed to get unit from sysfs name.");
return 0;
}
r = manager_add_job(m, JOB_RELOAD, u, JOB_REPLACE, NULL, NULL);
if (r < 0) {
log_error_errno(r, "Failed to add job to manager : %m");
return 0;
}
} else if (streq(action, "remove")) {
r = swap_process_device_remove(m, dev);
if (r < 0)
log_error_errno(r, "Failed to process swap device remove event: %m");

View file

@ -1759,19 +1759,25 @@ int unit_reload(Unit *u) {
unit_add_to_dbus_queue(u);
if (!UNIT_VTABLE(u)->reload) {
/* Unit doesn't have a reload function, but we need to propagate the reload anyway */
unit_notify(u, unit_active_state(u), unit_active_state(u), true);
return 0;
}
return UNIT_VTABLE(u)->reload(u);
}
bool unit_can_reload(Unit *u) {
assert(u);
if (!UNIT_VTABLE(u)->reload)
return false;
if (UNIT_VTABLE(u)->can_reload)
return UNIT_VTABLE(u)->can_reload(u);
if (!UNIT_VTABLE(u)->can_reload)
if (!set_isempty(u->dependencies[UNIT_PROPAGATES_RELOAD_TO]))
return true;
return UNIT_VTABLE(u)->can_reload(u);
return UNIT_VTABLE(u)->reload;
}
static void unit_check_unneeded(Unit *u) {