If device_register() fails, call put_device() to drop the device reference. Also, call device_unregister() if device_create_file() fails.
Found by code review.
Fixes: dc6876a288cc ("sh: dma - convert sysdev_class to a regular subsystem") Cc: stable@vger.kernel.org Signed-off-by: Haoxiang Li lihaoxiang@isrc.iscas.ac.cn --- arch/sh/drivers/dma/dma-sysfs.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/arch/sh/drivers/dma/dma-sysfs.c b/arch/sh/drivers/dma/dma-sysfs.c index 9f666280d80c..5695fd0a0cd7 100644 --- a/arch/sh/drivers/dma/dma-sysfs.c +++ b/arch/sh/drivers/dma/dma-sysfs.c @@ -134,8 +134,10 @@ int dma_create_sysfs_files(struct dma_channel *chan, struct dma_info *info) dev->bus = &dma_subsys;
ret = device_register(dev); - if (ret) + if (ret) { + put_device(dev); return ret; + }
ret |= device_create_file(dev, &dev_attr_dev_id); ret |= device_create_file(dev, &dev_attr_count); @@ -145,6 +147,7 @@ int dma_create_sysfs_files(struct dma_channel *chan, struct dma_info *info)
if (unlikely(ret)) { dev_err(&info->pdev->dev, "Failed creating attrs\n"); + device_unregister(dev); return ret; }