]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
libudev-device: fix lazy loading of devlinks, properties and tags
authorTom Gundersen <teg@jklm.no>
Wed, 22 Apr 2015 17:01:50 +0000 (19:01 +0200)
committerTom Gundersen <teg@jklm.no>
Thu, 23 Apr 2015 20:31:25 +0000 (22:31 +0200)
If the underlying device has not read in the properties yet, the generation will be 0, so
make sure we trigger the reading at least once.

src/libudev/libudev-device-internal.h
src/libudev/libudev-device.c

index 3f93fda545b20f8f21542177865103f0d5cc56b8..aa36b8cb1229915a52acd353a13771c850cd4d8a 100644 (file)
@@ -47,6 +47,9 @@ struct udev_device {
         uint64_t tags_generation;
         struct udev_list devlinks;
         uint64_t devlinks_generation;
+        bool properties_read:1;
+        bool tags_read:1;
+        bool devlinks_read:1;
         struct udev_list sysattrs;
         bool sysattrs_read;
 };
index a55cd258f44eba113782aff513e6009e2cf9035e..893d72c19fcd9f5fd66233c363e664f0a8389f4e 100644 (file)
@@ -700,7 +700,8 @@ _public_ struct udev_list_entry *udev_device_get_devlinks_list_entry(struct udev
 {
         assert_return_errno(udev_device, NULL, EINVAL);
 
-        if (device_get_devlinks_generation(udev_device->device) != udev_device->devlinks_generation) {
+        if (device_get_devlinks_generation(udev_device->device) != udev_device->devlinks_generation ||
+            !udev_device->devlinks_read) {
                 const char *devlink;
 
                 udev_list_cleanup(&udev_device->devlinks);
@@ -708,6 +709,7 @@ _public_ struct udev_list_entry *udev_device_get_devlinks_list_entry(struct udev
                 FOREACH_DEVICE_DEVLINK(udev_device->device, devlink)
                         udev_list_entry_add(&udev_device->devlinks, devlink, NULL);
 
+                udev_device->devlinks_read = true;
                 udev_device->devlinks_generation = device_get_devlinks_generation(udev_device->device);
         }
 
@@ -730,7 +732,8 @@ _public_ struct udev_list_entry *udev_device_get_properties_list_entry(struct ud
 {
         assert_return_errno(udev_device, NULL, EINVAL);
 
-        if (device_get_properties_generation(udev_device->device) != udev_device->properties_generation) {
+        if (device_get_properties_generation(udev_device->device) != udev_device->properties_generation ||
+            !udev_device->properties_read) {
                 const char *key, *value;
 
                 udev_list_cleanup(&udev_device->properties);
@@ -738,6 +741,7 @@ _public_ struct udev_list_entry *udev_device_get_properties_list_entry(struct ud
                 FOREACH_DEVICE_PROPERTY(udev_device->device, key, value)
                         udev_list_entry_add(&udev_device->properties, key, value);
 
+                udev_device->properties_read = true;
                 udev_device->properties_generation = device_get_properties_generation(udev_device->device);
         }
 
@@ -918,7 +922,8 @@ _public_ struct udev_list_entry *udev_device_get_tags_list_entry(struct udev_dev
 {
         assert_return_errno(udev_device, NULL, EINVAL);
 
-        if (device_get_tags_generation(udev_device->device) != udev_device->tags_generation) {
+        if (device_get_tags_generation(udev_device->device) != udev_device->tags_generation ||
+            !udev_device->tags_read) {
                 const char *tag;
 
                 udev_list_cleanup(&udev_device->tags);
@@ -926,6 +931,7 @@ _public_ struct udev_list_entry *udev_device_get_tags_list_entry(struct udev_dev
                 FOREACH_DEVICE_TAG(udev_device->device, tag)
                         udev_list_entry_add(&udev_device->tags, tag, NULL);
 
+                udev_device->tags_read = true;
                 udev_device->tags_generation = device_get_tags_generation(udev_device->device);
         }