]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
udevd: explicitly read out uevents we create ourselves
authorTom Gundersen <teg@jklm.no>
Tue, 12 May 2015 14:51:31 +0000 (16:51 +0200)
committerTom Gundersen <teg@jklm.no>
Tue, 12 May 2015 15:06:21 +0000 (17:06 +0200)
Rather than skippling ctrl handling whenever we have handlede inotify events
(and hence may have synthesized a 'change' event), just call the uevent
handling explicitly from on_inotify() so that the event queue is up-to-date.

src/udev/udevd.c

index 65f4fe6a457ddaa4ea3c75697b6c4c8bf1d09690..8528f7147b535fffc99ea5ed28d90c3d6c7c88f6 100644 (file)
@@ -910,9 +910,16 @@ static int on_inotify(sd_event_source *s, int fd, uint32_t revents, void *userda
                         continue;
 
                 log_debug("inotify event: %x for %s", e->mask, udev_device_get_devnode(dev));
-                if (e->mask & IN_CLOSE_WRITE)
+                if (e->mask & IN_CLOSE_WRITE) {
                         synthesize_change(dev);
-                else if (e->mask & IN_IGNORED)
+
+                        /* settle might be waiting on us to determine the queue
+                         * state. If we just handled an inotify event, we might have
+                         * generated a "change" event, but we won't have queued up
+                         * the resultant uevent yet. Do that.
+                         */
+                        on_uevent(NULL, -1, 0, monitor);
+                } else if (e->mask & IN_IGNORED)
                         udev_watch_end(udev, dev);
         }
 
@@ -1565,22 +1572,9 @@ int main(int argc, char *argv[]) {
                         continue;
 
                 /* device node watch */
-                if (is_inotify) {
+                if (is_inotify)
                         on_inotify(NULL, fd_inotify, 0, udev);
 
-                        /*
-                         * settle might be waiting on us to determine the queue
-                         * state. If we just handled an inotify event, we might have
-                         * generated a "change" event, but we won't have queued up
-                         * the resultant uevent yet.
-                         *
-                         * Before we go ahead and potentially tell settle that the
-                         * queue is empty, lets loop one more time to update the
-                         * queue state again before deciding.
-                         */
-                        continue;
-                }
-
                 /* tell settle that we are busy or idle, this needs to be before the
                  * PING handling
                  */