You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
kobject: Fix kobject_rename and !CONFIG_SYSFS
When looking at kobject_rename I found two bugs with that exist when sysfs support is disabled in the kernel. kobject_rename does not change the name on the kobject when sysfs support is not compiled in. kobject_rename without locking attempts to check the validity of a rename operation, which the kobject layer simply does not have the infrastructure to do. This patch documents the previously unstated requirement of kobject_rename that is the responsibility of the caller to provide mutual exclusion and to be certain that the new_name for the kobject is valid. This patch modifies sysfs_rename_dir in !CONFIG_SYSFS case to call kobject_set_name to actually change the kobject_name. This patch removes the bogus and misleading check in kobject_rename that attempts to see if a rename is valid. The check is bogus because we do not have the proper locking. The check is misleading because it looks like we can and do perform checking at the kobject level that we don't. Signed-off-by: Eric W. Biederman <ebiederm@xmission.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
8c0e3998f5
commit
030c1d2bfc
+5
-13
@@ -387,6 +387,11 @@ EXPORT_SYMBOL_GPL(kobject_init_and_add);
|
||||
* kobject_rename - change the name of an object
|
||||
* @kobj: object in question.
|
||||
* @new_name: object's new name
|
||||
*
|
||||
* It is the responsibility of the caller to provide mutual
|
||||
* exclusion between two different calls of kobject_rename
|
||||
* on the same kobject and to ensure that new_name is valid and
|
||||
* won't conflict with other kobjects.
|
||||
*/
|
||||
int kobject_rename(struct kobject *kobj, const char *new_name)
|
||||
{
|
||||
@@ -401,19 +406,6 @@ int kobject_rename(struct kobject *kobj, const char *new_name)
|
||||
if (!kobj->parent)
|
||||
return -EINVAL;
|
||||
|
||||
/* see if this name is already in use */
|
||||
if (kobj->kset) {
|
||||
struct kobject *temp_kobj;
|
||||
temp_kobj = kset_find_obj(kobj->kset, new_name);
|
||||
if (temp_kobj) {
|
||||
printk(KERN_WARNING "kobject '%s' cannot be renamed "
|
||||
"to '%s' as '%s' is already in existence.\n",
|
||||
kobject_name(kobj), new_name, new_name);
|
||||
kobject_put(temp_kobj);
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
devpath = kobject_get_path(kobj, GFP_KERNEL);
|
||||
if (!devpath) {
|
||||
error = -ENOMEM;
|
||||
|
||||
Reference in New Issue
Block a user