Commit 830118b6 authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files

Merge branch 'net-ethernet-fix-device-leaks'

Johan Hovold says:

====================
net: ethernet: fix device leaks

This series fixes devices leaks stemming from failure to drop the
reference taken by of_find_device_by_node().
====================

Link: https://patch.msgid.link/20250725171213.880-1-johan@kernel.org


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents 9063de63 e05c5497
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -371,8 +371,10 @@ static int dpaa_get_ts_info(struct net_device *net_dev,
		of_node_put(ptp_node);
	}

	if (ptp_dev)
	if (ptp_dev) {
		ptp = platform_get_drvdata(ptp_dev);
		put_device(&ptp_dev->dev);
	}

	if (ptp)
		info->phc_index = ptp->phc_index;
+12 −2
Original line number Diff line number Diff line
@@ -829,19 +829,29 @@ static int enetc_pf_register_with_ierb(struct pci_dev *pdev)
{
	struct platform_device *ierb_pdev;
	struct device_node *ierb_node;
	int ret;

	ierb_node = of_find_compatible_node(NULL, NULL,
					    "fsl,ls1028a-enetc-ierb");
	if (!ierb_node || !of_device_is_available(ierb_node))
	if (!ierb_node)
		return -ENODEV;

	if (!of_device_is_available(ierb_node)) {
		of_node_put(ierb_node);
		return -ENODEV;
	}

	ierb_pdev = of_find_device_by_node(ierb_node);
	of_node_put(ierb_node);

	if (!ierb_pdev)
		return -EPROBE_DEFER;

	return enetc_ierb_register_pf(ierb_pdev, pdev);
	ret = enetc_ierb_register_pf(ierb_pdev, pdev);

	put_device(&ierb_pdev->dev);

	return ret;
}

static const struct enetc_si_ops enetc_psi_ops = {
+3 −1
Original line number Diff line number Diff line
@@ -1475,8 +1475,10 @@ static int gfar_get_ts_info(struct net_device *dev,
	if (ptp_node) {
		ptp_dev = of_find_device_by_node(ptp_node);
		of_node_put(ptp_node);
		if (ptp_dev)
		if (ptp_dev) {
			ptp = platform_get_drvdata(ptp_dev);
			put_device(&ptp_dev->dev);
		}
	}

	if (ptp)
+0 −1
Original line number Diff line number Diff line
@@ -2782,7 +2782,6 @@ void mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth,
	if (!pdev)
		goto err_of_node_put;

	get_device(&pdev->dev);
	irq = platform_get_irq(pdev, 0);
	if (irq < 0)
		goto err_put_device;
+18 −5
Original line number Diff line number Diff line
@@ -685,10 +685,16 @@ struct icss_iep *icss_iep_get_idx(struct device_node *np, int idx)
	struct platform_device *pdev;
	struct device_node *iep_np;
	struct icss_iep *iep;
	int ret;

	iep_np = of_parse_phandle(np, "ti,iep", idx);
	if (!iep_np || !of_device_is_available(iep_np))
	if (!iep_np)
		return ERR_PTR(-ENODEV);

	if (!of_device_is_available(iep_np)) {
		of_node_put(iep_np);
		return ERR_PTR(-ENODEV);
	}

	pdev = of_find_device_by_node(iep_np);
	of_node_put(iep_np);
@@ -698,21 +704,28 @@ struct icss_iep *icss_iep_get_idx(struct device_node *np, int idx)
		return ERR_PTR(-EPROBE_DEFER);

	iep = platform_get_drvdata(pdev);
	if (!iep)
		return ERR_PTR(-EPROBE_DEFER);
	if (!iep) {
		ret = -EPROBE_DEFER;
		goto err_put_pdev;
	}

	device_lock(iep->dev);
	if (iep->client_np) {
		device_unlock(iep->dev);
		dev_err(iep->dev, "IEP is already acquired by %s",
			iep->client_np->name);
		return ERR_PTR(-EBUSY);
		ret = -EBUSY;
		goto err_put_pdev;
	}
	iep->client_np = np;
	device_unlock(iep->dev);
	get_device(iep->dev);

	return iep;

err_put_pdev:
	put_device(&pdev->dev);

	return ERR_PTR(ret);
}
EXPORT_SYMBOL_GPL(icss_iep_get_idx);