diff --git a/man/systemd.device.xml b/man/systemd.device.xml
index c60b9c035e..6edf1090d0 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 87186f135b..3915b2637d 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)