[systemd-commits] 3 commits - src/libsystemd src/libudev src/udev

Tom Gundersen tomegun at kemper.freedesktop.org
Thu Apr 23 13:39:58 PDT 2015


 src/libsystemd/sd-device/device-internal.h |    1 +
 src/libsystemd/sd-device/device-private.c  |    6 ++++++
 src/libsystemd/sd-device/device-private.h  |    1 +
 src/libsystemd/sd-device/sd-device.c       |    8 ++++++--
 src/libudev/libudev-device-internal.h      |    3 +++
 src/libudev/libudev-device-private.c       |    6 ++++++
 src/libudev/libudev-device.c               |   12 +++++++++---
 src/libudev/libudev-private.h              |    1 +
 src/udev/udev-event.c                      |   12 ++++++------
 9 files changed, 39 insertions(+), 11 deletions(-)

New commits:
commit 107f2e2526d476c6cc9b81a690391c111027d641
Author: Tom Gundersen <teg at jklm.no>
Date:   Thu Apr 23 15:19:13 2015 +0200

    udevd: fix REMOVE handling
    
    This reverts b67f944. Lazy loading of device properties does not work for devices
    that are received over netlink, as these are sealed. Reinstate the unconditional
    loading of the device db.
    
    Reported by: Mantas Mikulėnas <grawity at gmail.com>.

diff --git a/src/libsystemd/sd-device/device-internal.h b/src/libsystemd/sd-device/device-internal.h
index 59ec1a6..b96441d 100644
--- a/src/libsystemd/sd-device/device-internal.h
+++ b/src/libsystemd/sd-device/device-internal.h
@@ -110,6 +110,7 @@ int device_new_aux(sd_device **ret);
 int device_add_property_aux(sd_device *device, const char *key, const char *value, bool db);
 int device_add_property_internal(sd_device *device, const char *key, const char *value);
 int device_read_uevent_file(sd_device *device);
+int device_read_db_aux(sd_device *device, bool force);
 
 int device_set_syspath(sd_device *device, const char *_syspath, bool verify);
 int device_set_ifindex(sd_device *device, const char *ifindex);
diff --git a/src/libsystemd/sd-device/device-private.c b/src/libsystemd/sd-device/device-private.c
index 9788df7..3cadedb 100644
--- a/src/libsystemd/sd-device/device-private.c
+++ b/src/libsystemd/sd-device/device-private.c
@@ -1100,3 +1100,9 @@ int device_delete_db(sd_device *device) {
 
         return 0;
 }
+
+int device_read_db_force(sd_device *device) {
+        assert(device);
+
+        return device_read_db_aux(device, true);
+}
diff --git a/src/libsystemd/sd-device/device-private.h b/src/libsystemd/sd-device/device-private.h
index f252481..49a7b66 100644
--- a/src/libsystemd/sd-device/device-private.h
+++ b/src/libsystemd/sd-device/device-private.h
@@ -61,3 +61,4 @@ int device_new_from_synthetic_event(sd_device **new_device, const char *syspath,
 int device_tag_index(sd_device *dev, sd_device *dev_old, bool add);
 int device_update_db(sd_device *device);
 int device_delete_db(sd_device *device);
+int device_read_db_force(sd_device *device);
diff --git a/src/libsystemd/sd-device/sd-device.c b/src/libsystemd/sd-device/sd-device.c
index 7a7b323..fd46229 100644
--- a/src/libsystemd/sd-device/sd-device.c
+++ b/src/libsystemd/sd-device/sd-device.c
@@ -1220,7 +1220,7 @@ int device_get_id_filename(sd_device *device, const char **ret) {
         return 0;
 }
 
-static int device_read_db(sd_device *device) {
+int device_read_db_aux(sd_device *device, bool force) {
         _cleanup_free_ char *db = NULL;
         char *path;
         const char *id, *value;
@@ -1237,7 +1237,7 @@ static int device_read_db(sd_device *device) {
                 INVALID_LINE,
         } state = PRE_KEY;
 
-        if (device->db_loaded || device->sealed)
+        if (device->db_loaded || (!force && device->sealed))
                 return 0;
 
         r = device_get_id_filename(device, &id);
@@ -1313,6 +1313,10 @@ static int device_read_db(sd_device *device) {
         return 0;
 }
 
+static int device_read_db(sd_device *device) {
+        return device_read_db_aux(device, false);
+}
+
 _public_ int sd_device_get_is_initialized(sd_device *device, int *initialized) {
         int r;
 
diff --git a/src/libudev/libudev-device-private.c b/src/libudev/libudev-device-private.c
index bb4d7e6..4b9c053 100644
--- a/src/libudev/libudev-device-private.c
+++ b/src/libudev/libudev-device-private.c
@@ -407,3 +407,9 @@ void udev_device_set_info_loaded(struct udev_device *udev_device) {
 
         device_seal(udev_device->device);
 }
+
+void udev_device_read_db(struct udev_device *udev_device) {
+        assert(udev_device);
+
+        device_read_db_force(udev_device->device);
+}
diff --git a/src/libudev/libudev-private.h b/src/libudev/libudev-private.h
index 32c5e19..cbe84aa 100644
--- a/src/libudev/libudev-private.h
+++ b/src/libudev/libudev-private.h
@@ -67,6 +67,7 @@ int udev_device_get_ifindex(struct udev_device *udev_device);
 void udev_device_set_info_loaded(struct udev_device *device);
 bool udev_device_get_db_persist(struct udev_device *udev_device);
 void udev_device_set_db_persist(struct udev_device *udev_device);
+void udev_device_read_db(struct udev_device *udev_device);
 
 /* libudev-device-private.c */
 int udev_device_update_db(struct udev_device *udev_device);
diff --git a/src/udev/udev-event.c b/src/udev/udev-event.c
index 978b218..2fa26a4 100644
--- a/src/udev/udev-event.c
+++ b/src/udev/udev-event.c
@@ -794,6 +794,10 @@ void udev_event_execute_rules(struct udev_event *event,
                 return;
 
         if (streq(udev_device_get_action(dev), "remove")) {
+                udev_device_read_db(dev);
+                udev_device_tag_index(dev, NULL, false);
+                udev_device_delete_db(dev);
+
                 if (major(udev_device_get_devnum(dev)) != 0)
                         udev_watch_end(event->udev, dev);
 
@@ -804,9 +808,6 @@ void udev_event_execute_rules(struct udev_event *event,
 
                 if (major(udev_device_get_devnum(dev)) != 0)
                         udev_node_remove(dev);
-
-                udev_device_delete_db(dev);
-                udev_device_tag_index(dev, NULL, false);
         } else {
                 event->dev_db = udev_device_clone_with_db(dev);
                 if (event->dev_db != NULL) {

commit 353f605867f9dac1eea4ad8ebaa92a004cbcd9e7
Author: Tom Gundersen <teg at jklm.no>
Date:   Fri Apr 17 15:46:37 2015 +0200

    udev: event - update tags before writing out db
    
    The old tags are read from the db when deciding which tags to clear,
    make sure we don't write out the new db before the old one has been
    read.

diff --git a/src/udev/udev-event.c b/src/udev/udev-event.c
index bda0638..978b218 100644
--- a/src/udev/udev-event.c
+++ b/src/udev/udev-event.c
@@ -877,12 +877,11 @@ void udev_event_execute_rules(struct udev_event *event,
                 udev_device_ensure_usec_initialized(event->dev, event->dev_db);
 
                 /* (re)write database file */
-                udev_device_update_db(dev);
                 udev_device_tag_index(dev, event->dev_db, true);
+                udev_device_update_db(dev);
                 udev_device_set_is_initialized(dev);
 
-                udev_device_unref(event->dev_db);
-                event->dev_db = NULL;
+                event->dev_db = udev_device_unref(event->dev_db);
         }
 }
 

commit 378f61ebef6d29efce8512402a73df880c7d960c
Author: Tom Gundersen <teg at jklm.no>
Date:   Wed Apr 22 19:01:50 2015 +0200

    libudev-device: fix lazy loading of devlinks, properties and tags
    
    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.

diff --git a/src/libudev/libudev-device-internal.h b/src/libudev/libudev-device-internal.h
index 3f93fda..aa36b8c 100644
--- a/src/libudev/libudev-device-internal.h
+++ b/src/libudev/libudev-device-internal.h
@@ -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;
 };
diff --git a/src/libudev/libudev-device.c b/src/libudev/libudev-device.c
index a55cd25..893d72c 100644
--- a/src/libudev/libudev-device.c
+++ b/src/libudev/libudev-device.c
@@ -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);
         }
 



More information about the systemd-commits mailing list