diff options
| author | Dmitry Torokhov <dtor@insightbb.com> | 2007-09-19 01:46:50 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-09-19 14:24:18 -0400 |
| commit | 4f01a757e75f2a3cab2bab89c4176498963946b9 (patch) | |
| tree | b5773a393a60adb13021f5d1a02aff4e49cddc57 /drivers | |
| parent | 508a92741a105e2e3d466cd727fb73154ebf08de (diff) | |
Driver core: fix deprectated sysfs structure for nested class devices
Nested class devices used to have 'device' symlink point to a real
(physical) device instead of a parent class device. When converting
subsystems to struct device we need to keep doing what class devices did if
CONFIG_SYSFS_DEPRECATED is Y, otherwise parts of udev break.
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
Cc: Kay Sievers <kay.sievers@vrfy.org>
Acked-by: Greg KH <greg@kroah.com>
Tested-by: Anssi Hannula <anssi.hannula@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/base/core.c | 29 |
1 files changed, 23 insertions, 6 deletions
diff --git a/drivers/base/core.c b/drivers/base/core.c index e6738bcbe5a9..6de33d7a29ba 100644 --- a/drivers/base/core.c +++ b/drivers/base/core.c | |||
| @@ -679,14 +679,26 @@ static int device_add_class_symlinks(struct device *dev) | |||
| 679 | goto out_subsys; | 679 | goto out_subsys; |
| 680 | } | 680 | } |
| 681 | if (dev->parent) { | 681 | if (dev->parent) { |
| 682 | error = sysfs_create_link(&dev->kobj, &dev->parent->kobj, | ||
| 683 | "device"); | ||
| 684 | if (error) | ||
| 685 | goto out_busid; | ||
| 686 | #ifdef CONFIG_SYSFS_DEPRECATED | 682 | #ifdef CONFIG_SYSFS_DEPRECATED |
| 687 | { | 683 | { |
| 688 | char * class_name = make_class_name(dev->class->name, | 684 | struct device *parent = dev->parent; |
| 689 | &dev->kobj); | 685 | char *class_name; |
| 686 | |||
| 687 | /* | ||
| 688 | * In old sysfs stacked class devices had 'device' | ||
| 689 | * link pointing to real device instead of parent | ||
| 690 | */ | ||
| 691 | while (parent->class && !parent->bus && parent->parent) | ||
| 692 | parent = parent->parent; | ||
| 693 | |||
| 694 | error = sysfs_create_link(&dev->kobj, | ||
| 695 | &parent->kobj, | ||
| 696 | "device"); | ||
| 697 | if (error) | ||
| 698 | goto out_busid; | ||
| 699 | |||
| 700 | class_name = make_class_name(dev->class->name, | ||
| 701 | &dev->kobj); | ||
| 690 | if (class_name) | 702 | if (class_name) |
| 691 | error = sysfs_create_link(&dev->parent->kobj, | 703 | error = sysfs_create_link(&dev->parent->kobj, |
| 692 | &dev->kobj, class_name); | 704 | &dev->kobj, class_name); |
| @@ -694,6 +706,11 @@ static int device_add_class_symlinks(struct device *dev) | |||
| 694 | if (error) | 706 | if (error) |
| 695 | goto out_device; | 707 | goto out_device; |
| 696 | } | 708 | } |
| 709 | #else | ||
| 710 | error = sysfs_create_link(&dev->kobj, &dev->parent->kobj, | ||
| 711 | "device"); | ||
| 712 | if (error) | ||
| 713 | goto out_busid; | ||
| 697 | #endif | 714 | #endif |
| 698 | } | 715 | } |
| 699 | return 0; | 716 | return 0; |
