chiark / gitweb /
networkd: split runtime config dir from state dir
[elogind.git] / src / udev / udevd.c
index aecd208d40cd99f46a07a5d10d4faa52645d313d..6c051049741b4c03b1f55690b887d44e76891bfa 100644 (file)
@@ -267,7 +267,7 @@ static void worker_new(struct event *event)
                         struct udev_event *udev_event;
                         struct worker_message msg;
                         int fd_lock = -1;
-                        int err;
+                        int err = 0;
 
                         log_debug("seq %llu running", udev_device_get_seqnum(dev));
                         udev_event = udev_event_new(dev);
@@ -290,7 +290,19 @@ static void worker_new(struct event *event)
                          * acquired the lock, the external process will block until
                          * udev has finished its event handling.
                          */
-                        if (streq_ptr("block", udev_device_get_subsystem(dev))) {
+
+                        /*
+                         * <kabi_> since we make check - device seems unused - we try
+                         *         ioctl to deactivate - and device is found to be opened
+                         * <kay> sure, you try to take a write lock
+                         * <kay> if you get it udev is out
+                         * <kay> if you can't get it, udev is busy
+                         * <kabi_> we cannot deactivate openned device  (as it is in-use)
+                         * <kay> maybe we should just exclude dm from that thing entirely
+                         * <kabi_> IMHO this sounds like a good plan for this moment
+                         */
+                        if (streq_ptr("block", udev_device_get_subsystem(dev)) &&
+                            !startswith("dm-", udev_device_get_sysname(dev))) {
                                 struct udev_device *d = dev;
 
                                 if (streq_ptr("partition", udev_device_get_devtype(d)))
@@ -301,25 +313,24 @@ static void worker_new(struct event *event)
                                         if (fd_lock >= 0 && flock(fd_lock, LOCK_SH|LOCK_NB) < 0) {
                                                 log_debug("Unable to flock(%s), skipping event handling: %m", udev_device_get_devnode(d));
                                                 err = -EWOULDBLOCK;
+                                                fd_lock = safe_close(fd_lock);
                                                 goto skip;
                                         }
                                 }
                         }
 
                         /* apply rules, create node, symlinks */
-                        err = udev_event_execute_rules(udev_event, rules, &sigmask_orig);
+                        udev_event_execute_rules(udev_event, rules, &sigmask_orig);
 
-                        if (err == 0)
-                                udev_event_execute_run(udev_event, &sigmask_orig);
+                        udev_event_execute_run(udev_event, &sigmask_orig);
 
                         /* apply/restore inotify watch */
-                        if (err == 0 && udev_event->inotify_watch) {
+                        if (udev_event->inotify_watch) {
                                 udev_watch_begin(udev, dev);
                                 udev_device_update_db(dev);
                         }
 
-                        if (fd_lock >= 0)
-                                close(fd_lock);
+                        safe_close(fd_lock);
 
                         /* send processed event back to libudev listeners */
                         udev_monitor_send_device(worker_monitor, NULL, dev);
@@ -378,10 +389,8 @@ skip:
                 }
 out:
                 udev_device_unref(dev);
-                if (fd_signal >= 0)
-                        close(fd_signal);
-                if (fd_ep >= 0)
-                        close(fd_ep);
+                safe_close(fd_signal);
+                safe_close(fd_ep);
                 close(fd_inotify);
                 close(worker_watch[WRITE_END]);
                 udev_rules_unref(rules);