diff options
author | Greg Kroah-Hartman <gregkh@suse.de> | 2006-06-20 13:59:20 -0700 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2006-06-21 12:40:49 -0700 |
commit | e9a7d305faec364ba973d6c22c9b1e802ef79204 (patch) | |
tree | 1bd38fb8f39d4895734885fd7b6f52c14222e481 /drivers/base/core.c | |
parent | b9d9c82b4d081feb464f62dfc786c8621d09ecd2 (diff) | |
download | op-kernel-dev-e9a7d305faec364ba973d6c22c9b1e802ef79204.zip op-kernel-dev-e9a7d305faec364ba973d6c22c9b1e802ef79204.tar.gz |
[PATCH] Driver core: add proper symlinks for devices
We need to create the "compatible" symlinks that class_devices used to
create when they were in the class directories so that userspace does
not know anything changed at all.
Yeah, we have a lot of symlinks now, but we should be able to get rid of
them in a year or two... (wishful thinking...)
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/base/core.c')
-rw-r--r-- | drivers/base/core.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/base/core.c b/drivers/base/core.c index cc8bb97..a979bc3 100644 --- a/drivers/base/core.c +++ b/drivers/base/core.c @@ -273,6 +273,7 @@ void device_initialize(struct device *dev) int device_add(struct device *dev) { struct device *parent = NULL; + char *class_name = NULL; int error = -EINVAL; dev = get_device(dev); @@ -324,6 +325,10 @@ int device_add(struct device *dev) "subsystem"); sysfs_create_link(&dev->class->subsys.kset.kobj, &dev->kobj, dev->bus_id); + + 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 ((error = device_pm_add(dev))) @@ -339,6 +344,7 @@ int device_add(struct device *dev) if (platform_notify) platform_notify(dev); Done: + kfree(class_name); put_device(dev); return error; BusError: @@ -420,6 +426,7 @@ void put_device(struct device * dev) void device_del(struct device * dev) { struct device * parent = dev->parent; + char *class_name = NULL; if (parent) klist_del(&dev->knode_parent); @@ -428,6 +435,10 @@ 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); + sysfs_remove_link(&dev->kobj, "device"); + sysfs_remove_link(&dev->parent->kobj, class_name); + kfree(class_name); } device_remove_file(dev, &dev->uevent_attr); |