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 8f96cad6590..0c59c172e0c 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; - - return log_warning_errno(errno, "Failed to unlink /run/udev/queue: %m"); - } + 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."); - 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 95262651543..875f6f955af 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; -- 2.47.3