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);
* 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)))
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);
}
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);