X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fdevice.c;h=b9d8a2b9cf4a6444c5ee8ccf1563a1f81dddab3d;hb=4dba533a137486719fb385c45fc2ff75593fdf53;hp=957bc2d6b5ee02104c740ceaa974b0422b46ecaa;hpb=2e6081f2ff69d61b8b7bedbacf3a8de60de2b0b6;p=elogind.git diff --git a/src/device.c b/src/device.c index 957bc2d6b..b9d8a2b9c 100644 --- a/src/device.c +++ b/src/device.c @@ -92,7 +92,7 @@ static void device_set_state(Device *d, DeviceState state) { device_state_to_string(old_state), device_state_to_string(state)); - unit_notify(UNIT(d), state_translation_table[old_state], state_translation_table[state]); + unit_notify(UNIT(d), state_translation_table[old_state], state_translation_table[state], true); } static int device_coldplug(Unit *u) { @@ -468,8 +468,10 @@ static int device_enumerate(Manager *m) { goto fail; } - if (udev_monitor_set_receive_buffer_size(m->udev_monitor, 128*1024*1024) < 0) - log_error("Failed to set udev event buffer size."); + /* This will fail if we are unprivileged, but that + * should not matter much, as user instances won't run + * during boot. */ + udev_monitor_set_receive_buffer_size(m->udev_monitor, 128*1024*1024); if (udev_monitor_filter_add_match_tag(m->udev_monitor, "systemd") < 0) { r = -ENOMEM; @@ -524,7 +526,7 @@ fail: void device_fd_event(Manager *m, int events) { struct udev_device *dev; int r; - const char *action; + const char *action, *ready; assert(m); @@ -550,7 +552,9 @@ void device_fd_event(Manager *m, int events) { goto fail; } - if (streq(action, "remove")) { + ready = udev_device_get_property_value(dev, "SYSTEMD_READY"); + + if (streq(action, "remove") || (ready && parse_boolean(ready) == 0)) { if ((r = device_process_removed_device(m, dev)) < 0) { log_error("Failed to process udev device event: %s", strerror(-r)); goto fail;