sh: use put_device() instead of kfree()
cover sh: use put_device() instead of kfree()
Never directly free @dev after calling device_register(), even if it returned an error! Always use put_device() to give up the reference initialized.
Arvind Yadav (2):
[PATCH 1/2] sh: maple: use put_device() instead of kfree() [PATCH 2/2] sh: superhyway: use put_device() if device_register fail
drivers/sh/maple/maple.c | 3 ++- drivers/sh/superhyway/superhyway.c | 11 +++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-)
Signature · 1 line
1.9.1
PATCH 1/2 sh: maple: use put_device() instead of kfree()
Never directly free @dev after calling device_register(), even if it returned an error! Always use put_device() to give up the reference initialized.
Signed-off-by Arvind Yadav <[email protected]>
--- drivers/sh/maple/maple.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/sh/maple/maple.c +2 -1
@@ -393,7 +393,7 @@ static void maple_attach_driver(struct maple_device *mdev)dev_warn (&mdev->dev,"could not register device at" " (%d, %d), with error 0x%X\n" , mdev->unit, mdev->port, error); -maple_free_dev (mdev); +put_device (&mdev->dev); mdev =NULL ;return ; }
@@ -886,6 +886,7 @@ static int __init maple_bus_init(void) cleanup:printk (KERN_ERR "Maple bus registration failed\n" ); +put_device (&maple_bus);return retval; }/* Push init to later to ensure hardware gets detected */
Signature · 1 line
1.9.1
PATCH 2/2 sh: superhyway: use put_device() if device_register fail
In reply to Arvind Yadavif device_register() returned an error! Always use put_device() to give up the reference initialized.
Signed-off-by Arvind Yadav <[email protected]>
--- drivers/sh/superhyway/superhyway.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
drivers/sh/superhyway/superhyway.c +9 -2
@@ -54,6 +54,7 @@ int superhyway_add_device(unsigned long base, struct superhyway_device *sdev, struct superhyway_bus *bus) {struct superhyway_device *dev = sdev; +int ret;if (!dev) { dev =kzalloc (sizeof (struct superhyway_device ),GFP_KERNEL );
@@ -87,7 +88,11 @@ int superhyway_add_device(unsigned long base, struct superhyway_device *sdev, superhyway_devices++; -return device_register (&dev->dev); + ret =device_register (&dev->dev); +if (ret) +put_device (&dev->dev); + +return ret; } int superhyway_add_devices(struct superhyway_bus *bus,
@@ -110,8 +115,10 @@ static int __init superhyway_init(void)int ret; ret =device_register (&superhyway_bus_device); -if (unlikely (ret)) +if (unlikely (ret)) { +put_device (&superhyway_bus_device);return ret; + }for (bus = superhyway_channels; bus->ops; bus++) ret |=superhyway_scan_bus (bus);
Signature · 1 line
1.9.1