* [01/12] driver core fixes: make_class_name() retval check
[not found] <20060913163007.21cf10a8@gondolin.boeblingen.de.ibm.com>
@ 2006-09-13 16:38 ` Cornelia Huck
2006-09-14 12:01 ` Martin Waitz
2006-09-13 16:38 ` [02/12] driver core fixes: device_register() retval check in platform.c Cornelia Huck
` (10 subsequent siblings)
11 siblings, 1 reply; 18+ messages in thread
From: Cornelia Huck @ 2006-09-13 16:38 UTC (permalink / raw)
To: Greg K-H; +Cc: linux-kernel
From: Cornelia Huck <cornelia.huck@de.ibm.com>
make_class_name() may return an error pointer. Audit the callers in the
driver core.
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
class.c | 11 ++++++++++-
core.c | 31 +++++++++++++++++++++++--------
2 files changed, 33 insertions(+), 9 deletions(-)
diff -Naurp linux-2.6.18-rc6/drivers/base/class.c linux-2.6.18-rc6+CH/drivers/base/class.c
--- linux-2.6.18-rc6/drivers/base/class.c 2006-09-12 14:18:40.000000000 +0200
+++ linux-2.6.18-rc6+CH/drivers/base/class.c 2006-09-12 16:17:02.000000000 +0200
@@ -596,6 +596,11 @@ int class_device_add(struct class_device
if (class_dev->dev) {
class_name = make_class_name(class_dev->class->name,
&class_dev->kobj);
+ if (IS_ERR(class_name)) {
+ error = PTR_ERR(class_name);
+ class_name = NULL;
+ goto out6;
+ }
error = sysfs_create_link(&class_dev->kobj,
&class_dev->dev->kobj, "device");
if (error)
@@ -736,7 +741,11 @@ void class_device_del(struct class_devic
class_name = make_class_name(class_dev->class->name,
&class_dev->kobj);
sysfs_remove_link(&class_dev->kobj, "device");
- sysfs_remove_link(&class_dev->dev->kobj, class_name);
+ if (!IS_ERR(class_name))
+ sysfs_remove_link(&class_dev->dev->kobj, class_name);
+ else
+ /* Hmm, don't know what else to do */
+ class_name = NULL;
}
sysfs_remove_link(&class_dev->kobj, "subsystem");
class_device_remove_file(class_dev, &class_dev->uevent_attr);
diff -Naurp linux-2.6.18-rc6/drivers/base/core.c linux-2.6.18-rc6+CH/drivers/base/core.c
--- linux-2.6.18-rc6/drivers/base/core.c 2006-09-12 14:18:57.000000000 +0200
+++ linux-2.6.18-rc6+CH/drivers/base/core.c 2006-09-12 16:17:02.000000000 +0200
@@ -437,7 +437,11 @@ int device_add(struct device *dev)
if ((parent) && (!device_is_virtual(dev))) {
sysfs_create_link(&dev->kobj, &dev->parent->kobj, "device");
class_name = make_class_name(dev->class->name, &dev->kobj);
- sysfs_create_link(&dev->parent->kobj, &dev->kobj, class_name);
+ if (!IS_ERR(class_name))
+ sysfs_create_link(&dev->parent->kobj,
+ &dev->kobj, class_name);
+ else
+ class_name = NULL;
}
}
@@ -557,12 +561,16 @@ void device_del(struct device * dev)
if (dev->class) {
sysfs_remove_link(&dev->kobj, "subsystem");
sysfs_remove_link(&dev->class->subsys.kset.kobj, dev->bus_id);
- class_name = make_class_name(dev->class->name, &dev->kobj);
if ((parent) && (!device_is_virtual(dev))) {
+ class_name = make_class_name(dev->class->name,
+ &dev->kobj);
sysfs_remove_link(&dev->kobj, "device");
- sysfs_remove_link(&dev->parent->kobj, class_name);
+ if (!IS_ERR(class_name)) {
+ sysfs_remove_link(&dev->parent->kobj,
+ class_name);
+ kfree(class_name);
+ }
}
- kfree(class_name);
down(&dev->class->sem);
list_del_init(&dev->node);
up(&dev->class->sem);
@@ -763,9 +771,14 @@ int device_rename(struct device *dev, ch
pr_debug("DEVICE: renaming '%s' to '%s'\n", dev->bus_id, new_name);
- if ((dev->class) && (dev->parent))
+ if ((dev->class) && (dev->parent)) {
old_class_name = make_class_name(dev->class->name, &dev->kobj);
-
+ if (IS_ERR(old_class_name)) {
+ error = PTR_ERR(old_class_name);
+ old_class_name = NULL;
+ goto out;
+ }
+ }
if (dev->class) {
old_symlink_name = kmalloc(BUS_ID_SIZE, GFP_KERNEL);
if (!old_symlink_name)
@@ -779,11 +792,12 @@ int device_rename(struct device *dev, ch
if (old_class_name) {
new_class_name = make_class_name(dev->class->name, &dev->kobj);
- if (new_class_name) {
+ if (!IS_ERR(new_class_name)) {
sysfs_create_link(&dev->parent->kobj, &dev->kobj,
new_class_name);
sysfs_remove_link(&dev->parent->kobj, old_class_name);
- }
+ } else
+ new_class_name = NULL;
}
if (dev->class) {
sysfs_remove_link(&dev->class->subsys.kset.kobj,
@@ -791,6 +805,7 @@ int device_rename(struct device *dev, ch
sysfs_create_link(&dev->class->subsys.kset.kobj, &dev->kobj,
dev->bus_id);
}
+out:
put_device(dev);
kfree(old_class_name);
^ permalink raw reply [flat|nested] 18+ messages in thread
* [02/12] driver core fixes: device_register() retval check in platform.c
[not found] <20060913163007.21cf10a8@gondolin.boeblingen.de.ibm.com>
2006-09-13 16:38 ` [01/12] driver core fixes: make_class_name() retval check Cornelia Huck
@ 2006-09-13 16:38 ` Cornelia Huck
2006-09-13 16:38 ` [03/12] driver core fixes: fixup platform_device_register_simple() Cornelia Huck
` (9 subsequent siblings)
11 siblings, 0 replies; 18+ messages in thread
From: Cornelia Huck @ 2006-09-13 16:38 UTC (permalink / raw)
To: Greg K-H; +Cc: linux-kernel
From: Cornelia Huck <cornelia.huck@de.ibm.com>
Check the return value of device_register() in platform_bus_init().
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
platform.c | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
--- linux-2.6.18-rc6/drivers/base/platform.c 2006-09-12 14:12:10.000000000 +0200
+++ linux-2.6.18-rc6+CH/drivers/base/platform.c 2006-09-12 16:25:50.000000000 +0200
@@ -563,8 +563,15 @@ EXPORT_SYMBOL_GPL(platform_bus_type);
int __init platform_bus_init(void)
{
- device_register(&platform_bus);
- return bus_register(&platform_bus_type);
+ int error;
+
+ error = device_register(&platform_bus);
+ if (error)
+ return error;
+ error = bus_register(&platform_bus_type);
+ if (error)
+ device_unregister(&platform_bus);
+ return error;
}
#ifndef ARCH_HAS_DMA_GET_REQUIRED_MASK
^ permalink raw reply [flat|nested] 18+ messages in thread
* [03/12] driver core fixes: fixup platform_device_register_simple()
[not found] <20060913163007.21cf10a8@gondolin.boeblingen.de.ibm.com>
2006-09-13 16:38 ` [01/12] driver core fixes: make_class_name() retval check Cornelia Huck
2006-09-13 16:38 ` [02/12] driver core fixes: device_register() retval check in platform.c Cornelia Huck
@ 2006-09-13 16:38 ` Cornelia Huck
2006-09-14 2:31 ` Dmitry Torokhov
2006-09-13 16:38 ` [04/12] driver core fixes: retval check in class_register() Cornelia Huck
` (8 subsequent siblings)
11 siblings, 1 reply; 18+ messages in thread
From: Cornelia Huck @ 2006-09-13 16:38 UTC (permalink / raw)
To: Greg K-H; +Cc: linux-kernel
From: Cornelia Huck <cornelia.huck@de.ibm.com>
Remember to remove allocated resources if platform_device_add() fails.
Introduce a helper function platform_device_del_resources() for this,
which can also be used by platform_device_del().
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
platform.c | 29 ++++++++++++++++++-----------
1 file changed, 18 insertions(+), 11 deletions(-)
--- linux-2.6.18-rc6/drivers/base/platform.c 2006-09-12 16:37:21.000000000 +0200
+++ linux-2.6.18-rc6+CH/drivers/base/platform.c 2006-09-12 16:39:10.000000000 +0200
@@ -202,6 +202,17 @@ int platform_device_add_resources(struct
}
EXPORT_SYMBOL_GPL(platform_device_add_resources);
+static void platform_device_del_resources(struct platform_device *pdev)
+{
+ int i;
+
+ for (i = 0; i < pdev->num_resources; i++) {
+ struct resource *r = &pdev->resource[i];
+ if (r->flags & (IORESOURCE_MEM|IORESOURCE_IO))
+ release_resource(r);
+ }
+}
+
/**
* platform_device_add_data
* @pdev: platform device allocated by platform_device_alloc to add resources to
@@ -296,15 +307,8 @@ EXPORT_SYMBOL_GPL(platform_device_add);
*/
void platform_device_del(struct platform_device *pdev)
{
- int i;
-
if (pdev) {
- for (i = 0; i < pdev->num_resources; i++) {
- struct resource *r = &pdev->resource[i];
- if (r->flags & (IORESOURCE_MEM|IORESOURCE_IO))
- release_resource(r);
- }
-
+ platform_device_del_resources(pdev);
device_del(&pdev->dev);
}
}
@@ -365,17 +369,20 @@ struct platform_device *platform_device_
if (num) {
retval = platform_device_add_resources(pdev, res, num);
if (retval)
- goto error;
+ goto error_put;
}
retval = platform_device_add(pdev);
if (retval)
- goto error;
+ goto error_resources;
return pdev;
-error:
+error_resources:
+ platform_device_del_resources(pdev);
+error_put:
platform_device_put(pdev);
+error:
return ERR_PTR(retval);
}
EXPORT_SYMBOL_GPL(platform_device_register_simple);
^ permalink raw reply [flat|nested] 18+ messages in thread
* [04/12] driver core fixes: retval check in class_register()
[not found] <20060913163007.21cf10a8@gondolin.boeblingen.de.ibm.com>
` (2 preceding siblings ...)
2006-09-13 16:38 ` [03/12] driver core fixes: fixup platform_device_register_simple() Cornelia Huck
@ 2006-09-13 16:38 ` Cornelia Huck
2006-09-13 16:38 ` [05/12] driver core fixes: sysfs_create_link() retval check in class.c Cornelia Huck
` (7 subsequent siblings)
11 siblings, 0 replies; 18+ messages in thread
From: Cornelia Huck @ 2006-09-13 16:38 UTC (permalink / raw)
To: Greg K-H; +Cc: linux-kernel
From: Cornelia Huck <cornelia.huck@de.ibm.com>
Check for return value of add_class_attrs() in class_register().
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
class.c | 2 ++
1 file changed, 2 insertions(+)
--- linux-2.6.18-rc6/drivers/base/class.c 2006-09-12 16:19:43.000000000 +0200
+++ linux-2.6.18-rc6+CH/drivers/base/class.c 2006-09-12 17:01:12.000000000 +0200
@@ -153,6 +153,8 @@ int class_register(struct class * cls)
error = subsystem_register(&cls->subsys);
if (!error) {
error = add_class_attrs(class_get(cls));
+ if (error)
+ subsystem_unregister(&cls->subsys);
class_put(cls);
}
return error;
^ permalink raw reply [flat|nested] 18+ messages in thread
* [05/12] driver core fixes: sysfs_create_link() retval check in class.c
[not found] <20060913163007.21cf10a8@gondolin.boeblingen.de.ibm.com>
` (3 preceding siblings ...)
2006-09-13 16:38 ` [04/12] driver core fixes: retval check in class_register() Cornelia Huck
@ 2006-09-13 16:38 ` Cornelia Huck
2006-09-13 16:38 ` [06/12] driver core fixes: bus_add_attrs() retval check Cornelia Huck
` (6 subsequent siblings)
11 siblings, 0 replies; 18+ messages in thread
From: Cornelia Huck @ 2006-09-13 16:38 UTC (permalink / raw)
To: Greg K-H; +Cc: linux-kernel
From: Cornelia Huck <cornelia.huck@de.ibm.com>
Check for return value of sysfs_create_link() in class_device_add().
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
class.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
--- linux-2.6.18-rc6/drivers/base/class.c 2006-09-12 17:01:56.000000000 +0200
+++ linux-2.6.18-rc6+CH/drivers/base/class.c 2006-09-12 17:03:21.000000000 +0200
@@ -562,7 +562,10 @@ int class_device_add(struct class_device
goto out2;
/* add the needed attributes to this device */
- sysfs_create_link(&class_dev->kobj, &parent_class->subsys.kset.kobj, "subsystem");
+ error = sysfs_create_link(&class_dev->kobj,
+ &parent_class->subsys.kset.kobj, "subsystem");
+ if (error)
+ goto out3;
class_dev->uevent_attr.attr.name = "uevent";
class_dev->uevent_attr.attr.mode = S_IWUSR;
class_dev->uevent_attr.attr.owner = parent_class->owner;
^ permalink raw reply [flat|nested] 18+ messages in thread
* [06/12] driver core fixes: bus_add_attrs() retval check
[not found] <20060913163007.21cf10a8@gondolin.boeblingen.de.ibm.com>
` (4 preceding siblings ...)
2006-09-13 16:38 ` [05/12] driver core fixes: sysfs_create_link() retval check in class.c Cornelia Huck
@ 2006-09-13 16:38 ` Cornelia Huck
2006-09-13 16:38 ` [07/12] driver core fixes: bus_add_device() cleanup on error Cornelia Huck
` (5 subsequent siblings)
11 siblings, 0 replies; 18+ messages in thread
From: Cornelia Huck @ 2006-09-13 16:38 UTC (permalink / raw)
To: Greg K-H; +Cc: linux-kernel
From: Cornelia Huck <cornelia.huck@de.ibm.com>
Check return value of bus_add_attrs() in bus_register().
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
bus.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
--- linux-2.6.18-rc6/drivers/base/bus.c 2006-09-12 14:15:16.000000000 +0200
+++ linux-2.6.18-rc6+CH/drivers/base/bus.c 2006-09-12 17:10:50.000000000 +0200
@@ -744,11 +744,15 @@ int bus_register(struct bus_type * bus)
klist_init(&bus->klist_devices, klist_devices_get, klist_devices_put);
klist_init(&bus->klist_drivers, klist_drivers_get, klist_drivers_put);
- bus_add_attrs(bus);
+ retval = bus_add_attrs(bus);
+ if (retval)
+ goto bus_attrs_fail;
pr_debug("bus type '%s' registered\n", bus->name);
return 0;
+bus_attrs_fail:
+ kset_unregister(&bus->drivers);
bus_drivers_fail:
kset_unregister(&bus->devices);
bus_devices_fail:
^ permalink raw reply [flat|nested] 18+ messages in thread
* [07/12] driver core fixes: bus_add_device() cleanup on error
[not found] <20060913163007.21cf10a8@gondolin.boeblingen.de.ibm.com>
` (5 preceding siblings ...)
2006-09-13 16:38 ` [06/12] driver core fixes: bus_add_attrs() retval check Cornelia Huck
@ 2006-09-13 16:38 ` Cornelia Huck
[not found] ` <1158168423.14312.16.camel@localhost>
2006-09-13 16:38 ` [08/12] driver core fixes: device_add() " Cornelia Huck
` (4 subsequent siblings)
11 siblings, 1 reply; 18+ messages in thread
From: Cornelia Huck @ 2006-09-13 16:38 UTC (permalink / raw)
To: Greg K-H; +Cc: linux-kernel
From: Cornelia Huck <cornelia.huck@de.ibm.com>
Correct cleanup in the error path of bus_add_device().
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
bus.c | 18 ++++++++++++++----
1 file changed, 14 insertions(+), 4 deletions(-)
--- linux-2.6.18-rc6/drivers/base/bus.c 2006-09-12 17:18:25.000000000 +0200
+++ linux-2.6.18-rc6+CH/drivers/base/bus.c 2006-09-12 17:17:47.000000000 +0200
@@ -372,18 +372,28 @@ int bus_add_device(struct device * dev)
pr_debug("bus %s: add device %s\n", bus->name, dev->bus_id);
error = device_add_attrs(bus, dev);
if (error)
- goto out;
+ goto out_put;
error = sysfs_create_link(&bus->devices.kobj,
&dev->kobj, dev->bus_id);
if (error)
- goto out;
+ goto out_id;
error = sysfs_create_link(&dev->kobj,
&dev->bus->subsys.kset.kobj, "subsystem");
if (error)
- goto out;
+ goto out_subsys;
error = sysfs_create_link(&dev->kobj,
&dev->bus->subsys.kset.kobj, "bus");
- }
+ if (!error)
+ goto out;
+ } else
+ goto out;
+ sysfs_remove_link(&dev->kobj, "subsystem");
+out_subsys:
+ sysfs_remove_link(&bus->devices.kobj, dev->bus_id);
+out_id:
+ device_remove_attrs(bus, dev);
+out_put:
+ put_bus(dev->bus);
out:
return error;
}
^ permalink raw reply [flat|nested] 18+ messages in thread
* [08/12] driver core fixes: device_add() cleanup on error
[not found] <20060913163007.21cf10a8@gondolin.boeblingen.de.ibm.com>
` (6 preceding siblings ...)
2006-09-13 16:38 ` [07/12] driver core fixes: bus_add_device() cleanup on error Cornelia Huck
@ 2006-09-13 16:38 ` Cornelia Huck
2006-09-13 16:38 ` [09/12] driver core fixes: bus_attach_device() retval check Cornelia Huck
` (3 subsequent siblings)
11 siblings, 0 replies; 18+ messages in thread
From: Cornelia Huck @ 2006-09-13 16:38 UTC (permalink / raw)
To: Greg K-H; +Cc: linux-kernel
From: Cornelia Huck <cornelia.huck@de.ibm.com>
Check for return code of device_create_file() and correct cleanup in
the error case in device_add().
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
core.c | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
--- linux-2.6.18-rc6/drivers/base/core.c 2006-09-12 16:19:43.000000000 +0200
+++ linux-2.6.18-rc6+CH/drivers/base/core.c 2006-09-12 18:27:55.000000000 +0200
@@ -406,14 +406,16 @@ int device_add(struct device *dev)
if (dev->driver)
dev->uevent_attr.attr.owner = dev->driver->owner;
dev->uevent_attr.store = store_uevent;
- device_create_file(dev, &dev->uevent_attr);
+ error = device_create_file(dev, &dev->uevent_attr);
+ if (error)
+ goto attrError;
if (MAJOR(dev->devt)) {
struct device_attribute *attr;
attr = kzalloc(sizeof(*attr), GFP_KERNEL);
if (!attr) {
error = -ENOMEM;
- goto PMError;
+ goto ueventattrError;
}
attr->attr.name = "dev";
attr->attr.mode = S_IRUGO;
@@ -423,7 +425,7 @@ int device_add(struct device *dev)
error = device_create_file(dev, attr);
if (error) {
kfree(attr);
- goto attrError;
+ goto ueventattrError;
}
dev->devt_attr = attr;
@@ -479,6 +481,8 @@ int device_add(struct device *dev)
device_remove_file(dev, dev->devt_attr);
kfree(dev->devt_attr);
}
+ ueventattrError:
+ device_remove_file(dev, &dev->uevent_attr);
attrError:
kobject_uevent(&dev->kobj, KOBJ_REMOVE);
kobject_del(&dev->kobj);
^ permalink raw reply [flat|nested] 18+ messages in thread
* [09/12] driver core fixes: bus_attach_device() retval check
[not found] <20060913163007.21cf10a8@gondolin.boeblingen.de.ibm.com>
` (7 preceding siblings ...)
2006-09-13 16:38 ` [08/12] driver core fixes: device_add() " Cornelia Huck
@ 2006-09-13 16:38 ` Cornelia Huck
2006-09-13 16:39 ` [10/12] driver core fixes: sysfs_create_link() retval check in core.c Cornelia Huck
` (2 subsequent siblings)
11 siblings, 0 replies; 18+ messages in thread
From: Cornelia Huck @ 2006-09-13 16:38 UTC (permalink / raw)
To: Greg K-H; +Cc: linux-kernel
From: Cornelia Huck <cornelia.huck@de.ibm.com>
Check for return value of bus_attach_device() in device_add(). Add a
function bus_delete_device() that undos the effects of bus_add_device().
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
base.h | 1 +
bus.c | 21 ++++++++++++++++++++-
core.c | 6 +++++-
3 files changed, 26 insertions(+), 2 deletions(-)
diff -Naurp linux-2.6.18-rc6/drivers/base/base.h linux-2.6.18-rc6+CH/drivers/base/base.h
--- linux-2.6.18-rc6/drivers/base/base.h 2006-09-12 14:15:16.000000000 +0200
+++ linux-2.6.18-rc6+CH/drivers/base/base.h 2006-09-12 18:42:08.000000000 +0200
@@ -17,6 +17,7 @@ extern int attribute_container_init(void
extern int bus_add_device(struct device * dev);
extern int bus_attach_device(struct device * dev);
+extern void bus_delete_device(struct device * dev);
extern void bus_remove_device(struct device * dev);
extern struct bus_type *get_bus(struct bus_type * bus);
extern void put_bus(struct bus_type * bus);
diff -Naurp linux-2.6.18-rc6/drivers/base/bus.c linux-2.6.18-rc6+CH/drivers/base/bus.c
--- linux-2.6.18-rc6/drivers/base/bus.c 2006-09-12 18:28:12.000000000 +0200
+++ linux-2.6.18-rc6+CH/drivers/base/bus.c 2006-09-12 18:44:24.000000000 +0200
@@ -360,7 +360,7 @@ static void device_remove_attrs(struct b
* bus_add_device - add device to bus
* @dev: device being added
*
- * - Add the device to its bus's list of devices.
+ * - Add attributes.
* - Create link to device's bus.
*/
int bus_add_device(struct device * dev)
@@ -420,6 +420,25 @@ int bus_attach_device(struct device * de
}
/**
+ * bus_delete_device - undo bus_add_device
+ * @dev: device being deleted
+ *
+ * - Remove symlink from bus's directory.
+ * - Remove attributes.
+ * - Drop reference taken in bus_add_device().
+ */
+void bus_delete_device(struct device * dev)
+{
+ if (dev->bus) {
+ sysfs_remove_link(&dev->kobj, "subsystem");
+ sysfs_remove_link(&dev->kobj, "bus");
+ sysfs_remove_link(&dev->bus->devices.kobj, dev->bus_id);
+ device_remove_attrs(dev->bus, dev);
+ put_bus(dev->bus);
+ }
+}
+
+/**
* bus_remove_device - remove device from bus
* @dev: device to be removed
*
diff -Naurp linux-2.6.18-rc6/drivers/base/core.c linux-2.6.18-rc6+CH/drivers/base/core.c
--- linux-2.6.18-rc6/drivers/base/core.c 2006-09-12 18:40:36.000000000 +0200
+++ linux-2.6.18-rc6+CH/drivers/base/core.c 2006-09-12 18:41:31.000000000 +0200
@@ -456,7 +456,9 @@ int device_add(struct device *dev)
if ((error = bus_add_device(dev)))
goto BusError;
kobject_uevent(&dev->kobj, KOBJ_ADD);
- bus_attach_device(dev);
+ error = bus_attach_device(dev);
+ if (error)
+ goto attachError;
if (parent)
klist_add_tail(&dev->knode_parent, &parent->klist_children);
@@ -470,6 +472,8 @@ int device_add(struct device *dev)
kfree(class_name);
put_device(dev);
return error;
+ attachError:
+ bus_delete_device(dev);
BusError:
device_pm_remove(dev);
PMError:
^ permalink raw reply [flat|nested] 18+ messages in thread
* [10/12] driver core fixes: sysfs_create_link() retval check in core.c
[not found] <20060913163007.21cf10a8@gondolin.boeblingen.de.ibm.com>
` (8 preceding siblings ...)
2006-09-13 16:38 ` [09/12] driver core fixes: bus_attach_device() retval check Cornelia Huck
@ 2006-09-13 16:39 ` Cornelia Huck
[not found] ` <1158168842.14312.18.camel@localhost>
2006-09-13 16:39 ` [11/12] driver core fixes: device_create_file() retval check in dmapool.c Cornelia Huck
2006-09-13 16:39 ` [12/12] driver core fixes: sysfs_create_group() retval in topology.c Cornelia Huck
11 siblings, 1 reply; 18+ messages in thread
From: Cornelia Huck @ 2006-09-13 16:39 UTC (permalink / raw)
To: Greg K-H; +Cc: linux-kernel
From: Cornelia Huck <cornelia.huck@de.ibm.com>
Check for return value of sysfs_create_link() in device_add() and
device_rename(). Add helper functions device_add_class_symlinks() and
device_remove_class_symlinks() to make the code easier to read.
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
core.c | 118 +++++++++++++++++++++++++++++++++++++++++++++++------------------
1 file changed, 87 insertions(+), 31 deletions(-)
--- linux-2.6.18-rc6/drivers/base/core.c 2006-09-12 18:50:10.000000000 +0200
+++ linux-2.6.18-rc6+CH/drivers/base/core.c 2006-09-13 10:29:33.000000000 +0200
@@ -357,6 +357,67 @@ void device_initialize(struct device *de
device_init_wakeup(dev, 0);
}
+static int device_add_class_symlinks(struct device *dev)
+{
+ int error;
+ char *class_name;
+
+ if (!dev->class)
+ return 0;
+ error = sysfs_create_link(&dev->kobj, &dev->class->subsys.kset.kobj,
+ "subsystem");
+ if (error)
+ goto out;
+ error = sysfs_create_link(&dev->class->subsys.kset.kobj, &dev->kobj,
+ dev->bus_id);
+ if (error)
+ goto out_subsys;
+ if (dev->parent) {
+ error = sysfs_create_link(&dev->kobj, &dev->parent->kobj,
+ "device");
+ if (error)
+ goto out_busid;
+ class_name = make_class_name(dev->class->name, &dev->kobj);
+ if (IS_ERR(class_name)) {
+ error = PTR_ERR(class_name);
+ goto out_busid;
+ }
+ error = sysfs_create_link(&dev->parent->kobj, &dev->kobj,
+ class_name);
+ kfree(class_name);
+ if (error)
+ goto out_device;
+ }
+ return error;
+out_device:
+ if (dev->parent)
+ sysfs_remove_link(&dev->kobj, "device");
+out_busid:
+ sysfs_remove_link(&dev->class->subsys.kset.kobj, dev->bus_id);
+out_subsys:
+ sysfs_remove_link(&dev->kobj, "subsystem");
+out:
+ return error;
+}
+
+static void device_remove_class_symlinks(struct device *dev)
+{
+ char *class_name = NULL;
+
+ if (!dev->class)
+ return;
+ if (dev->parent) {
+ class_name = make_class_name(dev->class->name, &dev->kobj);
+ if (!IS_ERR(class_name)) {
+ sysfs_remove_link(&dev->parent->kobj, class_name);
+ kfree(class_name);
+ }
+ sysfs_remove_link(&dev->kobj, "device");
+ }
+ sysfs_remove_link(&dev->class->subsys.kset.kobj, dev->bus_id);
+ sysfs_remove_link(&dev->kobj, "subsystem");
+}
+
/**
* device_add - add device to device hierarchy.
* @dev: device.
@@ -371,7 +432,6 @@ void device_initialize(struct device *de
int device_add(struct device *dev)
{
struct device *parent = NULL;
- char *class_name = NULL;
int error = -EINVAL;
dev = get_device(dev);
@@ -431,22 +491,8 @@ int device_add(struct device *dev)
dev->devt_attr = attr;
}
- if (dev->class) {
- sysfs_create_link(&dev->kobj, &dev->class->subsys.kset.kobj,
- "subsystem");
- sysfs_create_link(&dev->class->subsys.kset.kobj, &dev->kobj,
- dev->bus_id);
- if ((parent) && (!device_is_virtual(dev))) {
- sysfs_create_link(&dev->kobj, &dev->parent->kobj, "device");
- class_name = make_class_name(dev->class->name, &dev->kobj);
- if (!IS_ERR(class_name))
- sysfs_create_link(&dev->parent->kobj,
- &dev->kobj, class_name);
- else
- class_name = NULL;
- }
- }
-
+ if ((error = device_add_class_symlinks(dev)))
+ goto SymlinkError;
if ((error = device_add_attrs(dev)))
goto AttrsError;
if ((error = device_add_groups(dev)))
@@ -469,7 +515,6 @@ int device_add(struct device *dev)
up(&dev->class->sem);
}
Done:
- kfree(class_name);
put_device(dev);
return error;
attachError:
@@ -481,6 +526,8 @@ int device_add(struct device *dev)
GroupError:
device_remove_attrs(dev);
AttrsError:
+ device_remove_class_symlinks(dev);
+ SymlinkError:
if (dev->devt_attr) {
device_remove_file(dev, dev->devt_attr);
kfree(dev->devt_attr);
@@ -770,7 +817,7 @@ int device_rename(struct device *dev, ch
{
char *old_class_name = NULL;
char *new_class_name = NULL;
- char *old_symlink_name = NULL;
+ char *old_device_name = NULL;
int error;
dev = get_device(dev);
@@ -787,38 +834,47 @@ int device_rename(struct device *dev, ch
goto out;
}
}
- if (dev->class) {
- old_symlink_name = kmalloc(BUS_ID_SIZE, GFP_KERNEL);
- if (!old_symlink_name)
- return -ENOMEM;
- strlcpy(old_symlink_name, dev->bus_id, BUS_ID_SIZE);
+ old_device_name = kmalloc(BUS_ID_SIZE, GFP_KERNEL);
+ if (!old_device_name) {
+ error = -ENOMEM;
+ goto out;
}
-
+ strlcpy(old_device_name, dev->bus_id, BUS_ID_SIZE);
strlcpy(dev->bus_id, new_name, BUS_ID_SIZE);
error = kobject_rename(&dev->kobj, new_name);
-
+ if (error) {
+ strlcpy(dev->bus_id, old_device_name, BUS_ID_SIZE);
+ goto out;
+ }
if (old_class_name) {
new_class_name = make_class_name(dev->class->name, &dev->kobj);
if (!IS_ERR(new_class_name)) {
- sysfs_create_link(&dev->parent->kobj, &dev->kobj,
+ error = sysfs_create_link(&dev->parent->kobj, &dev->kobj,
new_class_name);
+ if (error)
+ goto out;
sysfs_remove_link(&dev->parent->kobj, old_class_name);
} else
new_class_name = NULL;
}
if (dev->class) {
sysfs_remove_link(&dev->class->subsys.kset.kobj,
- old_symlink_name);
- sysfs_create_link(&dev->class->subsys.kset.kobj, &dev->kobj,
- dev->bus_id);
+ old_device_name);
+ error = sysfs_create_link(&dev->class->subsys.kset.kobj,
+ &dev->kobj, dev->bus_id);
+ if (error) {
+ /* Uh... how to unravel this if restoring can fail? */
+ dev_err(dev, "%s: sysfs_create_symlink failed (%d)\n",
+ __FUNCTION__, error);
+ }
}
out:
put_device(dev);
kfree(old_class_name);
kfree(new_class_name);
- kfree(old_symlink_name);
+ kfree(old_device_name);
return error;
}
^ permalink raw reply [flat|nested] 18+ messages in thread
* [11/12] driver core fixes: device_create_file() retval check in dmapool.c
[not found] <20060913163007.21cf10a8@gondolin.boeblingen.de.ibm.com>
` (9 preceding siblings ...)
2006-09-13 16:39 ` [10/12] driver core fixes: sysfs_create_link() retval check in core.c Cornelia Huck
@ 2006-09-13 16:39 ` Cornelia Huck
2006-09-13 16:39 ` [12/12] driver core fixes: sysfs_create_group() retval in topology.c Cornelia Huck
11 siblings, 0 replies; 18+ messages in thread
From: Cornelia Huck @ 2006-09-13 16:39 UTC (permalink / raw)
To: Greg K-H; +Cc: linux-kernel
From: Cornelia Huck <cornelia.huck@de.ibm.com>
Check for device_create_file() return value in dma_pool_create().
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
dmapool.c | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
--- linux-2.6.18-rc6/drivers/base/dmapool.c 2006-09-13 10:55:47.000000000 +0200
+++ linux-2.6.18-rc6+CH/drivers/base/dmapool.c 2006-09-13 10:55:03.000000000 +0200
@@ -141,11 +141,20 @@ dma_pool_create (const char *name, struc
init_waitqueue_head (&retval->waitq);
if (dev) {
+ int ret;
+
down (&pools_lock);
if (list_empty (&dev->dma_pools))
- device_create_file (dev, &dev_attr_pools);
+ ret = device_create_file (dev, &dev_attr_pools);
+ else
+ ret = 0;
/* note: not currently insisting "name" be unique */
- list_add (&retval->pools, &dev->dma_pools);
+ if (!ret)
+ list_add (&retval->pools, &dev->dma_pools);
+ else {
+ kfree(retval);
+ retval = NULL;
+ }
up (&pools_lock);
} else
INIT_LIST_HEAD (&retval->pools);
^ permalink raw reply [flat|nested] 18+ messages in thread
* [12/12] driver core fixes: sysfs_create_group() retval in topology.c
[not found] <20060913163007.21cf10a8@gondolin.boeblingen.de.ibm.com>
` (10 preceding siblings ...)
2006-09-13 16:39 ` [11/12] driver core fixes: device_create_file() retval check in dmapool.c Cornelia Huck
@ 2006-09-13 16:39 ` Cornelia Huck
11 siblings, 0 replies; 18+ messages in thread
From: Cornelia Huck @ 2006-09-13 16:39 UTC (permalink / raw)
To: Greg K-H; +Cc: linux-kernel
From: Cornelia Huck <cornelia.huck@de.ibm.com>
Return the return value of sysfs_create_group() in topology_add_dev().
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
topology.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
--- linux-2.6.18-rc6/drivers/base/topology.c 2006-09-04 04:19:48.000000000 +0200
+++ linux-2.6.18-rc6+CH/drivers/base/topology.c 2006-09-13 10:53:29.000000000 +0200
@@ -97,8 +97,7 @@ static struct attribute_group topology_a
/* Add/Remove cpu_topology interface for CPU device */
static int __cpuinit topology_add_dev(struct sys_device * sys_dev)
{
- sysfs_create_group(&sys_dev->kobj, &topology_attr_group);
- return 0;
+ return sysfs_create_group(&sys_dev->kobj, &topology_attr_group);
}
static int __cpuinit topology_remove_dev(struct sys_device * sys_dev)
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [03/12] driver core fixes: fixup platform_device_register_simple()
2006-09-13 16:38 ` [03/12] driver core fixes: fixup platform_device_register_simple() Cornelia Huck
@ 2006-09-14 2:31 ` Dmitry Torokhov
2006-09-14 7:06 ` Cornelia Huck
0 siblings, 1 reply; 18+ messages in thread
From: Dmitry Torokhov @ 2006-09-14 2:31 UTC (permalink / raw)
To: Cornelia Huck; +Cc: Greg K-H, linux-kernel
Hi,
On Wednesday 13 September 2006 12:38, Cornelia Huck wrote:
> From: Cornelia Huck <cornelia.huck@de.ibm.com>
>
> Remember to remove allocated resources if platform_device_add() fails.
> Introduce a helper function platform_device_del_resources() for this,
> which can also be used by platform_device_del().
>
platform_device_add() already releases all resources in case of failure.
Memory allocated for resource structures is released by
platform_device_release(). I do not think this patch is needed.
As fas as platform_device_register_somple() goes it should just die and
users should be converted to platofrm_device_alloc/add.
--
Dmitry
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [03/12] driver core fixes: fixup platform_device_register_simple()
2006-09-14 2:31 ` Dmitry Torokhov
@ 2006-09-14 7:06 ` Cornelia Huck
0 siblings, 0 replies; 18+ messages in thread
From: Cornelia Huck @ 2006-09-14 7:06 UTC (permalink / raw)
To: Dmitry Torokhov; +Cc: Greg K-H, linux-kernel
On Wed, 13 Sep 2006 22:31:05 -0400,
Dmitry Torokhov <dtor@insightbb.com> wrote:
> platform_device_add() already releases all resources in case of failure.
> Memory allocated for resource structures is released by
> platform_device_release(). I do not think this patch is needed.
Uh, of course, you're right.
Greg, please disregard this patch.
--
Cornelia Huck
Linux for zSeries Developer
Tel.: +49-7031-16-4837, Mail: cornelia.huck@de.ibm.com
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [07/12] driver core fixes: bus_add_device() cleanup on error
[not found] ` <1158168423.14312.16.camel@localhost>
@ 2006-09-14 7:40 ` Cornelia Huck
0 siblings, 0 replies; 18+ messages in thread
From: Cornelia Huck @ 2006-09-14 7:40 UTC (permalink / raw)
To: Joe Perches; +Cc: Greg K-H, linux-kernel
On Wed, 13 Sep 2006 10:27:02 -0700,
Joe Perches <joe@perches.com> wrote:
> better to have a separate error return and a no error return
How about this one?
From: Cornelia Huck <cornelia.huck@de.ibm.com>
Correct cleanup in the error path of bus_add_device().
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
bus.c | 20 ++++++++++++++++----
1 file changed, 16 insertions(+), 4 deletions(-)
--- linux-2.6.18-rc6/drivers/base/bus.c 2006-09-14 09:32:16.000000000 +0200
+++ linux-2.6.18-rc6+CH/drivers/base/bus.c 2006-09-14 09:35:30.000000000 +0200
@@ -372,19 +372,31 @@ int bus_add_device(struct device * dev)
pr_debug("bus %s: add device %s\n", bus->name, dev->bus_id);
error = device_add_attrs(bus, dev);
if (error)
- goto out;
+ goto out_put;
error = sysfs_create_link(&bus->devices.kobj,
&dev->kobj, dev->bus_id);
if (error)
- goto out;
+ goto out_id;
error = sysfs_create_link(&dev->kobj,
&dev->bus->subsys.kset.kobj, "subsystem");
if (error)
- goto out;
+ goto out_subsys;
error = sysfs_create_link(&dev->kobj,
&dev->bus->subsys.kset.kobj, "bus");
+ if (error)
+ goto out_create;
+ put_bus(dev->bus);
}
-out:
+ return 0;
+
+out_create:
+ sysfs_remove_link(&dev->kobj, "subsystem");
+out_subsys:
+ sysfs_remove_link(&bus->devices.kobj, dev->bus_id);
+out_id:
+ device_remove_attrs(bus, dev);
+out_put:
+ put_bus(dev->bus);
return error;
}
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [10/12] driver core fixes: sysfs_create_link() retval check in core.c
[not found] ` <1158168842.14312.18.camel@localhost>
@ 2006-09-14 7:43 ` Cornelia Huck
0 siblings, 0 replies; 18+ messages in thread
From: Cornelia Huck @ 2006-09-14 7:43 UTC (permalink / raw)
To: Joe Perches; +Cc: Greg K-H, linux-kernel
On Wed, 13 Sep 2006 10:34:02 -0700,
Joe Perches <joe@perches.com> wrote:
> Please make these styles return 0;
Like this?
From: Cornelia Huck <cornelia.huck@de.ibm.com>
Check for return value of sysfs_create_link() in device_add() and
device_rename(). Add helper functions device_add_class_symlinks() and
device_remove_class_symlinks() to make the code easier to read.
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
core.c | 118 +++++++++++++++++++++++++++++++++++++++++++++++------------------
1 file changed, 87 insertions(+), 31 deletions(-)
--- linux-2.6.18-rc6/drivers/base/core.c 2006-09-12 18:50:10.000000000 +0200
+++ linux-2.6.18-rc6+CH/drivers/base/core.c 2006-09-13 10:29:33.000000000 +0200
@@ -357,6 +357,67 @@ void device_initialize(struct device *de
device_init_wakeup(dev, 0);
}
+static int device_add_class_symlinks(struct device *dev)
+{
+ int error;
+ char *class_name;
+
+ if (!dev->class)
+ return 0;
+ error = sysfs_create_link(&dev->kobj, &dev->class->subsys.kset.kobj,
+ "subsystem");
+ if (error)
+ goto out;
+ error = sysfs_create_link(&dev->class->subsys.kset.kobj, &dev->kobj,
+ dev->bus_id);
+ if (error)
+ goto out_subsys;
+ if (dev->parent) {
+ error = sysfs_create_link(&dev->kobj, &dev->parent->kobj,
+ "device");
+ if (error)
+ goto out_busid;
+ class_name = make_class_name(dev->class->name, &dev->kobj);
+ if (IS_ERR(class_name)) {
+ error = PTR_ERR(class_name);
+ goto out_busid;
+ }
+ error = sysfs_create_link(&dev->parent->kobj, &dev->kobj,
+ class_name);
+ kfree(class_name);
+ if (error)
+ goto out_device;
+ }
+ return 0;
+out_device:
+ if (dev->parent)
+ sysfs_remove_link(&dev->kobj, "device");
+out_busid:
+ sysfs_remove_link(&dev->class->subsys.kset.kobj, dev->bus_id);
+out_subsys:
+ sysfs_remove_link(&dev->kobj, "subsystem");
+out:
+ return error;
+}
+
+static void device_remove_class_symlinks(struct device *dev)
+{
+ char *class_name = NULL;
+
+ if (!dev->class)
+ return;
+ if (dev->parent) {
+ class_name = make_class_name(dev->class->name, &dev->kobj);
+ if (!IS_ERR(class_name)) {
+ sysfs_remove_link(&dev->parent->kobj, class_name);
+ kfree(class_name);
+ }
+ sysfs_remove_link(&dev->kobj, "device");
+ }
+ sysfs_remove_link(&dev->class->subsys.kset.kobj, dev->bus_id);
+ sysfs_remove_link(&dev->kobj, "subsystem");
+}
+
/**
* device_add - add device to device hierarchy.
* @dev: device.
@@ -371,7 +432,6 @@ void device_initialize(struct device *de
int device_add(struct device *dev)
{
struct device *parent = NULL;
- char *class_name = NULL;
int error = -EINVAL;
dev = get_device(dev);
@@ -431,22 +491,8 @@ int device_add(struct device *dev)
dev->devt_attr = attr;
}
- if (dev->class) {
- sysfs_create_link(&dev->kobj, &dev->class->subsys.kset.kobj,
- "subsystem");
- sysfs_create_link(&dev->class->subsys.kset.kobj, &dev->kobj,
- dev->bus_id);
- if ((parent) && (!device_is_virtual(dev))) {
- sysfs_create_link(&dev->kobj, &dev->parent->kobj, "device");
- class_name = make_class_name(dev->class->name, &dev->kobj);
- if (!IS_ERR(class_name))
- sysfs_create_link(&dev->parent->kobj,
- &dev->kobj, class_name);
- else
- class_name = NULL;
- }
- }
-
+ if ((error = device_add_class_symlinks(dev)))
+ goto SymlinkError;
if ((error = device_add_attrs(dev)))
goto AttrsError;
if ((error = device_add_groups(dev)))
@@ -469,7 +515,6 @@ int device_add(struct device *dev)
up(&dev->class->sem);
}
Done:
- kfree(class_name);
put_device(dev);
return error;
attachError:
@@ -481,6 +526,8 @@ int device_add(struct device *dev)
GroupError:
device_remove_attrs(dev);
AttrsError:
+ device_remove_class_symlinks(dev);
+ SymlinkError:
if (dev->devt_attr) {
device_remove_file(dev, dev->devt_attr);
kfree(dev->devt_attr);
@@ -770,7 +817,7 @@ int device_rename(struct device *dev, ch
{
char *old_class_name = NULL;
char *new_class_name = NULL;
- char *old_symlink_name = NULL;
+ char *old_device_name = NULL;
int error;
dev = get_device(dev);
@@ -787,38 +834,47 @@ int device_rename(struct device *dev, ch
goto out;
}
}
- if (dev->class) {
- old_symlink_name = kmalloc(BUS_ID_SIZE, GFP_KERNEL);
- if (!old_symlink_name)
- return -ENOMEM;
- strlcpy(old_symlink_name, dev->bus_id, BUS_ID_SIZE);
+ old_device_name = kmalloc(BUS_ID_SIZE, GFP_KERNEL);
+ if (!old_device_name) {
+ error = -ENOMEM;
+ goto out;
}
-
+ strlcpy(old_device_name, dev->bus_id, BUS_ID_SIZE);
strlcpy(dev->bus_id, new_name, BUS_ID_SIZE);
error = kobject_rename(&dev->kobj, new_name);
-
+ if (error) {
+ strlcpy(dev->bus_id, old_device_name, BUS_ID_SIZE);
+ goto out;
+ }
if (old_class_name) {
new_class_name = make_class_name(dev->class->name, &dev->kobj);
if (!IS_ERR(new_class_name)) {
- sysfs_create_link(&dev->parent->kobj, &dev->kobj,
+ error = sysfs_create_link(&dev->parent->kobj, &dev->kobj,
new_class_name);
+ if (error)
+ goto out;
sysfs_remove_link(&dev->parent->kobj, old_class_name);
} else
new_class_name = NULL;
}
if (dev->class) {
sysfs_remove_link(&dev->class->subsys.kset.kobj,
- old_symlink_name);
- sysfs_create_link(&dev->class->subsys.kset.kobj, &dev->kobj,
- dev->bus_id);
+ old_device_name);
+ error = sysfs_create_link(&dev->class->subsys.kset.kobj,
+ &dev->kobj, dev->bus_id);
+ if (error) {
+ /* Uh... how to unravel this if restoring can fail? */
+ dev_err(dev, "%s: sysfs_create_symlink failed (%d)\n",
+ __FUNCTION__, error);
+ }
}
out:
put_device(dev);
kfree(old_class_name);
kfree(new_class_name);
- kfree(old_symlink_name);
+ kfree(old_device_name);
return error;
}
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [01/12] driver core fixes: make_class_name() retval check
2006-09-13 16:38 ` [01/12] driver core fixes: make_class_name() retval check Cornelia Huck
@ 2006-09-14 12:01 ` Martin Waitz
2006-09-15 11:20 ` Cornelia Huck
0 siblings, 1 reply; 18+ messages in thread
From: Martin Waitz @ 2006-09-14 12:01 UTC (permalink / raw)
To: Cornelia Huck; +Cc: Greg K-H, linux-kernel
[-- Attachment #1: Type: text/plain, Size: 445 bytes --]
hoi :)
On Wed, Sep 13, 2006 at 06:38:34PM +0200, Cornelia Huck wrote:
> if (class_dev->dev) {
> class_name = make_class_name(class_dev->class->name,
> &class_dev->kobj);
> + if (IS_ERR(class_name)) {
> + error = PTR_ERR(class_name);
> + class_name = NULL;
> + goto out6;
> + }
perhaps it makes sense to return NULL in make_class_name on error,
to have consistent error return values?
--
Martin Waitz
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [01/12] driver core fixes: make_class_name() retval check
2006-09-14 12:01 ` Martin Waitz
@ 2006-09-15 11:20 ` Cornelia Huck
0 siblings, 0 replies; 18+ messages in thread
From: Cornelia Huck @ 2006-09-15 11:20 UTC (permalink / raw)
To: Martin Waitz; +Cc: Greg K-H, linux-kernel
On Thu, 14 Sep 2006 14:01:33 +0200,
Martin Waitz <tali@admingilde.org> wrote:
> perhaps it makes sense to return NULL in make_class_name on error,
> to have consistent error return values?
It should make the code a bit nicer, I think. But I'm not sure if it's
worth the hassle (config_sysfs_deprecated.patch moves make_class_name()
under CONFIG_SYSFS_DEPRECATED).
Anyway, here is a patch against the latest version of Greg's tree:
From: Cornelia Huck <cornelia.huck@de.ibm.com>
Make make_class_name() return NULL on error and fixup callers in the
driver core.
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
class.c | 12 ++++++++----
core.c | 7 +++++--
2 files changed, 13 insertions(+), 6 deletions(-)
diff -Naurp linux-2.6.18-rc7/drivers/base/class.c linux-2.6.18-rc7+CH/drivers/base/class.c
--- linux-2.6.18-rc7/drivers/base/class.c 2006-09-15 10:38:55.000000000 +0200
+++ linux-2.6.18-rc7+CH/drivers/base/class.c 2006-09-15 12:18:30.000000000 +0200
@@ -360,7 +360,7 @@ char *make_class_name(const char *name,
class_name = kmalloc(size, GFP_KERNEL);
if (!class_name)
- return ERR_PTR(-ENOMEM);
+ return NULL;
strcpy(class_name, name);
strcat(class_name, ":");
@@ -407,8 +407,11 @@ static int make_deprecated_class_device_
return 0;
class_name = make_class_name(class_dev->class->name, &class_dev->kobj);
- error = sysfs_create_link(&class_dev->dev->kobj, &class_dev->kobj,
- class_name);
+ if (!class_name)
+ error = sysfs_create_link(&class_dev->dev->kobj,
+ &class_dev->kobj, class_name);
+ else
+ error = -ENOMEM;
kfree(class_name);
return error;
}
@@ -769,7 +772,8 @@ void class_device_del(struct class_devic
#ifdef CONFIG_SYSFS_DEPRECATED
class_name = make_class_name(class_dev->class->name,
&class_dev->kobj);
- sysfs_remove_link(&class_dev->dev->kobj, class_name);
+ if (class_name)
+ sysfs_remove_link(&class_dev->dev->kobj, class_name);
#endif
sysfs_remove_link(&class_dev->kobj, "device");
}
diff -Naurp linux-2.6.18-rc7/drivers/base/core.c linux-2.6.18-rc7+CH/drivers/base/core.c
--- linux-2.6.18-rc7/drivers/base/core.c 2006-09-15 10:39:03.000000000 +0200
+++ linux-2.6.18-rc7+CH/drivers/base/core.c 2006-09-15 11:01:58.000000000 +0200
@@ -443,7 +443,9 @@ int device_add(struct device *dev)
if ((parent) && (!device_is_virtual(dev))) {
sysfs_create_link(&dev->kobj, &dev->parent->kobj, "device");
class_name = make_class_name(dev->class->name, &dev->kobj);
- sysfs_create_link(&dev->parent->kobj, &dev->kobj, class_name);
+ if (class_name)
+ sysfs_create_link(&dev->parent->kobj,
+ &dev->kobj, class_name);
}
#endif
}
@@ -574,7 +576,8 @@ void device_del(struct device * dev)
char *class_name = NULL;
class_name = make_class_name(dev->class->name, &dev->kobj);
- sysfs_remove_link(&dev->parent->kobj, class_name);
+ if (class_name)
+ sysfs_remove_link(&dev->parent->kobj, class_name);
kfree(class_name);
#endif
sysfs_remove_link(&dev->kobj, "device");
^ permalink raw reply [flat|nested] 18+ messages in thread
end of thread, other threads:[~2006-09-15 11:20 UTC | newest]
Thread overview: 18+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20060913163007.21cf10a8@gondolin.boeblingen.de.ibm.com>
2006-09-13 16:38 ` [01/12] driver core fixes: make_class_name() retval check Cornelia Huck
2006-09-14 12:01 ` Martin Waitz
2006-09-15 11:20 ` Cornelia Huck
2006-09-13 16:38 ` [02/12] driver core fixes: device_register() retval check in platform.c Cornelia Huck
2006-09-13 16:38 ` [03/12] driver core fixes: fixup platform_device_register_simple() Cornelia Huck
2006-09-14 2:31 ` Dmitry Torokhov
2006-09-14 7:06 ` Cornelia Huck
2006-09-13 16:38 ` [04/12] driver core fixes: retval check in class_register() Cornelia Huck
2006-09-13 16:38 ` [05/12] driver core fixes: sysfs_create_link() retval check in class.c Cornelia Huck
2006-09-13 16:38 ` [06/12] driver core fixes: bus_add_attrs() retval check Cornelia Huck
2006-09-13 16:38 ` [07/12] driver core fixes: bus_add_device() cleanup on error Cornelia Huck
[not found] ` <1158168423.14312.16.camel@localhost>
2006-09-14 7:40 ` Cornelia Huck
2006-09-13 16:38 ` [08/12] driver core fixes: device_add() " Cornelia Huck
2006-09-13 16:38 ` [09/12] driver core fixes: bus_attach_device() retval check Cornelia Huck
2006-09-13 16:39 ` [10/12] driver core fixes: sysfs_create_link() retval check in core.c Cornelia Huck
[not found] ` <1158168842.14312.18.camel@localhost>
2006-09-14 7:43 ` Cornelia Huck
2006-09-13 16:39 ` [11/12] driver core fixes: device_create_file() retval check in dmapool.c Cornelia Huck
2006-09-13 16:39 ` [12/12] driver core fixes: sysfs_create_group() retval in topology.c Cornelia Huck
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox