mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-25 21:24:08 +08:00
gpiolib: fix reference leaks when removing GPIO chips still in use
After we remove a GPIO chip that still has some requested descriptors, gpiod_free_commit() will fail and we will never put the references to the GPIO device and the owning module in gpiod_free(). Rework this function to: - not warn on desc == NULL as this is a use-case on which most free functions silently return - put the references to desc->gdev and desc->gdev->owner unconditionally so that the release callback actually gets called when the remaining references are dropped by external GPIO users Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
This commit is contained in:
parent
20d9b3b5f2
commit
3386fb86ec
@ -2167,12 +2167,18 @@ static bool gpiod_free_commit(struct gpio_desc *desc)
|
||||
|
||||
void gpiod_free(struct gpio_desc *desc)
|
||||
{
|
||||
if (desc && desc->gdev && gpiod_free_commit(desc)) {
|
||||
module_put(desc->gdev->owner);
|
||||
gpio_device_put(desc->gdev);
|
||||
} else {
|
||||
/*
|
||||
* We must not use VALIDATE_DESC_VOID() as the underlying gdev->chip
|
||||
* may already be NULL but we still want to put the references.
|
||||
*/
|
||||
if (!desc)
|
||||
return;
|
||||
|
||||
if (!gpiod_free_commit(desc))
|
||||
WARN_ON(extra_checks);
|
||||
}
|
||||
|
||||
module_put(desc->gdev->owner);
|
||||
gpio_device_put(desc->gdev);
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user