X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fdevice.c;h=41c96cef03f0c2344df2a8302977862275534676;hp=5289da3e42ef210896f4bb11c9cf3640415ab0ee;hb=08a67ac43df4819e1820ca4e3e3f9ed9b60dce22;hpb=e2f3b44cfc8864bfea7c77ff4c383ce9b535f27e diff --git a/src/device.c b/src/device.c index 5289da3e4..41c96cef0 100644 --- a/src/device.c +++ b/src/device.c @@ -29,6 +29,7 @@ #include "log.h" #include "unit-name.h" #include "dbus-device.h" +#include "def.h" static const UnitActiveState state_translation_table[_DEVICE_STATE_MAX] = { [DEVICE_DEAD] = UNIT_INACTIVE, @@ -65,7 +66,7 @@ static void device_init(Unit *u) { /* In contrast to all other unit types we timeout jobs waiting * for devices by default. This is because they otherwise wait - * indefinetely for plugged in devices, something which cannot + * indefinitely for plugged in devices, something which cannot * happen for the other units since their operations time out * anyway. */ d->meta.job_timeout = DEFAULT_TIMEOUT_USEC; @@ -526,7 +527,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); @@ -542,7 +543,7 @@ void device_fd_event(Manager *m, int events) { if (!(dev = udev_monitor_receive_device(m->udev_monitor))) { /* * libudev might filter-out devices which pass the bloom filter, - * so getting NULL here is not neccessarily an error + * so getting NULL here is not necessarily an error */ return; } @@ -552,7 +553,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;