Patch "gpiolib: sysfs: Fix error handling on failed export" has been added to the 4.19-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    gpiolib: sysfs: Fix error handling on failed export

to the 4.19-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     gpiolib-sysfs-fix-error-handling-on-failed-export.patch
and it can be found in the queue-4.19 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit f4f3a864c1732fc91aa489f416d022837b0c813f
Author: Boerge Struempfel <boerge.struempfel@xxxxxxxxx>
Date:   Wed Nov 29 16:23:07 2023 +0100

    gpiolib: sysfs: Fix error handling on failed export
    
    [ Upstream commit 95dd1e34ff5bbee93a28ff3947eceaf6de811b1a ]
    
    If gpio_set_transitory() fails, we should free the GPIO again. Most
    notably, the flag FLAG_REQUESTED has previously been set in
    gpiod_request_commit(), and should be reset on failure.
    
    To my knowledge, this does not affect any current users, since the
    gpio_set_transitory() mainly returns 0 and -ENOTSUPP, which is converted
    to 0. However the gpio_set_transitory() function calles the .set_config()
    function of the corresponding GPIO chip and there are some GPIO drivers in
    which some (unlikely) branches return other values like -EPROBE_DEFER,
    and -EINVAL. In these cases, the above mentioned FLAG_REQUESTED would not
    be reset, which results in the pin being blocked until the next reboot.
    
    Fixes: e10f72bf4b3e ("gpio: gpiolib: Generalise state persistence beyond sleep")
    Signed-off-by: Boerge Struempfel <boerge.struempfel@xxxxxxxxx>
    Reviewed-by: Andy Shevchenko <andy@xxxxxxxxxx>
    Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/gpio/gpiolib-sysfs.c b/drivers/gpio/gpiolib-sysfs.c
index e0ccc79b239a5..7a8dfc36a6c15 100644
--- a/drivers/gpio/gpiolib-sysfs.c
+++ b/drivers/gpio/gpiolib-sysfs.c
@@ -495,14 +495,17 @@ static ssize_t export_store(struct class *class,
 	}
 
 	status = gpiod_set_transitory(desc, false);
-	if (!status) {
-		status = gpiod_export(desc, true);
-		if (status < 0)
-			gpiod_free(desc);
-		else
-			set_bit(FLAG_SYSFS, &desc->flags);
+	if (status) {
+		gpiod_free(desc);
+		goto done;
 	}
 
+	status = gpiod_export(desc, true);
+	if (status < 0)
+		gpiod_free(desc);
+	else
+		set_bit(FLAG_SYSFS, &desc->flags);
+
 done:
 	if (status)
 		pr_debug("%s: status %d\n", __func__, status);




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux