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

Commit a2de48ca authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman
Browse files

Driver core: add device_rename function



The network layer needs this to convert to using struct device instead
of a struct class_device.

Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 2620efef
Loading
Loading
Loading
Loading
+55 −0
Original line number Original line Diff line number Diff line
@@ -736,3 +736,58 @@ void device_destroy(struct class *class, dev_t devt)
		device_unregister(dev);
		device_unregister(dev);
}
}
EXPORT_SYMBOL_GPL(device_destroy);
EXPORT_SYMBOL_GPL(device_destroy);

/**
 * device_rename - renames a device
 * @dev: the pointer to the struct device to be renamed
 * @new_name: the new name of the device
 */
int device_rename(struct device *dev, char *new_name)
{
	char *old_class_name = NULL;
	char *new_class_name = NULL;
	char *old_symlink_name = NULL;
	int error;

	dev = get_device(dev);
	if (!dev)
		return -EINVAL;

	pr_debug("DEVICE: renaming '%s' to '%s'\n", dev->bus_id, new_name);

	if ((dev->class) && (dev->parent))
		old_class_name = make_class_name(dev->class->name, &dev->kobj);

	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);
	}

	strlcpy(dev->bus_id, new_name, BUS_ID_SIZE);

	error = kobject_rename(&dev->kobj, new_name);

	if (old_class_name) {
		new_class_name = make_class_name(dev->class->name, &dev->kobj);
		if (new_class_name) {
			sysfs_create_link(&dev->parent->kobj, &dev->kobj,
					  new_class_name);
			sysfs_remove_link(&dev->parent->kobj, old_class_name);
		}
	}
	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);
	}
	put_device(dev);

	kfree(old_class_name);
	kfree(new_class_name);
	kfree(old_symlink_name);

	return error;
}
+1 −0
Original line number Original line Diff line number Diff line
@@ -380,6 +380,7 @@ extern int device_add(struct device * dev);
extern void device_del(struct device * dev);
extern void device_del(struct device * dev);
extern int device_for_each_child(struct device *, void *,
extern int device_for_each_child(struct device *, void *,
		     int (*fn)(struct device *, void *));
		     int (*fn)(struct device *, void *));
extern int device_rename(struct device *dev, char *new_name);


/*
/*
 * Manual binding of a device to driver. See drivers/base/bus.c
 * Manual binding of a device to driver. See drivers/base/bus.c