[PATCH] gpio: Remove redundant dev_err()/dev_err_probe()

Pan Chuang posted 1 patch 1 week ago
drivers/gpio/gpio-adnp.c          | 5 +----
drivers/gpio/gpio-brcmstb.c       | 4 +---
drivers/gpio/gpio-dwapb.c         | 4 +---
drivers/gpio/gpio-ep93xx.c        | 2 +-
drivers/gpio/gpio-graniterapids.c | 2 +-
drivers/gpio/gpio-kempld.c        | 4 +---
drivers/gpio/gpio-max732x.c       | 5 +----
drivers/gpio/gpio-max77620.c      | 4 +---
drivers/gpio/gpio-max77759.c      | 3 +--
drivers/gpio/gpio-ml-ioh.c        | 4 +---
drivers/gpio/gpio-mlxbf2.c        | 2 +-
drivers/gpio/gpio-mlxbf3.c        | 2 +-
drivers/gpio/gpio-nct6694.c       | 4 +---
drivers/gpio/gpio-nomadik.c       | 4 +---
drivers/gpio/gpio-pca953x.c       | 2 +-
drivers/gpio/gpio-pch.c           | 2 +-
drivers/gpio/gpio-pmic-eic-sprd.c | 4 +---
drivers/gpio/gpio-pxa.c           | 9 ---------
drivers/gpio/gpio-rcar.c          | 4 +---
drivers/gpio/gpio-spacemit-k1.c   | 2 +-
drivers/gpio/gpio-stmpe.c         | 2 +-
drivers/gpio/gpio-tc3589x.c       | 4 +---
drivers/gpio/gpio-wcove.c         | 4 +---
drivers/gpio/gpio-xgs-iproc.c     | 4 +---
24 files changed, 23 insertions(+), 63 deletions(-)
[PATCH] gpio: Remove redundant dev_err()/dev_err_probe()
Posted by Pan Chuang 1 week ago
Since commit 55b48e23f5c4 ("genirq/devres: Add error handling in
devm_request_*_irq()"), devm_request_irq() and devm_request_threaded_irq()
automatically log detailed error messages on failure. Remove the
now-redundant driver-specific dev_err() and dev_err_probe() calls.

Signed-off-by: Pan Chuang <panchuang@vivo.com>
---
 drivers/gpio/gpio-adnp.c          | 5 +----
 drivers/gpio/gpio-brcmstb.c       | 4 +---
 drivers/gpio/gpio-dwapb.c         | 4 +---
 drivers/gpio/gpio-ep93xx.c        | 2 +-
 drivers/gpio/gpio-graniterapids.c | 2 +-
 drivers/gpio/gpio-kempld.c        | 4 +---
 drivers/gpio/gpio-max732x.c       | 5 +----
 drivers/gpio/gpio-max77620.c      | 4 +---
 drivers/gpio/gpio-max77759.c      | 3 +--
 drivers/gpio/gpio-ml-ioh.c        | 4 +---
 drivers/gpio/gpio-mlxbf2.c        | 2 +-
 drivers/gpio/gpio-mlxbf3.c        | 2 +-
 drivers/gpio/gpio-nct6694.c       | 4 +---
 drivers/gpio/gpio-nomadik.c       | 4 +---
 drivers/gpio/gpio-pca953x.c       | 2 +-
 drivers/gpio/gpio-pch.c           | 2 +-
 drivers/gpio/gpio-pmic-eic-sprd.c | 4 +---
 drivers/gpio/gpio-pxa.c           | 9 ---------
 drivers/gpio/gpio-rcar.c          | 4 +---
 drivers/gpio/gpio-spacemit-k1.c   | 2 +-
 drivers/gpio/gpio-stmpe.c         | 2 +-
 drivers/gpio/gpio-tc3589x.c       | 4 +---
 drivers/gpio/gpio-wcove.c         | 4 +---
 drivers/gpio/gpio-xgs-iproc.c     | 4 +---
 24 files changed, 23 insertions(+), 63 deletions(-)

diff --git a/drivers/gpio/gpio-adnp.c b/drivers/gpio/gpio-adnp.c
index 0410e3adbf54..95dbb774dfc4 100644
--- a/drivers/gpio/gpio-adnp.c
+++ b/drivers/gpio/gpio-adnp.c
@@ -411,11 +411,8 @@ static int adnp_irq_setup(struct adnp *adnp)
 					NULL, adnp_irq,
 					IRQF_TRIGGER_RISING | IRQF_ONESHOT,
 					dev_name(chip->parent), adnp);
-	if (err != 0) {
-		dev_err(chip->parent, "can't request IRQ#%d: %d\n",
-			adnp->client->irq, err);
+	if (err != 0)
 		return err;
-	}
 
 	return 0;
 }
diff --git a/drivers/gpio/gpio-brcmstb.c b/drivers/gpio/gpio-brcmstb.c
index 44ca798cf832..d0e76bb08eda 100644
--- a/drivers/gpio/gpio-brcmstb.c
+++ b/drivers/gpio/gpio-brcmstb.c
@@ -489,10 +489,8 @@ static int brcmstb_gpio_irq_setup(struct platform_device *pdev,
 					       IRQF_SHARED,
 					       "brcmstb-gpio-wake", priv);
 
-			if (err < 0) {
-				dev_err(dev, "Couldn't request wake IRQ");
+			if (err < 0)
 				goto out_free_domain;
-			}
 		}
 		priv->irq_chip.irq_set_wake = brcmstb_gpio_irq_set_wake;
 	}
diff --git a/drivers/gpio/gpio-dwapb.c b/drivers/gpio/gpio-dwapb.c
index aa7c08e60707..0b187adc7262 100644
--- a/drivers/gpio/gpio-dwapb.c
+++ b/drivers/gpio/gpio-dwapb.c
@@ -505,10 +505,8 @@ static void dwapb_configure_irqs(struct dwapb_gpio *gpio,
 		err = devm_request_irq(gpio->dev, pp->irq[0],
 				       dwapb_irq_handler_mfd,
 				       IRQF_SHARED, DWAPB_DRIVER_NAME, gpio);
-		if (err) {
-			dev_err(gpio->dev, "error requesting IRQ\n");
+		if (err)
 			goto err_kfree_pirq;
-		}
 	} else {
 		girq->num_parents = pirq->nr_irqs;
 		girq->parents = pirq->irq;
diff --git a/drivers/gpio/gpio-ep93xx.c b/drivers/gpio/gpio-ep93xx.c
index 8784e433e1ff..778cd48af8ac 100644
--- a/drivers/gpio/gpio-ep93xx.c
+++ b/drivers/gpio/gpio-ep93xx.c
@@ -305,7 +305,7 @@ static int ep93xx_setup_irqs(struct platform_device *pdev,
 		ret = devm_request_irq(dev, irq, ep93xx_ab_irq_handler,
 				       IRQF_SHARED, gc->label, gc);
 		if (ret)
-			return dev_err_probe(dev, ret, "requesting IRQ: %d\n", irq);
+			return ret;
 
 		girq->parents[0] = irq;
 	} else { /* F irqchip */
diff --git a/drivers/gpio/gpio-graniterapids.c b/drivers/gpio/gpio-graniterapids.c
index 2d0fe3abd5e0..660140198dd9 100644
--- a/drivers/gpio/gpio-graniterapids.c
+++ b/drivers/gpio/gpio-graniterapids.c
@@ -341,7 +341,7 @@ static int gnr_gpio_probe(struct platform_device *pdev)
 	ret = devm_request_irq(dev, irq, gnr_gpio_irq, IRQF_SHARED | IRQF_NO_THREAD,
 			       dev_name(dev), priv);
 	if (ret)
-		return dev_err_probe(dev, ret, "failed to request interrupt\n");
+		return ret;
 
 	gnr_gpio_init_pin_ro_bits(dev, priv->reg_base + GNR_CFG_LOCK_OFFSET,
 				  priv->ro_bitmap);
diff --git a/drivers/gpio/gpio-kempld.c b/drivers/gpio/gpio-kempld.c
index 5a63df3ea5fa..1d80994ca44e 100644
--- a/drivers/gpio/gpio-kempld.c
+++ b/drivers/gpio/gpio-kempld.c
@@ -373,10 +373,8 @@ static int kempld_gpio_irq_init(struct device *dev,
 					NULL, kempld_gpio_irq_handler,
 					IRQF_ONESHOT, chip->label,
 					gpio);
-	if (ret) {
-		dev_err(dev, "failed to request irq %d\n", irq);
+	if (ret)
 		return ret;
-	}
 
 	return 0;
 }
diff --git a/drivers/gpio/gpio-max732x.c b/drivers/gpio/gpio-max732x.c
index 24c67c912954..7713937ea3fe 100644
--- a/drivers/gpio/gpio-max732x.c
+++ b/drivers/gpio/gpio-max732x.c
@@ -515,11 +515,8 @@ static int max732x_irq_setup(struct max732x_chip *chip,
 				NULL, max732x_irq_handler, IRQF_ONESHOT |
 				IRQF_TRIGGER_FALLING | IRQF_SHARED,
 				dev_name(&client->dev), chip);
-		if (ret) {
-			dev_err(&client->dev, "failed to request irq %d\n",
-				client->irq);
+		if (ret)
 			return ret;
-		}
 
 		girq = &chip->gpio_chip.irq;
 		gpio_irq_chip_set_chip(girq, &max732x_irq_chip);
diff --git a/drivers/gpio/gpio-max77620.c b/drivers/gpio/gpio-max77620.c
index 2bf3b55a61b5..eb479e1b48aa 100644
--- a/drivers/gpio/gpio-max77620.c
+++ b/drivers/gpio/gpio-max77620.c
@@ -356,10 +356,8 @@ static int max77620_gpio_probe(struct platform_device *pdev)
 	ret = devm_request_threaded_irq(&pdev->dev, gpio_irq, NULL,
 					max77620_gpio_irqhandler, IRQF_ONESHOT,
 					"max77620-gpio", mgpio);
-	if (ret < 0) {
-		dev_err(&pdev->dev, "failed to request IRQ: %d\n", ret);
+	if (ret < 0)
 		return ret;
-	}
 
 	return 0;
 }
diff --git a/drivers/gpio/gpio-max77759.c b/drivers/gpio/gpio-max77759.c
index da3c77dd574e..c8761e825e16 100644
--- a/drivers/gpio/gpio-max77759.c
+++ b/drivers/gpio/gpio-max77759.c
@@ -488,8 +488,7 @@ static int max77759_gpio_probe(struct platform_device *pdev)
 					IRQF_ONESHOT | IRQF_SHARED,
 					dev_name(&pdev->dev), chip);
 	if (ret < 0)
-		return dev_err_probe(&pdev->dev, ret,
-				     "Failed to request IRQ\n");
+		return ret;
 
 	return ret;
 }
diff --git a/drivers/gpio/gpio-ml-ioh.c b/drivers/gpio/gpio-ml-ioh.c
index 6576e5dcb0ee..c77b6e6abf08 100644
--- a/drivers/gpio/gpio-ml-ioh.c
+++ b/drivers/gpio/gpio-ml-ioh.c
@@ -469,10 +469,8 @@ static int ioh_gpio_probe(struct pci_dev *pdev,
 	chip = chip_save;
 	ret = devm_request_irq(dev, pdev->irq, ioh_gpio_handler,
 			       IRQF_SHARED, KBUILD_MODNAME, chip);
-	if (ret != 0) {
-		dev_err(dev, "%s request_irq failed\n", __func__);
+	if (ret != 0)
 		return ret;
-	}
 
 	pci_set_drvdata(pdev, chip);
 
diff --git a/drivers/gpio/gpio-mlxbf2.c b/drivers/gpio/gpio-mlxbf2.c
index 4e2f3381d82b..f7b6a260e93f 100644
--- a/drivers/gpio/gpio-mlxbf2.c
+++ b/drivers/gpio/gpio-mlxbf2.c
@@ -411,7 +411,7 @@ mlxbf2_gpio_probe(struct platform_device *pdev)
 		ret = devm_request_irq(dev, irq, mlxbf2_gpio_irq_handler,
 				       IRQF_SHARED, name, gs);
 		if (ret)
-			return dev_err_probe(dev, ret, "failed to request IRQ");
+			return ret;
 	}
 
 	platform_set_drvdata(pdev, gs);
diff --git a/drivers/gpio/gpio-mlxbf3.c b/drivers/gpio/gpio-mlxbf3.c
index 566326644a2c..369c34d34b9e 100644
--- a/drivers/gpio/gpio-mlxbf3.c
+++ b/drivers/gpio/gpio-mlxbf3.c
@@ -248,7 +248,7 @@ static int mlxbf3_gpio_probe(struct platform_device *pdev)
 		ret = devm_request_irq(dev, irq, mlxbf3_gpio_irq_handler,
 				       IRQF_SHARED, dev_name(dev), gs);
 		if (ret)
-			return dev_err_probe(dev, ret, "failed to request IRQ");
+			return ret;
 	}
 
 	platform_set_drvdata(pdev, gs);
diff --git a/drivers/gpio/gpio-nct6694.c b/drivers/gpio/gpio-nct6694.c
index a8607f0d9915..6cbfa90e723d 100644
--- a/drivers/gpio/gpio-nct6694.c
+++ b/drivers/gpio/gpio-nct6694.c
@@ -476,10 +476,8 @@ static int nct6694_gpio_probe(struct platform_device *pdev)
 	ret = devm_request_threaded_irq(dev, data->irq, NULL, nct6694_irq_handler,
 					IRQF_ONESHOT | IRQF_SHARED,
 					"gpio-nct6694", data);
-	if (ret) {
-		dev_err_probe(dev, ret, "Failed to request irq\n");
+	if (ret)
 		return ret;
-	}
 
 	return devm_gpiochip_add_data(dev, &data->gpio, data);
 }
diff --git a/drivers/gpio/gpio-nomadik.c b/drivers/gpio/gpio-nomadik.c
index 208fed631975..faf9ceb9a323 100644
--- a/drivers/gpio/gpio-nomadik.c
+++ b/drivers/gpio/gpio-nomadik.c
@@ -694,10 +694,8 @@ static int nmk_gpio_probe(struct platform_device *pdev)
 
 	ret = devm_request_irq(dev, irq, nmk_gpio_irq_handler, IRQF_SHARED,
 			       dev_name(dev), nmk_chip);
-	if (ret) {
-		dev_err_probe(dev, ret, "failed requesting IRQ\n");
+	if (ret)
 		return ret;
-	}
 
 	if (!nmk_chip->is_mobileye_soc) {
 		clk_enable(nmk_chip->clk);
diff --git a/drivers/gpio/gpio-pca953x.c b/drivers/gpio/gpio-pca953x.c
index f6b870b7b352..703f09e6ba6e 100644
--- a/drivers/gpio/gpio-pca953x.c
+++ b/drivers/gpio/gpio-pca953x.c
@@ -1094,7 +1094,7 @@ static int pca953x_irq_setup(struct pca953x_chip *chip, int irq_base)
 					IRQF_ONESHOT | IRQF_SHARED, dev_name(dev),
 					chip);
 	if (ret)
-		return dev_err_probe(dev, ret, "failed to request irq\n");
+		return ret;
 
 	return 0;
 }
diff --git a/drivers/gpio/gpio-pch.c b/drivers/gpio/gpio-pch.c
index 4ffa0955a9e3..96bbaf7c23a9 100644
--- a/drivers/gpio/gpio-pch.c
+++ b/drivers/gpio/gpio-pch.c
@@ -397,7 +397,7 @@ static int pch_gpio_probe(struct pci_dev *pdev,
 	ret = devm_request_irq(dev, pdev->irq, pch_gpio_handler,
 			       IRQF_SHARED, KBUILD_MODNAME, chip);
 	if (ret)
-		return dev_err_probe(dev, ret, "Failed to request IRQ\n");
+		return ret;
 
 	return pch_gpio_alloc_generic_chip(chip, irq_base, gpio_pins[chip->ioh]);
 }
diff --git a/drivers/gpio/gpio-pmic-eic-sprd.c b/drivers/gpio/gpio-pmic-eic-sprd.c
index cb015fb5c946..16851647a918 100644
--- a/drivers/gpio/gpio-pmic-eic-sprd.c
+++ b/drivers/gpio/gpio-pmic-eic-sprd.c
@@ -332,10 +332,8 @@ static int sprd_pmic_eic_probe(struct platform_device *pdev)
 					sprd_pmic_eic_irq_handler,
 					IRQF_ONESHOT | IRQF_NO_SUSPEND,
 					dev_name(&pdev->dev), pmic_eic);
-	if (ret) {
-		dev_err(&pdev->dev, "Failed to request PMIC EIC IRQ.\n");
+	if (ret)
 		return ret;
-	}
 
 	pmic_eic->chip.label = dev_name(&pdev->dev);
 	pmic_eic->chip.ngpio = SPRD_PMIC_EIC_NR;
diff --git a/drivers/gpio/gpio-pxa.c b/drivers/gpio/gpio-pxa.c
index 5d61053e0596..d0a6f93a63c1 100644
--- a/drivers/gpio/gpio-pxa.c
+++ b/drivers/gpio/gpio-pxa.c
@@ -683,24 +683,15 @@ static int pxa_gpio_probe(struct platform_device *pdev)
 		ret = devm_request_irq(&pdev->dev,
 				       irq0, pxa_gpio_direct_handler, 0,
 				       "gpio-0", pchip);
-		if (ret)
-			dev_err(&pdev->dev, "request of gpio0 irq failed: %d\n",
-				ret);
 	}
 	if (irq1 > 0) {
 		ret = devm_request_irq(&pdev->dev,
 				       irq1, pxa_gpio_direct_handler, 0,
 				       "gpio-1", pchip);
-		if (ret)
-			dev_err(&pdev->dev, "request of gpio1 irq failed: %d\n",
-				ret);
 	}
 	ret = devm_request_irq(&pdev->dev,
 			       irq_mux, pxa_gpio_demux_handler, 0,
 				       "gpio-mux", pchip);
-	if (ret)
-		dev_err(&pdev->dev, "request of gpio-mux irq failed: %d\n",
-				ret);
 
 	pxa_gpio_chip = pchip;
 
diff --git a/drivers/gpio/gpio-rcar.c b/drivers/gpio/gpio-rcar.c
index 09bebde5c426..428c010eff40 100644
--- a/drivers/gpio/gpio-rcar.c
+++ b/drivers/gpio/gpio-rcar.c
@@ -560,10 +560,8 @@ static int gpio_rcar_probe(struct platform_device *pdev)
 	irq_domain_set_pm_device(gpio_chip->irq.domain, dev);
 	ret = devm_request_irq(dev, p->irq_parent, gpio_rcar_irq_handler,
 			       IRQF_SHARED, name, p);
-	if (ret) {
-		dev_err(dev, "failed to request IRQ\n");
+	if (ret)
 		goto err1;
-	}
 
 	if (p->info.has_inen) {
 		pm_runtime_get_sync(dev);
diff --git a/drivers/gpio/gpio-spacemit-k1.c b/drivers/gpio/gpio-spacemit-k1.c
index 5fe813b7f9bb..d73d1b71ee61 100644
--- a/drivers/gpio/gpio-spacemit-k1.c
+++ b/drivers/gpio/gpio-spacemit-k1.c
@@ -254,7 +254,7 @@ static int spacemit_gpio_add_bank(struct spacemit_gpio *sg,
 					IRQF_ONESHOT | IRQF_SHARED,
 					gb->chip.gc.label, gb);
 	if (ret < 0)
-		return dev_err_probe(dev, ret, "failed to register IRQ\n");
+		return ret;
 
 	ret = devm_gpiochip_add_data(dev, gc, gb);
 	if (ret)
diff --git a/drivers/gpio/gpio-stmpe.c b/drivers/gpio/gpio-stmpe.c
index 6faf30347a36..090f91590fb0 100644
--- a/drivers/gpio/gpio-stmpe.c
+++ b/drivers/gpio/gpio-stmpe.c
@@ -515,7 +515,7 @@ static int stmpe_gpio_probe(struct platform_device *pdev)
 		ret = devm_request_threaded_irq(dev, irq, NULL, stmpe_gpio_irq,
 						IRQF_ONESHOT, "stmpe-gpio", stmpe_gpio);
 		if (ret)
-			return dev_err_probe(dev, ret, "unable to register IRQ handler\n");
+			return ret;
 
 		girq = &stmpe_gpio->chip.irq;
 		gpio_irq_chip_set_chip(girq, &stmpe_gpio_irq_chip);
diff --git a/drivers/gpio/gpio-tc3589x.c b/drivers/gpio/gpio-tc3589x.c
index 90d048f9da08..5cb85649dc36 100644
--- a/drivers/gpio/gpio-tc3589x.c
+++ b/drivers/gpio/gpio-tc3589x.c
@@ -358,10 +358,8 @@ static int tc3589x_gpio_probe(struct platform_device *pdev)
 					irq, NULL, tc3589x_gpio_irq,
 					IRQF_ONESHOT, "tc3589x-gpio",
 					tc3589x_gpio);
-	if (ret) {
-		dev_err(&pdev->dev, "unable to get irq: %d\n", ret);
+	if (ret)
 		return ret;
-	}
 
 	return devm_gpiochip_add_data(&pdev->dev, &tc3589x_gpio->chip, tc3589x_gpio);
 }
diff --git a/drivers/gpio/gpio-wcove.c b/drivers/gpio/gpio-wcove.c
index 4a5e20e936a9..d538cc0d5d9a 100644
--- a/drivers/gpio/gpio-wcove.c
+++ b/drivers/gpio/gpio-wcove.c
@@ -467,10 +467,8 @@ static int wcove_gpio_probe(struct platform_device *pdev)
 
 	ret = devm_request_threaded_irq(dev, virq, NULL, wcove_gpio_irq_handler,
 					IRQF_ONESHOT, pdev->name, wg);
-	if (ret) {
-		dev_err(dev, "Failed to request irq %d\n", virq);
+	if (ret)
 		return ret;
-	}
 
 	ret = devm_gpiochip_add_data(dev, &wg->chip, wg);
 	if (ret) {
diff --git a/drivers/gpio/gpio-xgs-iproc.c b/drivers/gpio/gpio-xgs-iproc.c
index 77eb29dcc217..5f147d3bb0ee 100644
--- a/drivers/gpio/gpio-xgs-iproc.c
+++ b/drivers/gpio/gpio-xgs-iproc.c
@@ -271,10 +271,8 @@ static int iproc_gpio_probe(struct platform_device *pdev)
 		 */
 		ret = devm_request_irq(dev, irq, iproc_gpio_irq_handler,
 				       IRQF_SHARED, chip->gen_gc.gc.label, &chip->gen_gc.gc);
-		if (ret) {
-			dev_err(dev, "Fail to request IRQ%d: %d\n", irq, ret);
+		if (ret)
 			return ret;
-		}
 
 		girq = &chip->gen_gc.gc.irq;
 		gpio_irq_chip_set_chip(girq, &iproc_gpio_irq_chip);
-- 
2.34.1
Re: [PATCH] gpio: Remove redundant dev_err()/dev_err_probe()
Posted by Andy Shevchenko 1 week ago
On Fri, Jul 17, 2026 at 04:30:33PM +0800, Pan Chuang wrote:
> Since commit 55b48e23f5c4 ("genirq/devres: Add error handling in
> devm_request_*_irq()"), devm_request_irq() and devm_request_threaded_irq()
> automatically log detailed error messages on failure. Remove the
> now-redundant driver-specific dev_err() and dev_err_probe() calls.


...

> -	if (err != 0) {
> -		dev_err(chip->parent, "can't request IRQ#%d: %d\n",
> -			adnp->client->irq, err);
> +	if (err != 0)

This style is discouraged, so while at it, please replace with

	if (err)

>  		return err;
> -	}
>  
>  	return 0;

...

> +++ b/drivers/gpio/gpio-brcmstb.c
> @@ -489,10 +489,8 @@ static int brcmstb_gpio_irq_setup(struct platform_device *pdev,
>  					       IRQF_SHARED,
>  					       "brcmstb-gpio-wake", priv);
>  
> -			if (err < 0) {
> -				dev_err(dev, "Couldn't request wake IRQ");
> +			if (err < 0)

This style might be okay, but has no sense, we know that there is no positive
out from this function, so, please also replace with

			if (err)

>  				goto out_free_domain;
> -			}
>  		}
>  		priv->irq_chip.irq_set_wake = brcmstb_gpio_irq_set_wake;
>  	}

...

> +++ b/drivers/gpio/gpio-max77620.c
> @@ -356,10 +356,8 @@ static int max77620_gpio_probe(struct platform_device *pdev)
>  	ret = devm_request_threaded_irq(&pdev->dev, gpio_irq, NULL,
>  					max77620_gpio_irqhandler, IRQF_ONESHOT,
>  					"max77620-gpio", mgpio);
> -	if (ret < 0) {
> -		dev_err(&pdev->dev, "failed to request IRQ: %d\n", ret);
> +	if (ret < 0)
>  		return ret;
> -	}

Ditto. And so on...

-- 
With Best Regards,
Andy Shevchenko