Commit f4af1671 authored by Bartosz Golaszewski's avatar Bartosz Golaszewski
Browse files

gpio: sysfs: use cleanup guards for the sysfs_lock mutex



Shrink the code and remove some goto labels by using guards around the
sysfs_lock mutex.

Reviewed-by: default avatarKent Gibson <warthog618@gmail.com>
Link: https://lore.kernel.org/r/20241031-gpio-notify-sysfs-v4-2-142021c2195c@linaro.org


Signed-off-by: default avatarBartosz Golaszewski <bartosz.golaszewski@linaro.org>
parent d99c980c
Loading
Loading
Loading
Loading
+22 −33
Original line number Diff line number Diff line
@@ -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);

	scoped_guard(mutex, &sysfs_lock) {
		if (!test_bit(FLAG_EXPORT, &desc->flags))
		goto err_unlock;
			return;

		dev = class_find_device(&gpio_class, NULL, desc, match_export);
		if (!dev)
		goto err_unlock;
			return;

		data = dev_get_drvdata(dev);

		clear_bit(FLAG_EXPORT, &desc->flags);

		device_unregister(dev);

		/*
	 * Release irq after deregistration to prevent race with edge_store.
		 * Release irq after deregistration to prevent race with
		 * edge_store.
		 */
		if (data->irq_flags)
			gpio_sysfs_free_irq(dev);

	mutex_unlock(&sysfs_lock);
	}

	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;
}