chiark / gitweb /
do not stop rule processing when device node is no longer around
authorKay Sievers <kay.sievers@vrfy.org>
Sun, 29 Jan 2012 04:37:39 +0000 (05:37 +0100)
committerKay Sievers <kay.sievers@vrfy.org>
Sun, 29 Jan 2012 04:48:45 +0000 (05:48 +0100)
Device nodes might have been deleted again by the kernel before an
'add' or 'change' event is even started. We need to run all rules,
regardless of the state in /dev.

NEWS
src/udev-event.c
src/udev-node.c
src/udev.h

diff --git a/NEWS b/NEWS
index fa1edff696126f12ed541a337a5f7bdb9f11b7ad..281ed40569835d9ebc90ada324e00137c9a77826 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,15 @@
+udev 180
+========
+Fix for ID_PART_ENTRY_* property names, added by the blkid built-in. The
+fix is needed for udisk2 to operate properly.
+
+Fix for skipped rule execution when the kernel has removed the device
+node in /dev again, before the event was even started. The fix is needed
+to run device-mapper/LVM events properly.
+
+Fix for the man page installation, which was skipped when xsltproc was not
+installed.
+
 udev 179
 ========
 Bugfix for $name resolution, which broke at least some keymap handling.
index 7ecaf85536e26d7f5bb2769001dbc76d629d8592..45dd77ba2edbaef83457f6747527a08c626132bf 100644 (file)
@@ -894,7 +894,7 @@ int udev_event_execute_rules(struct udev_event *event, struct udev_rules *rules,
                 udev_rules_apply_to_event(rules, event, sigmask);
 
                 if (major(udev_device_get_devnum(dev)) != 0)
-                        err = udev_node_remove(dev);
+                        udev_node_remove(dev);
         } else {
                 event->dev_db = udev_device_new_from_syspath(event->udev, udev_device_get_syspath(dev));
                 if (event->dev_db != NULL) {
@@ -952,7 +952,7 @@ int udev_event_execute_rules(struct udev_event *event, struct udev_rules *rules,
                                 }
                         }
 
-                        err = udev_node_add(dev, event->mode, event->uid, event->gid);
+                        udev_node_add(dev, event->mode, event->uid, event->gid);
                 }
 
                 /* preserve old, or get new initialization timestamp */
index 8d7db7101b32e37d4a7142aa4a9039c5d5498170..7a01a479ee9fe117665d05b4368611b5de3cb44e 100644 (file)
@@ -327,7 +327,7 @@ out:
         return err;
 }
 
-int udev_node_add(struct udev_device *dev, mode_t mode, uid_t uid, gid_t gid)
+void udev_node_add(struct udev_device *dev, mode_t mode, uid_t uid, gid_t gid)
 {
         struct udev *udev = udev_device_get_udev(dev);
         char filename[UTIL_PATH_SIZE];
@@ -337,9 +337,8 @@ int udev_node_add(struct udev_device *dev, mode_t mode, uid_t uid, gid_t gid)
         info(udev, "handling device node '%s', devnum=%s, mode=%#o, uid=%d, gid=%d\n",
              udev_device_get_devnode(dev), udev_device_get_id_filename(dev), mode, uid, gid);
 
-        err = node_fixup(dev, mode, uid, gid);
-        if (err < 0)
-                goto exit;
+        if (node_fixup(dev, mode, uid, gid) < 0)
+                return;
 
         /* always add /dev/{block,char}/$major:$minor */
         snprintf(filename, sizeof(filename), "%s/%s/%u:%u",
@@ -356,11 +355,9 @@ int udev_node_add(struct udev_device *dev, mode_t mode, uid_t uid, gid_t gid)
                 else
                         link_update(dev, udev_list_entry_get_name(list_entry), 1);
         }
-exit:
-        return err;
 }
 
-int udev_node_remove(struct udev_device *dev)
+void udev_node_remove(struct udev_device *dev)
 {
         struct udev *udev = udev_device_get_udev(dev);
         struct udev_list_entry *list_entry;
@@ -368,7 +365,6 @@ int udev_node_remove(struct udev_device *dev)
         struct stat stats;
         struct udev_device *dev_check;
         char filename[UTIL_PATH_SIZE];
-        int err = 0;
 
         /* remove/update symlinks, remove symlinks from name index */
         udev_list_entry_foreach(list_entry, udev_device_get_devlinks_list_entry(dev))
@@ -380,6 +376,4 @@ int udev_node_remove(struct udev_device *dev)
                  strcmp(udev_device_get_subsystem(dev), "block") == 0 ? "block" : "char",
                  major(udev_device_get_devnum(dev)), minor(udev_device_get_devnum(dev)));
         unlink(filename);
-out:
-        return err;
 }
index 9ed6804fe71ecd453d2b43442452bded8d2f2be0..bc051c9b6574168073f48196bf1c8507f4c90663 100644 (file)
@@ -89,8 +89,8 @@ void udev_watch_end(struct udev *udev, struct udev_device *dev);
 struct udev_device *udev_watch_lookup(struct udev *udev, int wd);
 
 /* udev-node.c */
-int udev_node_add(struct udev_device *dev, mode_t mode, uid_t uid, gid_t gid);
-int udev_node_remove(struct udev_device *dev);
+void udev_node_add(struct udev_device *dev, mode_t mode, uid_t uid, gid_t gid);
+void udev_node_remove(struct udev_device *dev);
 void udev_node_update_old_links(struct udev_device *dev, struct udev_device *dev_old);
 
 /* udev-ctrl.c */