diff options
| author | Cornelia Huck <cornelia.huck@de.ibm.com> | 2006-11-20 17:07:51 +0100 | 
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@suse.de> | 2006-12-01 14:52:01 -0800 | 
| commit | 8a82472f86bf693b8e91ed56c9ca4f62fbbdcfa3 (patch) | |
| tree | 79d148ee548f4b57e6f5a4a69cf6cdb81e7a1bf2 /lib/kobject.c | |
| parent | af9e0765362151b27372c14d9d6dc417184182d3 (diff) | |
| download | olio-linux-3.10-8a82472f86bf693b8e91ed56c9ca4f62fbbdcfa3.tar.xz olio-linux-3.10-8a82472f86bf693b8e91ed56c9ca4f62fbbdcfa3.zip  | |
driver core: Introduce device_move(): move a device to a new parent.
Provide a function device_move() to move a device to a new parent device. Add
auxilliary functions kobject_move() and sysfs_move_dir().
kobject_move() generates a new uevent of type KOBJ_MOVE, containing the
previous path (DEVPATH_OLD) in addition to the usual values. For this, a new
interface kobject_uevent_env() is created that allows to add further
environmental data to the uevent at the kobject layer.
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Acked-by: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'lib/kobject.c')
| -rw-r--r-- | lib/kobject.c | 50 | 
1 files changed, 50 insertions, 0 deletions
diff --git a/lib/kobject.c b/lib/kobject.c index 7dd5c0e9d99..744a4b102c7 100644 --- a/lib/kobject.c +++ b/lib/kobject.c @@ -311,6 +311,56 @@ int kobject_rename(struct kobject * kobj, const char *new_name)  }  /** + *	kobject_move - move object to another parent + *	@kobj:	object in question. + *	@new_parent: object's new parent + */ + +int kobject_move(struct kobject *kobj, struct kobject *new_parent) +{ +	int error; +	struct kobject *old_parent; +	const char *devpath = NULL; +	char *devpath_string = NULL; +	char *envp[2]; + +	kobj = kobject_get(kobj); +	if (!kobj) +		return -EINVAL; +	new_parent = kobject_get(new_parent); +	if (!new_parent) { +		error = -EINVAL; +		goto out; +	} +	/* old object path */ +	devpath = kobject_get_path(kobj, GFP_KERNEL); +	if (!devpath) { +		error = -ENOMEM; +		goto out; +	} +	devpath_string = kmalloc(strlen(devpath) + 15, GFP_KERNEL); +	if (!devpath_string) { +		error = -ENOMEM; +		goto out; +	} +	sprintf(devpath_string, "DEVPATH_OLD=%s", devpath); +	envp[0] = devpath_string; +	envp[1] = NULL; +	error = sysfs_move_dir(kobj, new_parent); +	if (error) +		goto out; +	old_parent = kobj->parent; +	kobj->parent = new_parent; +	kobject_put(old_parent); +	kobject_uevent_env(kobj, KOBJ_MOVE, envp); +out: +	kobject_put(kobj); +	kfree(devpath_string); +	kfree(devpath); +	return error; +} + +/**   *	kobject_del - unlink kobject from hierarchy.   * 	@kobj:	object.   */  |