diff options
author | Sven Wegener <sven.wegener@stealer.net> | 2008-08-01 23:42:47 +0000 |
---|---|---|
committer | Sven Wegener <sven.wegener@stealer.net> | 2009-02-08 23:11:42 +0000 |
commit | 47118597a4729aa60825b90e56000e543e121338 (patch) | |
tree | cc2831e400e75afb6f3afde8d43ca6d88ebcfc7a | |
parent | 27421e211a39784694b597dbf35848b88363c248 (diff) |
leds: Enforce unique names for triggerstmp/leds/core
We should only allow triggers with unique names. Currently further triggers
registered with the same name won't be selectable via the sysfs trigger file,
because we use the first one found matching the requested name. For default
triggers we use the last registered trigger matching the requested name, which
is inconsistent. Also we should reject the none trigger as that is a special
one.
Signed-off-by: Sven Wegener <sven.wegener@stealer.net>
-rw-r--r-- | drivers/leds/led-triggers.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/drivers/leds/led-triggers.c b/drivers/leds/led-triggers.c index f910eaffe3a6..520d1afda1cc 100644 --- a/drivers/leds/led-triggers.c +++ b/drivers/leds/led-triggers.c @@ -143,8 +143,10 @@ void led_trigger_set_default(struct led_classdev *led_cdev) down_read(&triggers_list_lock); down_write(&led_cdev->trigger_lock); list_for_each_entry(trig, &trigger_list, next_trig) { - if (!strcmp(led_cdev->default_trigger, trig->name)) + if (!strcmp(led_cdev->default_trigger, trig->name)) { led_trigger_set(led_cdev, trig); + break; + } } up_write(&led_cdev->trigger_lock); up_read(&triggers_list_lock); @@ -156,12 +158,24 @@ EXPORT_SYMBOL_GPL(led_trigger_set_default); int led_trigger_register(struct led_trigger *trigger) { struct led_classdev *led_cdev; + struct led_trigger *ltrigger; rwlock_init(&trigger->leddev_list_lock); INIT_LIST_HEAD(&trigger->led_cdevs); + /* Reject the special none trigger */ + if (!strcmp(trigger->name, "none")) + return -EINVAL; + /* Add to the list of led triggers */ down_write(&triggers_list_lock); + list_for_each_entry(ltrigger, &trigger_list, next_trig) { + if (!strcmp(trigger->name, ltrigger->name)) { + up_write(&triggers_list_lock); + + return -EEXIST; + } + } list_add_tail(&trigger->next_trig, &trigger_list); up_write(&triggers_list_lock); |