From: Yu Watanabe Date: Tue, 6 May 2025 17:32:56 +0000 (+0900) Subject: udev: split out device_broadcast_on_error() X-Git-Tag: v258-rc1~654^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f694a527ac22c60520ccae5442c1c4ac9bc32742;p=thirdparty%2Fsystemd.git udev: split out device_broadcast_on_error() --- diff --git a/src/udev/udev-error.c b/src/udev/udev-error.c index bc438dfaf8d..ad3a03384a5 100644 --- a/src/udev/udev-error.c +++ b/src/udev/udev-error.c @@ -1,8 +1,8 @@ /* SPDX-License-Identifier: GPL-2.0-or-later */ -#include - +#include "device-monitor-private.h" #include "device-private.h" +#include "device-util.h" #include "errno-list.h" #include "errno-util.h" #include "signal-util.h" @@ -54,3 +54,24 @@ int device_add_signal(sd_device *dev, int signo) { return r; } + +int device_broadcast_on_error(sd_device *dev, sd_device_monitor *monitor) { + int r; + + assert(dev); + assert(monitor); + + /* delete state from disk */ + (void) device_delete_db(dev); + (void) device_tag_index(dev, /* device_old = */ NULL, /* add = */ false); + + r = device_monitor_send(monitor, /* destination = */ NULL, dev); + if (r < 0) { + uint64_t seqnum = 0; + + (void) sd_device_get_seqnum(dev, &seqnum); + return log_device_warning_errno(dev, r, "Failed to broadcast event (SEQNUM=%"PRIu64") to libudev listeners: %m", seqnum); + } + + return 0; +} diff --git a/src/udev/udev-error.h b/src/udev/udev-error.h index c55b443d43b..bc38004ea18 100644 --- a/src/udev/udev-error.h +++ b/src/udev/udev-error.h @@ -6,3 +6,4 @@ int device_add_errno(sd_device *dev, int error); int device_add_exit_status(sd_device *dev, int status); int device_add_signal(sd_device *dev, int signo); +int device_broadcast_on_error(sd_device *dev, sd_device_monitor *monitor); diff --git a/src/udev/udev-manager.c b/src/udev/udev-manager.c index d883e0f6720..e01eef0aeb0 100644 --- a/src/udev/udev-manager.c +++ b/src/udev/udev-manager.c @@ -353,7 +353,6 @@ void manager_revert(Manager *manager) { static int on_sigchld(sd_event_source *s, const siginfo_t *si, void *userdata) { _cleanup_(worker_freep) Worker *worker = ASSERT_PTR(userdata); sd_device *dev = worker->event ? ASSERT_PTR(worker->event->dev) : NULL; - int r; assert(si); @@ -386,14 +385,7 @@ static int on_sigchld(sd_event_source *s, const siginfo_t *si, void *userdata) { assert_not_reached(); } - /* delete state from disk */ - device_delete_db(dev); - device_tag_index(dev, NULL, false); - - r = device_monitor_send(worker->manager->monitor, NULL, dev); - if (r < 0) - log_device_warning_errno(dev, r, "Failed to broadcast event to libudev listeners, ignoring: %m"); - + (void) device_broadcast_on_error(dev, worker->manager->monitor); return 0; }