chiark / gitweb /
reset process priority before executing RUN+=
[elogind.git] / udev / udevd.c
index fe3352ceb513519afa20cbb8f976d44ad00fe633..77a14df7b07afba30589801bfc068ae8db9283f8 100644 (file)
@@ -168,7 +168,7 @@ static void event_queue_delete(struct event *event)
        udev_list_node_remove(&event->node);
 
        /* mark as failed, if "add" event returns non-zero */
-       if (event->exitcode != 0 && strcmp(udev_device_get_action(event->dev), "add") == 0)
+       if (event->exitcode != 0 && strcmp(udev_device_get_action(event->dev), "remove") != 0)
                udev_queue_export_device_failed(udev_queue_export, event->dev);
        else
                udev_queue_export_device_finished(udev_queue_export, event->dev);
@@ -360,7 +360,7 @@ static void worker_new(struct event *event)
        }
 }
 
-static void event_run(struct event *event)
+static void event_run(struct event *event, bool force)
 {
        struct udev_list_node *loop;
 
@@ -385,7 +385,7 @@ static void event_run(struct event *event)
                return;
        }
 
-       if (childs >= max_childs) {
+       if (!force && childs >= max_childs) {
                info(event->udev, "maximum number (%i) of childs reached\n", childs);
                return;
        }
@@ -420,7 +420,7 @@ static void event_queue_insert(struct udev_device *dev)
 
        /* run all events with a timeout set immediately */
        if (udev_device_get_timeout(dev) > 0) {
-               worker_new(event);
+               event_run(event, true);
                return;
        }
 }
@@ -552,7 +552,7 @@ static void events_start(struct udev *udev)
                        continue;
                }
 
-               event_run(event);
+               event_run(event, false);
        }
 }
 
@@ -685,14 +685,21 @@ static int handle_inotify(struct udev *udev)
 
                ev = (struct inotify_event *)(buf + pos);
                if (ev->len) {
-                       dbg(udev, "inotify event: %x for %s\n", ev->mask, ev->name);
+                       const char *s;
+
+                       info(udev, "inotify event: %x for %s\n", ev->mask, ev->name);
+                       s = strstr(ev->name, ".rules");
+                       if (s == NULL)
+                               continue;
+                       if (strlen(s) != strlen(".rules"))
+                               continue;
                        reload_config = true;
                        continue;
                }
 
                dev = udev_watch_lookup(udev, ev->wd);
                if (dev != NULL) {
-                       dbg(udev, "inotify event: %x for %s\n", ev->mask, udev_device_get_devnode(dev));
+                       info(udev, "inotify event: %x for %s\n", ev->mask, udev_device_get_devnode(dev));
                        if (ev->mask & IN_CLOSE_WRITE) {
                                char filename[UTIL_PATH_SIZE];
                                int fd;