regulator_put function was called whilst holding the regulator_list_mutex, which is also locked from regulator_put. This causes deadlock when failing to register a regulator.
This patch adds a second exit point for the regulator_register function which releases the mutex and then cleans up the supply. Signed-off-by: Charles Keepax <ckee...@opensource.wolfsonmicro.com> --- drivers/regulator/core.c | 9 ++++++--- 1 files changed, 6 insertions(+), 3 deletions(-) diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index 5c4829c..e68754c 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c @@ -3444,15 +3444,18 @@ unset_supplies: unset_regulator_supplies(rdev); scrub: - if (rdev->supply) - regulator_put(rdev->supply); if (rdev->ena_gpio) gpio_free(rdev->ena_gpio); kfree(rdev->constraints); device_unregister(&rdev->dev); + + mutex_unlock(®ulator_list_mutex); + if (rdev->supply) + regulator_put(rdev->supply); + /* device core frees rdev */ rdev = ERR_PTR(ret); - goto out; + return rdev; clean: kfree(rdev); -- 1.7.2.5 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/