[systemd-commits] src/udev

Tom Gundersen tomegun at kemper.freedesktop.org
Fri Apr 24 11:39:47 PDT 2015


 src/udev/udevd.c |   11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

New commits:
commit b66f29a1eaaa001b9bdeac7609f84c71b2e48f21
Author: Tom Gundersen <teg at jklm.no>
Date:   Fri Apr 24 20:36:02 2015 +0200

    udevd: worker - log if worker result cannot be sent
    
    If the main daemon is not notified about a worker finishing an event
    the refcounting of the worker struct will be wrong, and we will lose
    track of the number of children we have to wait for.
    
    This should not happen, but if it does we better complain loudly about
    it. Worst case udev will wait for 30 seconsd at shutdown waiting for
    nonexistent workers.

diff --git a/src/udev/udevd.c b/src/udev/udevd.c
index 339e9c4..365bb00 100644
--- a/src/udev/udevd.c
+++ b/src/udev/udevd.c
@@ -255,7 +255,7 @@ static void worker_new(struct event *event) {
                         struct udev_event *udev_event;
                         struct worker_message msg;
                         int fd_lock = -1;
-                        int err = 0;
+                        int err = 0, r;
 
                         log_debug("seq %llu running", udev_device_get_seqnum(dev));
                         udev_event = udev_event_new(dev);
@@ -328,12 +328,15 @@ static void worker_new(struct event *event) {
                         udev_monitor_send_device(worker_monitor, NULL, dev);
 
 skip:
+                        log_debug("seq %llu processed with %i", udev_device_get_seqnum(dev), err);
+
                         /* send udevd the result of the event execution */
                         memzero(&msg, sizeof(struct worker_message));
                         msg.exitcode = err;
-                        send(worker_watch[WRITE_END], &msg, sizeof(struct worker_message), 0);
-
-                        log_debug("seq %llu processed with %i", udev_device_get_seqnum(dev), err);
+                        r = send(worker_watch[WRITE_END], &msg, sizeof(struct worker_message), 0);
+                        if (r < 0)
+                                log_error_errno(errno, "failed to send result of seq %llu to main daemon: %m",
+                                                udev_device_get_seqnum(dev));
 
                         udev_device_unref(dev);
                         dev = NULL;



More information about the systemd-commits mailing list