Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4f01a757 authored by Dmitry Torokhov's avatar Dmitry Torokhov Committed by Linus Torvalds
Browse files

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: default avatarDmitry Torokhov <dtor@mail.ru>
Cc: Kay Sievers <kay.sievers@vrfy.org>
Acked-by: default avatarGreg KH <greg@kroah.com>
Tested-by: default avatarAnssi Hannula <anssi.hannula@gmail.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 508a9274
Loading
Loading
Loading
Loading
+23 −6
Original line number Diff line number Diff line
@@ -679,13 +679,25 @@ static int device_add_class_symlinks(struct device *dev)
			goto out_subsys;
	}
	if (dev->parent) {
		error = sysfs_create_link(&dev->kobj, &dev->parent->kobj,
#ifdef CONFIG_SYSFS_DEPRECATED
		{
			struct device *parent = dev->parent;
			char *class_name;

			/*
			 * In old sysfs stacked class devices had 'device'
			 * link pointing to real device instead of parent
			 */
			while (parent->class && !parent->bus && parent->parent)
				parent = parent->parent;

			error = sysfs_create_link(&dev->kobj,
						  &parent->kobj,
						  "device");
			if (error)
				goto out_busid;
#ifdef CONFIG_SYSFS_DEPRECATED
		{
			char * class_name = make_class_name(dev->class->name,

			class_name = make_class_name(dev->class->name,
							&dev->kobj);
			if (class_name)
				error = sysfs_create_link(&dev->parent->kobj,
@@ -694,6 +706,11 @@ static int device_add_class_symlinks(struct device *dev)
			if (error)
				goto out_device;
		}
#else
		error = sysfs_create_link(&dev->kobj, &dev->parent->kobj,
					  "device");
		if (error)
			goto out_busid;
#endif
	}
	return 0;