gpiolib: sysfs: Move kstrtox() calls outside of the mutex lock
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Wed, 9 Feb 2022 11:31:16 +0000 (13:31 +0200)
committerBartosz Golaszewski <brgl@bgdev.pl>
Wed, 16 Feb 2022 15:02:34 +0000 (16:02 +0100)
In a few places we perform kstrtox() operations under mutex that
do not require any locking. Move them outside of the mutex locks.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Bartosz Golaszewski <brgl@bgdev.pl>
drivers/gpio/gpiolib-sysfs.c

index 7fe3819..5f26bee 100644 (file)
@@ -121,24 +121,18 @@ static ssize_t value_store(struct device *dev,
 {
        struct gpiod_data *data = dev_get_drvdata(dev);
        struct gpio_desc *desc = data->desc;
-       ssize_t status = 0;
+       ssize_t status;
+       long value;
+
+       status = kstrtol(buf, 0, &value);
 
        mutex_lock(&data->mutex);
 
        if (!test_bit(FLAG_IS_OUT, &desc->flags)) {
                status = -EPERM;
-       } else {
-               long            value;
-
-               if (size <= 2 && isdigit(buf[0]) &&
-                   (size == 1 || buf[1] == '\n'))
-                       value = buf[0] - '0';
-               else
-                       status = kstrtol(buf, 0, &value);
-               if (status == 0) {
-                       gpiod_set_value_cansleep(desc, value);
-                       status = size;
-               }
+       } else if (status == 0) {
+               gpiod_set_value_cansleep(desc, value);
+               status = size;
        }
 
        mutex_unlock(&data->mutex);
@@ -342,11 +336,13 @@ static ssize_t active_low_store(struct device *dev,
        ssize_t                 status;
        long                    value;
 
+       status = kstrtol(buf, 0, &value);
+       if (status)
+               return status;
+
        mutex_lock(&data->mutex);
 
-       status = kstrtol(buf, 0, &value);
-       if (status == 0)
-               status = gpio_sysfs_set_active_low(dev, value);
+       status = gpio_sysfs_set_active_low(dev, value);
 
        mutex_unlock(&data->mutex);