* [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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.