thermal: db8500: Fix missing mutex_unlock() in probe error paths
PATCH 1/1 thermal: db8500: Fix missing mutex_unlock() in probe error paths
Fix missing mutex_unlock() in probe error paths.
Also fix checking return value of thermal_zone_device_register(). thermal_zone_device_register() returns ERR_PTR on error, thus use IS_ERR rather than IS_ERR_OR_NULL to check return value.
This patch also includes a few cleanup to remove unnecessary initialization for *pzone, *ptrips and ret variables.
--- drivers/thermal/db8500_thermal.c | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-)
drivers/thermal/db8500_thermal.c +15 -10
@@ -390,10 +390,10 @@ static inline struct db8500_thsens_platform_data*static int db8500_thermal_probe (struct platform_device *pdev) { -struct db8500_thermal_zone *pzone =NULL ; -struct db8500_thsens_platform_data *ptrips =NULL ; +struct db8500_thermal_zone *pzone; +struct db8500_thsens_platform_data *ptrips;struct device_node *np = pdev->dev.of_node; -int low_irq, high_irq, ret =0 ; +int low_irq, high_irq, ret;unsigned long dft_low, dft_high;if (np)
@@ -419,7 +419,8 @@ static int db8500_thermal_probe(struct platform_device *pdev) low_irq =platform_get_irq_byname (pdev,"IRQ_HOTMON_LOW" );if (low_irq <0 ) {dev_err (&pdev->dev,"Get IRQ_HOTMON_LOW failed.\n" ); -return low_irq; + ret = low_irq; + goto out_unlock; } ret = devm_request_threaded_irq(&pdev->dev, low_irq, NULL,
@@ -427,13 +428,14 @@ static int db8500_thermal_probe(struct platform_device *pdev) "dbx500_temp_low", pzone);if (ret <0 ) {dev_err (&pdev->dev,"Failed to allocate temp low irq.\n" ); -return ret; + goto out_unlock; } high_irq =platform_get_irq_byname (pdev,"IRQ_HOTMON_HIGH" );if (high_irq <0 ) {dev_err (&pdev->dev,"Get IRQ_HOTMON_HIGH failed.\n" ); -return high_irq; + ret = high_irq; + goto out_unlock; } ret = devm_request_threaded_irq(&pdev->dev, high_irq, NULL,
@@ -441,15 +443,16 @@ static int db8500_thermal_probe(struct platform_device *pdev) "dbx500_temp_high", pzone);if (ret <0 ) {dev_err (&pdev->dev,"Failed to allocate temp high irq.\n" ); -return ret; + goto out_unlock; } pzone->therm_dev =thermal_zone_device_register ("db8500_thermal_zone" , ptrips->num_trips,0 , pzone, &thdev_ops,NULL ,0 ,0 ); -if (IS_ERR_OR_NULL (pzone->therm_dev)) { +if (IS_ERR (pzone->therm_dev)) {dev_err (&pdev->dev,"Register thermal zone device failed.\n" ); -return PTR_ERR (pzone->therm_dev); + ret =PTR_ERR (pzone->therm_dev); + goto out_unlock; }dev_info (&pdev->dev,"Thermal zone device registered.\n" );
@@ -461,9 +464,11 @@ static int db8500_thermal_probe(struct platform_device *pdev)platform_set_drvdata (pdev, pzone); pzone->mode =THERMAL_DEVICE_ENABLED ; + +out_unlock:mutex_unlock (&pzone->th_lock); -return 0 ; +return ret; }static int db8500_thermal_remove (struct platform_device *pdev)
Signature · 1 line
1.7.9.5
Zhang Rui
reviewerQuoted 9 lines · Axel Lin
Fix missing
mutex_unlock()in probe error paths.Also fix checking return value of
thermal_zone_device_register().thermal_zone_device_register()returnsERR_PTRon error, thus useIS_ERRrather thanIS_ERR_OR_NULLto check return value.This patch also includes a few cleanup to remove unnecessary initialization for *pzone, *ptrips and ret variables.
well, this patch fixes
1. an important locking issue
2. a misuse of IS_ERR_OR_NULL()
3. several trivial cleanups
And the subject of this patch is misleading.
so why not separate them to three patches instead.
thanks,
rui
Quoted 83 lines
Signed-off-by Axel Lin <[email protected]>--- drivers/thermal/db8500_thermal.c | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-)drivers/thermal/db8500_thermal.c +15
-10@@ -390,10 +390,10 @@ static inline struct db8500_thsens_platform_data*static int db8500_thermal_probe (struct platform_device *pdev) { -struct db8500_thermal_zone *pzone =NULL ; -struct db8500_thsens_platform_data *ptrips =NULL ; +struct db8500_thermal_zone *pzone; +struct db8500_thsens_platform_data *ptrips;struct device_node *np = pdev->dev.of_node; -int low_irq, high_irq, ret =0 ; +int low_irq, high_irq, ret;unsigned long dft_low, dft_high;if (np)@@ -419,7 +419,8 @@ static int db8500_thermal_probe(struct platform_device *pdev) low_irq =platform_get_irq_byname (pdev,"IRQ_HOTMON_LOW" );if (low_irq <0 ) {dev_err (&pdev->dev,"Get IRQ_HOTMON_LOW failed.\n" ); -return low_irq; + ret = low_irq; + goto out_unlock; } ret = devm_request_threaded_irq(&pdev->dev, low_irq, NULL,@@ -427,13 +428,14 @@ static int db8500_thermal_probe(struct platform_device *pdev) "dbx500_temp_low", pzone);if (ret <0 ) {dev_err (&pdev->dev,"Failed to allocate temp low irq.\n" ); -return ret; + goto out_unlock; } high_irq =platform_get_irq_byname (pdev,"IRQ_HOTMON_HIGH" );if (high_irq <0 ) {dev_err (&pdev->dev,"Get IRQ_HOTMON_HIGH failed.\n" ); -return high_irq; + ret = high_irq; + goto out_unlock; } ret = devm_request_threaded_irq(&pdev->dev, high_irq, NULL,@@ -441,15 +443,16 @@ static int db8500_thermal_probe(struct platform_device *pdev) "dbx500_temp_high", pzone);if (ret <0 ) {dev_err (&pdev->dev,"Failed to allocate temp high irq.\n" ); -return ret; + goto out_unlock; } pzone->therm_dev =thermal_zone_device_register ("db8500_thermal_zone" , ptrips->num_trips,0 , pzone, &thdev_ops,NULL ,0 ,0 ); -if (IS_ERR_OR_NULL (pzone->therm_dev)) { +if (IS_ERR (pzone->therm_dev)) {dev_err (&pdev->dev,"Register thermal zone device failed.\n" ); -return PTR_ERR (pzone->therm_dev); + ret =PTR_ERR (pzone->therm_dev); + goto out_unlock; }dev_info (&pdev->dev,"Thermal zone device registered.\n" );@@ -461,9 +464,11 @@ static int db8500_thermal_probe(struct platform_device *pdev)platform_set_drvdata (pdev, pzone); pzone->mode =THERMAL_DEVICE_ENABLED ; + +out_unlock:mutex_unlock (&pzone->th_lock); -return 0 ; +return ret; }static int db8500_thermal_remove (struct platform_device *pdev)