summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJérémy Rosen <jeremy.rosen@enst-bretagne.fr>2017-09-02 11:23:36 +0200
committerJérémy Rosen <jeremy.rosen@enst-bretagne.fr>2017-09-10 18:53:26 +0200
commit0ffddc6e2c6e19e5dc81812aee9fbe964059f3aa (patch)
tree488dae0b010f21658da814c17166c8cc6784531e
parentunit : allow any unit which propagates reloads to be reloaded (diff)
downloadsystemd-0ffddc6e2c6e19e5dc81812aee9fbe964059f3aa.tar.xz
systemd-0ffddc6e2c6e19e5dc81812aee9fbe964059f3aa.zip
device : reload when udev generates a "changed" event
-rw-r--r--man/systemd.device.xml6
-rw-r--r--src/core/device.c22
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");