Messages in this thread Patch in this message | | | Date | Tue, 27 Feb 2007 23:04:59 +0900 | From | "Akinobu Mita" <> | Subject | [PATCH 3/3] driver core: check sysfs_create_link() errors |
| |
This patch kills __must_check warnings for missing sysfs_create_link().
Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com> Cc: Greg Kroah-Hartman <gregkh@suse.de>
--- drivers/base/core.c | 59 +++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 45 insertions(+), 14 deletions(-)
Index: 2.6-mm/drivers/base/core.c =================================================================== --- 2.6-mm.orig/drivers/base/core.c +++ 2.6-mm/drivers/base/core.c @@ -487,31 +487,61 @@ static int setup_parent(struct device *d return 0; }
-static void device_add_links(struct device *dev, struct device *parent) +static int device_add_links(struct device *dev, struct device *parent) { + int err; + if (dev->class) { - sysfs_create_link(&dev->kobj, &dev->class->subsys.kset.kobj, - "subsystem"); + err = sysfs_create_link(&dev->kobj, + &dev->class->subsys.kset.kobj, + "subsystem"); + if (err) + return err; + /* If this is not a "fake" compatible device, then create the * symlink from the class to the device. */ - if (dev->kobj.parent != &dev->class->subsys.kset.kobj) - sysfs_create_link(&dev->class->subsys.kset.kobj, - &dev->kobj, dev->bus_id); + if (dev->kobj.parent != &dev->class->subsys.kset.kobj) { + err = sysfs_create_link(&dev->class->subsys.kset.kobj, + &dev->kobj, dev->bus_id); + if (err) + goto out1; + } #ifdef CONFIG_SYSFS_DEPRECATED if (parent) { char *class_name = NULL;
- sysfs_create_link(&dev->kobj, &dev->parent->kobj, - "device"); + err = sysfs_create_link(&dev->kobj, &dev->parent->kobj, + "device"); + if (err) + goto out2; class_name = make_class_name(dev->class->name, &dev->kobj); - if (class_name) - sysfs_create_link(&dev->parent->kobj, - &dev->kobj, class_name); + if (class_name) { + err = sysfs_create_link(&dev->parent->kobj, + &dev->kobj, class_name); + if (err) { + kfree(class_name); + goto out3; + } + + } kfree(class_name); } #endif } + + return 0; + +#ifdef CONFIG_SYSFS_DEPRECATED +out3: + sysfs_remove_link(&dev->kobj, "device"); +out2: +#endif + sysfs_remove_link(&dev->class->subsys.kset.kobj, dev->bus_id); +out1: + sysfs_remove_link(&dev->kobj, "subsystem"); + + return err; }
static void device_remove_links(struct device *dev, struct device *parent) @@ -611,8 +641,9 @@ int device_add(struct device *dev) dev->devt_attr = attr; }
- device_add_links(dev, parent); - + error = device_add_links(dev, parent); + if (error) + goto LinksError; if ((error = device_add_attrs(dev))) goto AttrsError; if ((error = device_add_groups(dev))) @@ -652,7 +683,7 @@ int device_add(struct device *dev) device_remove_attrs(dev); AttrsError: device_remove_links(dev, parent); - + LinksError: if (dev->devt_attr) { device_remove_file(dev, dev->devt_attr); kfree(dev->devt_attr); - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |