diff --git a/src/udev/udev-manager.c b/src/udev/udev-manager.c index 8f96cad659..0c59c172e0 100644 --- a/src/udev/udev-manager.c +++ b/src/udev/udev-manager.c @@ -852,16 +852,17 @@ static int event_queue_insert(Manager *manager, sd_device *dev) { .state = EVENT_QUEUED, }; - if (!manager->events) { + LIST_APPEND(event, manager->events, event); + log_device_uevent(dev, "Device is queued"); + + if (!manager->queue_file_created) { r = touch("/run/udev/queue"); if (r < 0) log_warning_errno(r, "Failed to touch /run/udev/queue, ignoring: %m"); + else + manager->queue_file_created = true; } - LIST_APPEND(event, manager->events, event); - - log_device_uevent(dev, "Device is queued"); - return 0; } @@ -1155,13 +1156,12 @@ static int manager_unlink_queue_file(Manager *manager) { /* There are no queued events. Let's remove /run/udev/queue and clean up the idle processes. */ if (unlink("/run/udev/queue") < 0) { - if (errno == ENOENT) - return 0; + if (errno != ENOENT) + return log_warning_errno(errno, "Failed to unlink /run/udev/queue: %m"); + } else + log_debug("No events are queued, removed /run/udev/queue."); - return log_warning_errno(errno, "Failed to unlink /run/udev/queue: %m"); - } - - log_debug("No events are queued, removed /run/udev/queue."); + manager->queue_file_created = false; return 0; } diff --git a/src/udev/udev-manager.h b/src/udev/udev-manager.h index 9526265154..875f6f955a 100644 --- a/src/udev/udev-manager.h +++ b/src/udev/udev-manager.h @@ -61,6 +61,7 @@ typedef struct Manager { UdevConfig config_by_control; UdevConfig config; + bool queue_file_created; bool stop_exec_queue; bool exit; } Manager;