--- udev-orig/namedev.c Wed Apr 21 14:39:10 2004 +++ udev-025/namedev.c Sat May 8 06:33:04 2004 @@ -780,6 +780,7 @@ struct perm_device *perm; struct sysinfo info; char *pos; + int name_rule_found = 0; udev->mode = 0; @@ -805,7 +806,9 @@ strfieldcpy(udev->kernel_number, pos); dbg("kernel_number='%s'", udev->kernel_number); - /* look for a matching rule to apply */ + /* look for matching rules to apply */ + /* only the first matching NAME rule will be used */ + /* all matching SYMLINK rules will be used */ list_for_each_entry(dev, &config_device_list, node) { dbg("process rule"); if (match_rule(dev, class_dev, udev, sysfs_device) == 0) { @@ -827,6 +830,9 @@ strfieldcat(udev->symlink, temp); } + if (name_rule_found) + continue; + if (dev->name[0] != '\0') { /* apply all_partitions flag only at a main block device */ if (dev->partitions > 0 && @@ -836,18 +842,20 @@ info("configured rule in '%s' at line %i applied, '%s' becomes '%s'", dev->config_file, dev->config_line, udev->kernel_name, dev->name); strfieldcpy(udev->name, dev->name); - goto found; + name_rule_found = 1; } } } - /* no rule was found so we use the kernel name */ - strfieldcpy(udev->name, udev->kernel_name); - if (udev->type == 'n') - goto done; - else - goto perms; -found: + if (!name_rule_found) { + /* no NAME rule was found so we use the kernel name */ + strfieldcpy(udev->name, udev->kernel_name); + if (udev->type == 'n') + goto done; + else + goto perms; + } + apply_format(udev, udev->name, sizeof(udev->name), class_dev, sysfs_device); strfieldcpy(udev->config_file, dev->config_file); udev->config_line = dev->config_line;