The device_find_child() function calls the get_device() and returns a device reference that must be properly released when no longer needed. The fsl_mc_device_lookup() directly returns without releasing the reference via put_device().
Add the missing put_device() call to prevent reference leaks.
Fixes: f2f2726b62f5 ("staging: fsl-mc: Device driver for FSL-MC DPRC devices") Cc: stable@vger.kernel.org # v4.1+ Signed-off-by: Wentao Liang vulab@iscas.ac.cn --- drivers/bus/fsl-mc/dprc-driver.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/drivers/bus/fsl-mc/dprc-driver.c b/drivers/bus/fsl-mc/dprc-driver.c index c63a7e688db6..e92c75cef90c 100644 --- a/drivers/bus/fsl-mc/dprc-driver.c +++ b/drivers/bus/fsl-mc/dprc-driver.c @@ -124,11 +124,17 @@ struct fsl_mc_device *fsl_mc_device_lookup(struct fsl_mc_obj_desc *obj_desc, struct fsl_mc_device *mc_bus_dev) { struct device *dev; + struct fsl_mc_device *mc_dev;
dev = device_find_child(&mc_bus_dev->dev, obj_desc, __fsl_mc_device_match); + if (!dev) + return NULL; + + mc_dev = to_fsl_mc_device(dev); + put_device(dev);
- return dev ? to_fsl_mc_device(dev) : NULL; + return mc_dev; }
/**
On Thu, Oct 23, 2025 at 11:05:58PM +0800, Wentao Liang wrote:
The device_find_child() function calls the get_device() and returns a device reference that must be properly released when no longer needed.
The release should be done when no longer needed, not even before returning the device to the caller.
The fsl_mc_device_lookup() directly returns without releasing the reference via put_device().
Add the missing put_device() call to prevent reference leaks.
No, the call to put_device should not be done from fsl_mc_device_lookup() but instead from its callers when indeed the device is no longer in use. For example, fsl_mc_obj_device_add() does call put_device().
Ioana
linux-stable-mirror@lists.linaro.org