> int sysfs_rename_dir(struct kobject * kobj, const char *new_name) > { > - struct sysfs_dirent *sd; > + struct sysfs_dirent *sd = kobj->sd; > struct dentry *parent = NULL; > struct dentry *old_dentry = NULL, *new_dentry = NULL; > const char *dup_name = NULL; > @@ -863,42 +863,41 @@ int sysfs_rename_dir(struct kobject * kobj, const char *new_name) > > mutex_lock(&sysfs_rename_mutex); > > + error = 0; > + if (strcmp(sd->s_name, new_name) == 0) > + goto out; /* nothing to rename */ > + > /* get the original dentry */ > old_dentry = sysfs_get_dentry(sd); > if (IS_ERR(old_dentry)) { > error = PTR_ERR(old_dentry); > + goto out; > } > > parent = old_dentry->d_parent; > > /* lock parent and get dentry for new name */ > mutex_lock(&parent->d_inode->i_mutex); > + mutex_lock(&sysfs_mutex); > > + error = -EEXIST; > + if (sysfs_find_dirent(sd->s_parent, new_name)) > goto out_unlock; > > + error = -ENOMEM; > + new_dentry = d_alloc_name(parent, new_name); > + if (!new_dentry) > goto out_unlock; > > /* rename kobject and sysfs_dirent */ > error = -ENOMEM; > new_name = dup_name = kstrdup(new_name, GFP_KERNEL); > if (!new_name) > + goto out_unlock; > > error = kobject_set_name(kobj, "%s", new_name); > if (error) > + goto out_unlock; > > mutex_lock(&sysfs_mutex); sysfs_mutex is being grabbed twice and unlocked twice later. -- tejun _______________________________________________ Containers mailing list Containers@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linux-foundation.org/mailman/listinfo/containers