Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

gpiolib: sysfs: Move kstrtox() calls outside of the mutex lock

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>

authored by

Andy Shevchenko and committed by
Bartosz Golaszewski
6b3c1791 e28747da

+12 -16
+12 -16
drivers/gpio/gpiolib-sysfs.c
··· 121 121 { 122 122 struct gpiod_data *data = dev_get_drvdata(dev); 123 123 struct gpio_desc *desc = data->desc; 124 - ssize_t status = 0; 124 + ssize_t status; 125 + long value; 126 + 127 + status = kstrtol(buf, 0, &value); 125 128 126 129 mutex_lock(&data->mutex); 127 130 128 131 if (!test_bit(FLAG_IS_OUT, &desc->flags)) { 129 132 status = -EPERM; 130 - } else { 131 - long value; 132 - 133 - if (size <= 2 && isdigit(buf[0]) && 134 - (size == 1 || buf[1] == '\n')) 135 - value = buf[0] - '0'; 136 - else 137 - status = kstrtol(buf, 0, &value); 138 - if (status == 0) { 139 - gpiod_set_value_cansleep(desc, value); 140 - status = size; 141 - } 133 + } else if (status == 0) { 134 + gpiod_set_value_cansleep(desc, value); 135 + status = size; 142 136 } 143 137 144 138 mutex_unlock(&data->mutex); ··· 336 342 ssize_t status; 337 343 long value; 338 344 345 + status = kstrtol(buf, 0, &value); 346 + if (status) 347 + return status; 348 + 339 349 mutex_lock(&data->mutex); 340 350 341 - status = kstrtol(buf, 0, &value); 342 - if (status == 0) 343 - status = gpio_sysfs_set_active_low(dev, value); 351 + status = gpio_sysfs_set_active_low(dev, value); 344 352 345 353 mutex_unlock(&data->mutex); 346 354