summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkay.sievers@vrfy.org <kay.sievers@vrfy.org>2005-02-14 01:46:05 +0100
committerGreg KH <gregkh@suse.de>2005-04-26 23:36:12 -0700
commite57e7bc10811fa87e5775012da9e9b2fb67099c3 (patch)
tree50b1c076b5040e2e87fc2a3805d73b010f2835be
parent03a9875bc3ed3c0da226c31e6fe2590a862f6bfe (diff)
[PATCH] namedev: execute PROGRAM only once and not possibly for every physical device
-rw-r--r--namedev.c73
1 files changed, 35 insertions, 38 deletions
diff --git a/namedev.c b/namedev.c
index c8e24db548..42e8032be5 100644
--- a/namedev.c
+++ b/namedev.c
@@ -604,6 +604,7 @@ static int match_rule(struct udevice *udev, struct config_device *dev,
dbg(FIELD_SUBSYSTEM " matches");
}
+ /* walk up the chain of physical devices and find a match */
while (1) {
/* check for matching driver */
if (dev->driver[0] != '\0') {
@@ -612,9 +613,8 @@ static int match_rule(struct udevice *udev, struct config_device *dev,
if (strcmp_pattern(dev->driver, sysfs_device->driver_name) != 0) {
dbg(FIELD_DRIVER " is not matching");
goto try_parent;
- } else {
- dbg(FIELD_DRIVER " matches");
}
+ dbg(FIELD_DRIVER " matches");
}
/* check for matching bus value */
@@ -638,9 +638,8 @@ static int match_rule(struct udevice *udev, struct config_device *dev,
if (match_id(dev, class_dev, sysfs_device) != 0) {
dbg(FIELD_ID " is not matching");
goto try_parent;
- } else {
- dbg(FIELD_ID " matches");
}
+ dbg(FIELD_ID " matches");
}
/* check for matching place of device */
@@ -649,9 +648,8 @@ static int match_rule(struct udevice *udev, struct config_device *dev,
if (match_place(dev, class_dev, sysfs_device) != 0) {
dbg(FIELD_PLACE " is not matching");
goto try_parent;
- } else {
- dbg(FIELD_PLACE " matches");
}
+ dbg(FIELD_PLACE " matches");
}
/* check for matching sysfs pairs */
@@ -660,41 +658,12 @@ static int match_rule(struct udevice *udev, struct config_device *dev,
if (match_sysfs_pairs(dev, class_dev, sysfs_device) != 0) {
dbg(FIELD_SYSFS " is not matching");
goto try_parent;
- } else {
- dbg(FIELD_SYSFS " matches");
- }
- }
-
- /* execute external program */
- if (dev->program[0] != '\0') {
- char program[PROGRAM_SIZE];
-
- dbg("check " FIELD_PROGRAM);
- strfieldcpy(program, dev->program);
- apply_format(udev, program, sizeof(program), class_dev, sysfs_device);
- if (execute_program(udev, program, udev->program_result, NAME_SIZE) != 0) {
- dbg(FIELD_PROGRAM " returned nonzero");
- goto try_parent;
- } else {
- dbg(FIELD_PROGRAM " returned successful");
}
+ dbg(FIELD_SYSFS " matches");
}
- /* check for matching result of external program */
- if (dev->result[0] != '\0') {
- dbg("check for " FIELD_RESULT " dev->result='%s', udev->program_result='%s'",
- dev->result, udev->program_result);
- if (strcmp_pattern(dev->result, udev->program_result) != 0) {
- dbg(FIELD_RESULT " is not matching");
- goto try_parent;
- } else {
- dbg(FIELD_RESULT " matches");
- }
- }
-
- /* we matched */
- return 0;
-
+ /* found matching physical device */
+ break;
try_parent:
dbg("try parent sysfs device");
sysfs_device = sysfs_get_device_parent(sysfs_device);
@@ -704,6 +673,34 @@ try_parent:
dbg("sysfs_device->bus_id='%s'", sysfs_device->bus_id);
}
+ /* execute external program */
+ if (dev->program[0] != '\0') {
+ char program[PROGRAM_SIZE];
+
+ dbg("check " FIELD_PROGRAM);
+ strfieldcpy(program, dev->program);
+ apply_format(udev, program, sizeof(program), class_dev, sysfs_device);
+ if (execute_program(udev, program, udev->program_result, NAME_SIZE) != 0) {
+ dbg(FIELD_PROGRAM " returned nonzero");
+ goto try_parent;
+ }
+ dbg(FIELD_PROGRAM " returned successful");
+ }
+
+ /* check for matching result of external program */
+ if (dev->result[0] != '\0') {
+ dbg("check for " FIELD_RESULT " dev->result='%s', udev->program_result='%s'",
+ dev->result, udev->program_result);
+ if (strcmp_pattern(dev->result, udev->program_result) != 0) {
+ dbg(FIELD_RESULT " is not matching");
+ goto try_parent;
+ }
+ dbg(FIELD_RESULT " matches");
+ }
+
+ /* rule matches */
+ return 0;
+
exit:
return -1;
}