diff options
author | Jérémy Rosen <jeremy.rosen@enst-bretagne.fr> | 2017-09-02 11:23:36 +0200 |
---|---|---|
committer | Jérémy Rosen <jeremy.rosen@enst-bretagne.fr> | 2017-09-10 18:53:26 +0200 |
commit | 0ffddc6e2c6e19e5dc81812aee9fbe964059f3aa (patch) | |
tree | 488dae0b010f21658da814c17166c8cc6784531e | |
parent | unit : allow any unit which propagates reloads to be reloaded (diff) | |
download | systemd-0ffddc6e2c6e19e5dc81812aee9fbe964059f3aa.tar.xz systemd-0ffddc6e2c6e19e5dc81812aee9fbe964059f3aa.zip |
device : reload when udev generates a "changed" event
-rw-r--r-- | man/systemd.device.xml | 6 | ||||
-rw-r--r-- | src/core/device.c | 22 |
2 files changed, 27 insertions, 1 deletions
diff --git a/man/systemd.device.xml b/man/systemd.device.xml index effed098dd..d156095526 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 <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> diff --git a/src/core/device.c b/src/core/device.c index 87186f135b..5366ba050f 100644 --- a/src/core/device.c +++ b/src/core/device.c @@ -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"); |