gpio: sysfs: use cleanup guards for the sysfs_lock mutex
authorBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Thu, 31 Oct 2024 20:01:52 +0000 (21:01 +0100)
committerBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Mon, 4 Nov 2024 07:56:19 +0000 (08:56 +0100)
Shrink the code and remove some goto labels by using guards around the
sysfs_lock mutex.

Reviewed-by: Kent Gibson <warthog618@gmail.com>
Link: https://lore.kernel.org/r/20241031-gpio-notify-sysfs-v4-2-142021c2195c@linaro.org
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
drivers/gpio/gpiolib-sysfs.c

index 8a402385e8b5c02d12d6b9bbd5cb1ca2049e0f40..8d726dcd6d79bda5d222ab5f19a5dc19d04a52ac 100644 (file)
@@ -575,24 +575,24 @@ int gpiod_export(struct gpio_desc *desc, bool direction_may_change)
 
        gdev = desc->gdev;
 
-       mutex_lock(&sysfs_lock);
+       guard(mutex)(&sysfs_lock);
 
        /* check if chip is being removed */
        if (!gdev->mockdev) {
                status = -ENODEV;
-               goto err_unlock;
+               goto err_clear_bit;
        }
 
        if (!test_bit(FLAG_REQUESTED, &desc->flags)) {
                gpiod_dbg(desc, "%s: unavailable (not requested)\n", __func__);
                status = -EPERM;
-               goto err_unlock;
+               goto err_clear_bit;
        }
 
        data = kzalloc(sizeof(*data), GFP_KERNEL);
        if (!data) {
                status = -ENOMEM;
-               goto err_unlock;
+               goto err_clear_bit;
        }
 
        data->desc = desc;
@@ -610,13 +610,11 @@ int gpiod_export(struct gpio_desc *desc, bool direction_may_change)
                goto err_free_data;
        }
 
-       mutex_unlock(&sysfs_lock);
        return 0;
 
 err_free_data:
        kfree(data);
-err_unlock:
-       mutex_unlock(&sysfs_lock);
+err_clear_bit:
        clear_bit(FLAG_EXPORT, &desc->flags);
        gpiod_dbg(desc, "%s: status %d\n", __func__, status);
        return status;
@@ -680,36 +678,28 @@ void gpiod_unexport(struct gpio_desc *desc)
                return;
        }
 
-       mutex_lock(&sysfs_lock);
-
-       if (!test_bit(FLAG_EXPORT, &desc->flags))
-               goto err_unlock;
-
-       dev = class_find_device(&gpio_class, NULL, desc, match_export);
-       if (!dev)
-               goto err_unlock;
-
-       data = dev_get_drvdata(dev);
-
-       clear_bit(FLAG_EXPORT, &desc->flags);
+       scoped_guard(mutex, &sysfs_lock) {
+               if (!test_bit(FLAG_EXPORT, &desc->flags))
+                       return;
 
-       device_unregister(dev);
+               dev = class_find_device(&gpio_class, NULL, desc, match_export);
+               if (!dev)
+                       return;
 
-       /*
-        * Release irq after deregistration to prevent race with edge_store.
-        */
-       if (data->irq_flags)
-               gpio_sysfs_free_irq(dev);
+               data = dev_get_drvdata(dev);
+               clear_bit(FLAG_EXPORT, &desc->flags);
+               device_unregister(dev);
 
-       mutex_unlock(&sysfs_lock);
+               /*
+                * Release irq after deregistration to prevent race with
+                * edge_store.
+                */
+               if (data->irq_flags)
+                       gpio_sysfs_free_irq(dev);
+       }
 
        put_device(dev);
        kfree(data);
-
-       return;
-
-err_unlock:
-       mutex_unlock(&sysfs_lock);
 }
 EXPORT_SYMBOL_GPL(gpiod_unexport);
 
@@ -750,9 +740,8 @@ int gpiochip_sysfs_register(struct gpio_device *gdev)
        if (IS_ERR(dev))
                return PTR_ERR(dev);
 
-       mutex_lock(&sysfs_lock);
+       guard(mutex)(&sysfs_lock);
        gdev->mockdev = dev;
-       mutex_unlock(&sysfs_lock);
 
        return 0;
 }