Message ID | 20240205102229.42460-1-brgl@bgdev.pl |
---|---|
State | New |
Headers | show |
Series | gpio: remove GPIO device from the list unconditionally in error path | expand |
On Mon, Feb 5, 2024 at 11:22 AM Bartosz Golaszewski <brgl@bgdev.pl> wrote: > > From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> > > Since commit 48e1b4d369cf ("gpiolib: remove the GPIO device from the list > when it's unregistered") we remove the GPIO device entry from the global > list (used to order devices by their GPIO ranges) when unregistering the > chip, not when releasing the device. It will not happen when the last > reference is put anymore. This means, we need to remove it in error path > in gpiochip_add_data_with_key() unconditionally, without checking if the > device's .release() callback is set. > > Fixes: 48e1b4d369cf ("gpiolib: remove the GPIO device from the list when it's unregistered") > Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> > --- Queued for fixes. Bart
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index d50a786f8176..d52b340562ce 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -1005,15 +1005,15 @@ int gpiochip_add_data_with_key(struct gpio_chip *gc, void *data, err_free_gpiochip_mask: gpiochip_remove_pin_ranges(gc); gpiochip_free_valid_mask(gc); +err_remove_from_list: + spin_lock_irqsave(&gpio_lock, flags); + list_del(&gdev->list); + spin_unlock_irqrestore(&gpio_lock, flags); if (gdev->dev.release) { /* release() has been registered by gpiochip_setup_dev() */ gpio_device_put(gdev); goto err_print_message; } -err_remove_from_list: - spin_lock_irqsave(&gpio_lock, flags); - list_del(&gdev->list); - spin_unlock_irqrestore(&gpio_lock, flags); err_free_label: kfree_const(gdev->label); err_free_descs: