summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--test/udev-test.pl11
-rw-r--r--udev_rules.c6
-rw-r--r--udev_rules.h4
-rw-r--r--udev_rules_parse.c4
4 files changed, 23 insertions, 2 deletions
diff --git a/test/udev-test.pl b/test/udev-test.pl
index c7e1a9d47e..52c5c8d481 100644
--- a/test/udev-test.pl
+++ b/test/udev-test.pl
@@ -1115,11 +1115,20 @@ EOF
subsys => "block",
devpath => "/block/sda/sda1",
exp_name => "start-udev-root-end",
- option => "clean",
conf => <<EOF
BUS="scsi", KERNEL="sda1", NAME="start-%r-end"
EOF
},
+ {
+ desc => "last_rule option",
+ subsys => "block",
+ devpath => "/block/sda/sda1",
+ exp_name => "last",
+ conf => <<EOF
+BUS="scsi", KERNEL="sda1", SYMLINK="last", OPTIONS="last_rule"
+BUS="scsi", KERNEL="sda1", NAME="very-last"
+EOF
+ },
);
# set env
diff --git a/udev_rules.c b/udev_rules.c
index cbdf7de317..16f23ccb04 100644
--- a/udev_rules.c
+++ b/udev_rules.c
@@ -759,6 +759,12 @@ int udev_rules_get_name(struct udevice *udev, struct sysfs_class_device *class_d
break;
}
+
+ if (rule->last_rule) {
+ dbg("last rule to be applied");
+ break;
+ }
+
}
}
diff --git a/udev_rules.h b/udev_rules.h
index 71c510bce5..42552cfa41 100644
--- a/udev_rules.h
+++ b/udev_rules.h
@@ -43,6 +43,7 @@
#define FIELD_MODE "MODE"
#define FIELD_OPTIONS "OPTIONS"
+#define OPTION_LAST_RULE "last_rule"
#define OPTION_IGNORE_DEVICE "ignore_device"
#define OPTION_IGNORE_REMOVE "ignore_remove"
#define OPTION_PARTITIONS "all_partitions"
@@ -74,9 +75,10 @@ struct udev_rule {
char group[USER_SIZE];
mode_t mode;
- int partitions;
+ int last_rule;
int ignore_device;
int ignore_remove;
+ int partitions;
char config_file[PATH_SIZE];
int config_line;
diff --git a/udev_rules_parse.c b/udev_rules_parse.c
index 4f431decf5..f77f3db915 100644
--- a/udev_rules_parse.c
+++ b/udev_rules_parse.c
@@ -283,6 +283,10 @@ static int rules_parse(struct udevice *udev, const char *filename)
}
if (strcasecmp(temp2, FIELD_OPTIONS) == 0) {
+ if (strstr(temp3, OPTION_LAST_RULE) != NULL) {
+ dbg("last rule to be applied");
+ rule.last_rule = 1;
+ }
if (strstr(temp3, OPTION_IGNORE_DEVICE) != NULL) {
dbg("device should be ignored");
rule.ignore_device = 1;