]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-device-enumerator: check sysname earlier
authorYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 8 Sep 2022 19:26:15 +0000 (04:26 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 9 Sep 2022 12:16:32 +0000 (21:16 +0900)
src/libsystemd/sd-device/device-enumerator.c

index 66845c43a113a618411420368d211afda49a3907..3c57cc2f8dae9234b8aeec25569f029020fad5db 100644 (file)
@@ -837,7 +837,7 @@ static int enumerator_scan_devices_tags(sd_device_enumerator *enumerator) {
         return r;
 }
 
-static int parent_add_child(sd_device_enumerator *enumerator, const char *path) {
+static int parent_add_child(sd_device_enumerator *enumerator, const char *path, MatchFlag flags) {
         _cleanup_(sd_device_unrefp) sd_device *device = NULL;
         int r;
 
@@ -848,7 +848,7 @@ static int parent_add_child(sd_device_enumerator *enumerator, const char *path)
         else if (r < 0)
                 return r;
 
-        r = test_matches(enumerator, device, MATCH_ALL & (~MATCH_PARENT));
+        r = test_matches(enumerator, device, flags);
         if (r <= 0)
                 return r;
 
@@ -884,9 +884,13 @@ static int parent_crawl_children(sd_device_enumerator *enumerator, const char *p
                 if (!child)
                         return -ENOMEM;
 
-                k = parent_add_child(enumerator, child);
-                if (k < 0)
-                        r = k;
+                /* Let's check sysname filter earlier. The other tests require the sd-device object created
+                 * from the path, thus much costly. */
+                if (match_sysname(enumerator, de->d_name)) {
+                        k = parent_add_child(enumerator, child, MATCH_ALL & (~(MATCH_SYSNAME|MATCH_PARENT)));
+                        if (k < 0)
+                                r = k;
+                }
 
                 k = set_ensure_consume(stack, &path_hash_ops_free, TAKE_PTR(child));
                 if (k < 0)
@@ -904,7 +908,7 @@ static int enumerator_scan_devices_children(sd_device_enumerator *enumerator) {
         assert(enumerator);
 
         SET_FOREACH(path, enumerator->match_parent) {
-                k = parent_add_child(enumerator, path);
+                k = parent_add_child(enumerator, path, MATCH_ALL & (~MATCH_PARENT));
                 if (k < 0)
                         r = k;