From patchwork Thu Jul 8 12:10:16 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kulikov Vasiliy X-Patchwork-Id: 58247 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 8CD4AB6EEC for ; Thu, 8 Jul 2010 22:10:31 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756607Ab0GHMKZ (ORCPT ); Thu, 8 Jul 2010 08:10:25 -0400 Received: from mail-ew0-f46.google.com ([209.85.215.46]:54488 "EHLO mail-ew0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756508Ab0GHMKW (ORCPT ); Thu, 8 Jul 2010 08:10:22 -0400 Received: by mail-ew0-f46.google.com with SMTP id 23so169357ewy.19 for ; Thu, 08 Jul 2010 05:10:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:from:to:cc:subject:date :message-id:x-mailer; bh=mIVzOHgUIbVd+wG71tUAaGOXN1vaQTDN4dIxdx/4NXI=; b=vzVwQ2/F6gxbIvaRd9FW+UxrOXav2F2lFmGorcLmpFgzd1yvABhcnBf09kjUdlhXTz AT5Riso1GRUw8aMgc7ExJ0GQiOBKfNzZfNS4f9Z0JFbnfOPsNsrodd1QZcgCOp3077rd 4qXMrWFAriXvDo2hwdWPn3khyXnuIXCCbdwhE= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=from:to:cc:subject:date:message-id:x-mailer; b=D4n4upy+sgHLsltRdpKNRYo5s+rofpBewmpGyTY+y7e33G7buqFJ/wH/BT1E583RFq BNGzmTdZAjhPLbm7PTzJZV6wphPLpS12lQ+TtGrxEAEH8Le6q64JDoJMssyJz8N3ufF5 NAF+tcl+vmpKBQDotk5GNEx9NgrWcrpyIzRyk= Received: by 10.213.26.70 with SMTP id d6mr6935777ebc.2.1278591021563; Thu, 08 Jul 2010 05:10:21 -0700 (PDT) Received: from localhost (ppp91-78-208-116.pppoe.mtu-net.ru [91.78.208.116]) by mx.google.com with ESMTPS id a48sm70725013eei.7.2010.07.08.05.10.19 (version=TLSv1/SSLv3 cipher=RC4-MD5); Thu, 08 Jul 2010 05:10:20 -0700 (PDT) From: Kulikov Vasiliy To: Kernel Janitors Cc: "David S. Miller" , Grant Likely , Jiri Pirko , Eric Dumazet , Sean MacLennan , netdev@vger.kernel.org Subject: [PATCH 4/4] fec_mpc52xx: fix error path Date: Thu, 8 Jul 2010 16:10:16 +0400 Message-Id: <1278591018-3724-1-git-send-email-segooon@gmail.com> X-Mailer: git-send-email 1.7.0.4 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Error path in mpc52xx_fec_probe() is broken. We must free everything that we've allocated. Signed-off-by: Kulikov Vasiliy --- drivers/net/fec_mpc52xx.c | 38 +++++++++++++++++--------------------- 1 files changed, 17 insertions(+), 21 deletions(-) diff --git a/drivers/net/fec_mpc52xx.c b/drivers/net/fec_mpc52xx.c index 25e6cc6..5f83463 100644 --- a/drivers/net/fec_mpc52xx.c +++ b/drivers/net/fec_mpc52xx.c @@ -875,17 +875,21 @@ mpc52xx_fec_probe(struct of_device *op, const struct of_device_id *match) if (rv) { printk(KERN_ERR DRIVER_NAME ": " "Error while parsing device node resource\n" ); - return rv; + goto err_netdev; } if ((mem.end - mem.start + 1) < sizeof(struct mpc52xx_fec)) { printk(KERN_ERR DRIVER_NAME " - invalid resource size (%lx < %x), check mpc52xx_devices.c\n", (unsigned long)(mem.end - mem.start + 1), sizeof(struct mpc52xx_fec)); - return -EINVAL; + rv = -EINVAL; + goto err_netdev; } - if (!request_mem_region(mem.start, sizeof(struct mpc52xx_fec), DRIVER_NAME)) - return -EBUSY; + if (!request_mem_region(mem.start, sizeof(struct mpc52xx_fec), + DRIVER_NAME)) { + rv = -EBUSY; + goto err_netdev; + } /* Init ether ndev with what we have */ ndev->netdev_ops = &mpc52xx_fec_netdev_ops; @@ -901,7 +905,7 @@ mpc52xx_fec_probe(struct of_device *op, const struct of_device_id *match) if (!priv->fec) { rv = -ENOMEM; - goto probe_error; + goto err_mem_region; } /* Bestcomm init */ @@ -914,7 +918,7 @@ mpc52xx_fec_probe(struct of_device *op, const struct of_device_id *match) if (!priv->rx_dmatsk || !priv->tx_dmatsk) { printk(KERN_ERR DRIVER_NAME ": Can not init SDMA tasks\n" ); rv = -ENOMEM; - goto probe_error; + goto err_rx_tx_dmatsk; } /* Get the IRQ we need one by one */ @@ -966,33 +970,25 @@ mpc52xx_fec_probe(struct of_device *op, const struct of_device_id *match) rv = register_netdev(ndev); if (rv < 0) - goto probe_error; + goto err_node; /* We're done ! */ dev_set_drvdata(&op->dev, ndev); return 0; - - /* Error handling - free everything that might be allocated */ -probe_error: - - if (priv->phy_node) - of_node_put(priv->phy_node); - priv->phy_node = NULL; - +err_node: + of_node_put(priv->phy_node); irq_dispose_mapping(ndev->irq); - +err_rx_tx_dmatsk: if (priv->rx_dmatsk) bcom_fec_rx_release(priv->rx_dmatsk); if (priv->tx_dmatsk) bcom_fec_tx_release(priv->tx_dmatsk); - - if (priv->fec) - iounmap(priv->fec); - + iounmap(priv->fec); +err_mem_region: release_mem_region(mem.start, sizeof(struct mpc52xx_fec)); - +err_netdev: free_netdev(ndev); return rv;