From 17b43e213bcf09024e56f649b57932567785f27c Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sat, 26 Apr 2025 15:53:48 +0900 Subject: [PATCH] udev: try again to create /run/udev/queue when queueing the next event This is mostly a paranoia, but if we failed to create /run/udev/queue for some reasons on queueing an event, previously we would never create the file until once the queue became empty. This makes in such case we try to create the file again when queueing the next event. --- src/udev/udev-manager.c | 22 +++++++++++----------- src/udev/udev-manager.h | 1 + 2 files changed, 12 insertions(+), 11 deletions(-) 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;