103 lines
4.1 KiB
Diff
103 lines
4.1 KiB
Diff
From d5f7f864605262d432c7dfeb09d785f7c38463a4 Mon Sep 17 00:00:00 2001
|
|
From: Yu Watanabe <watanabe.yu+github@gmail.com>
|
|
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;
|