From d5f7f864605262d432c7dfeb09d785f7c38463a4 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sun, 22 Dec 2024 00:14:52 +0900 Subject: [PATCH] udev: make worker event source take file descriptor No functional change, just refactoring. (cherry picked from commit 77eb6f73053a71ddd7e9156a409b138eb87c4cd6) Resolves: RHEL-75774 --- src/udev/udev-manager.c | 27 +++++++++++++++++++++------ src/udev/udev-manager.h | 2 +- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/udev/udev-manager.c b/src/udev/udev-manager.c index 83b0a90ccf..1768da5a38 100644 --- a/src/udev/udev-manager.c +++ b/src/udev/udev-manager.c @@ -144,7 +144,7 @@ Manager* manager_free(Manager *manager) { event_queue_cleanup(manager, EVENT_UNDEF); safe_close(manager->inotify_fd); - safe_close_pair(manager->worker_watch); + safe_close(manager->worker_notify_fd); sd_device_monitor_unref(manager->monitor); udev_ctrl_unref(manager->ctrl); @@ -406,7 +406,7 @@ static int worker_spawn(Manager *manager, Event *event) { .monitor = TAKE_PTR(worker_monitor), .properties = TAKE_PTR(manager->properties), .rules = TAKE_PTR(manager->rules), - .pipe_fd = TAKE_FD(manager->worker_watch[WRITE_END]), + .pipe_fd = TAKE_FD(manager->worker_notify_fd), .inotify_fd = TAKE_FD(manager->inotify_fd), .config = manager->config, }; @@ -1122,7 +1122,7 @@ Manager* manager_new(void) { *manager = (Manager) { .inotify_fd = -EBADF, - .worker_watch = EBADF_PAIR, + .worker_notify_fd = -EBADF, .config_by_udev_conf = UDEV_CONFIG_INIT, .config_by_command = UDEV_CONFIG_INIT, .config_by_kernel = UDEV_CONFIG_INIT, @@ -1320,24 +1320,39 @@ static int manager_start_inotify(Manager *manager) { } static int manager_start_worker_event(Manager *manager) { + _cleanup_(sd_event_source_unrefp) sd_event_source *s = NULL; + _cleanup_close_pair_ int pair[2] = EBADF_PAIR; int r; assert(manager); assert(manager->event); /* unnamed socket from workers to the main daemon */ - r = socketpair(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0, manager->worker_watch); + r = socketpair(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0, pair); if (r < 0) return log_error_errno(errno, "Failed to create socketpair for communicating with workers: %m"); - r = setsockopt_int(manager->worker_watch[READ_END], SOL_SOCKET, SO_PASSCRED, true); + r = setsockopt_int(pair[READ_END], SOL_SOCKET, SO_PASSCRED, true); if (r < 0) return log_error_errno(r, "Failed to enable SO_PASSCRED: %m"); - r = sd_event_add_io(manager->event, NULL, manager->worker_watch[READ_END], EPOLLIN, on_worker, manager); + r = sd_event_add_io(manager->event, &s, pair[READ_END], EPOLLIN, on_worker, manager); if (r < 0) return log_error_errno(r, "Failed to create worker event source: %m"); + (void) sd_event_source_set_description(s, "manager-worker-event"); + + r = sd_event_source_set_io_fd_own(s, true); + if (r < 0) + return log_error_errno(r, "Failed to make worker event source own file descriptor: %m"); + + TAKE_FD(pair[READ_END]); + + r = sd_event_source_set_floating(s, true); + if (r < 0) + return log_error_errno(r, "Failed to make worker event source floating: %m"); + + manager->worker_notify_fd = TAKE_FD(pair[WRITE_END]); return 0; } diff --git a/src/udev/udev-manager.h b/src/udev/udev-manager.h index 05f9a8b709..2690d59bf3 100644 --- a/src/udev/udev-manager.h +++ b/src/udev/udev-manager.h @@ -28,7 +28,7 @@ typedef struct Manager { sd_device_monitor *monitor; UdevCtrl *ctrl; - int worker_watch[2]; + int worker_notify_fd; /* used by udev-watch */ int inotify_fd;