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;
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;
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)
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;