diff options
Diffstat (limited to 'udev')
-rw-r--r-- | udev/lib/libudev-device-db-write.c | 22 | ||||
-rw-r--r-- | udev/udev-event.c | 7 |
2 files changed, 24 insertions, 5 deletions
diff --git a/udev/lib/libudev-device-db-write.c b/udev/lib/libudev-device-db-write.c index 34095e5682..11e0ab5f60 100644 --- a/udev/lib/libudev-device-db-write.c +++ b/udev/lib/libudev-device-db-write.c @@ -56,11 +56,21 @@ int udev_device_update_db(struct udev_device *udev_device) udev_list_entry_foreach(list_entry, udev_device_get_properties_list_entry(udev_device)) if (udev_list_entry_get_flag(list_entry)) goto file; - if (udev_device_get_num_fake_partitions(udev_device)) + if (udev_device_get_num_fake_partitions(udev_device) != 0) goto file; if (udev_device_get_ignore_remove(udev_device)) goto file; - /* try not to waste tmpfs memory; store values, if they fit, in a symlink target */ + if (udev_device_get_devlink_priority(udev_device) != 0) + goto file; + if (udev_device_get_event_timeout(udev_device) >= 0) + goto file; + if (udev_device_get_devnode(udev_device) == NULL) + goto out; + + /* + * if we have only the node and symlinks to store, try not to waste + * tmpfs memory -- store values, if they fit, in a symlink target + */ util_strlcpy(target, &udev_device_get_devnode(udev_device)[devlen], sizeof(target)); udev_list_entry_foreach(list_entry, udev_device_get_devlinks_list_entry(udev_device)) { size_t len; @@ -86,9 +96,11 @@ file: } info(udev, "created db file for '%s' in '%s'\n", udev_device_get_devpath(udev_device), filename); - fprintf(f, "N:%s\n", &udev_device_get_devnode(udev_device)[devlen]); - udev_list_entry_foreach(list_entry, udev_device_get_devlinks_list_entry(udev_device)) - fprintf(f, "S:%s\n", &udev_list_entry_get_name(list_entry)[devlen]); + if (udev_device_get_devnode(udev_device) != NULL) { + fprintf(f, "N:%s\n", &udev_device_get_devnode(udev_device)[devlen]); + udev_list_entry_foreach(list_entry, udev_device_get_devlinks_list_entry(udev_device)) + fprintf(f, "S:%s\n", &udev_list_entry_get_name(list_entry)[devlen]); + } if (udev_device_get_devlink_priority(udev_device) != 0) fprintf(f, "L:%u\n", udev_device_get_devlink_priority(udev_device)); if (udev_device_get_event_timeout(udev_device) >= 0) diff --git a/udev/udev-event.c b/udev/udev-event.c index bc692392d2..93a65e7352 100644 --- a/udev/udev-event.c +++ b/udev/udev-event.c @@ -611,6 +611,7 @@ int udev_event_execute_rules(struct udev_event *event, struct udev_rules *rules) /* add netif */ if (strcmp(udev_device_get_subsystem(dev), "net") == 0 && strcmp(udev_device_get_action(dev), "add") == 0) { dbg(event->udev, "netif add '%s'\n", udev_device_get_devpath(dev)); + udev_device_delete_db(dev); udev_rules_apply_to_event(rules, event); if (event->ignore_device) { @@ -644,6 +645,7 @@ int udev_event_execute_rules(struct udev_event *event, struct udev_rules *rules) info(event->udev, "changed devpath to '%s'\n", udev_device_get_devpath(dev)); } } + udev_device_update_db(dev); goto exit; } @@ -684,6 +686,11 @@ int udev_event_execute_rules(struct udev_event *event, struct udev_rules *rules) udev_rules_apply_to_event(rules, event); if (event->ignore_device) info(event->udev, "device event will be ignored\n"); + + if (strcmp(udev_device_get_action(dev), "remove") != 0) + udev_device_update_db(dev); + else + udev_device_delete_db(dev); exit: return err; } |