do not stop rule processing when device node is no longer around

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.
This commit is contained in:
Kay Sievers 2012-01-29 05:37:39 +01:00
parent a3642381eb
commit e7f3289033
4 changed files with 20 additions and 14 deletions

12
NEWS
View file

@ -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.

View 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 */

View 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;
}

View 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 */