Merge tag 'iwlwifi-next-for-kalle-2014-12-30' of https://git.kernel.org/pub/scm/linux...
[cascardo/linux.git] / drivers / leds / led-triggers.c
index c3734f1..e8b1120 100644 (file)
@@ -37,6 +37,14 @@ ssize_t led_trigger_store(struct device *dev, struct device_attribute *attr,
        char trigger_name[TRIG_NAME_MAX];
        struct led_trigger *trig;
        size_t len;
+       int ret = count;
+
+       mutex_lock(&led_cdev->led_access);
+
+       if (led_sysfs_is_disabled(led_cdev)) {
+               ret = -EBUSY;
+               goto unlock;
+       }
 
        trigger_name[sizeof(trigger_name) - 1] = '\0';
        strncpy(trigger_name, buf, sizeof(trigger_name) - 1);
@@ -47,7 +55,7 @@ ssize_t led_trigger_store(struct device *dev, struct device_attribute *attr,
 
        if (!strcmp(trigger_name, "none")) {
                led_trigger_remove(led_cdev);
-               return count;
+               goto unlock;
        }
 
        down_read(&triggers_list_lock);
@@ -58,12 +66,14 @@ ssize_t led_trigger_store(struct device *dev, struct device_attribute *attr,
                        up_write(&led_cdev->trigger_lock);
 
                        up_read(&triggers_list_lock);
-                       return count;
+                       goto unlock;
                }
        }
        up_read(&triggers_list_lock);
 
-       return -EINVAL;
+unlock:
+       mutex_unlock(&led_cdev->led_access);
+       return ret;
 }
 EXPORT_SYMBOL_GPL(led_trigger_store);